在负载均衡环境中的.Net Core托管服务

4
我们正在使用 .Net Core 开发 Web API,并使用 Hosted Services 执行后台任务。
系统已在 AWS Beanstalk 环境中使用负载均衡器进行托管。因此,根据负载情况,Beanstalk 会创建/删除系统的新实例。
我们的问题是, 由于后台服务也在 API 内部运行,当负载均衡器增加实例时,后台服务的数量也会增加,并且可能会多次执行同一任务。理想情况下,后台服务应该只有一个实例。
解决这个问题的一种方法是,在负载平衡环境中停止执行后台服务,并为仅用于后台服务的专用非负载平衡单实例环境提供支持。
这是一种不太美观的解决方案。因此,
1)有更好的解决方案吗?
2)是否有一种方法可以在负载平衡环境中标识主要实例?如果有,我可以有条件地注册 Hosted services。
非常感谢您的帮助。
谢谢

我也遇到了同样的问题。你有找到更多关于这个问题的信息吗? - Ryan Buening
不完全是。目前我所做的是,在负载均衡环境中禁用执行后台服务,并为后台服务创建另一个单实例环境。我使用应用程序设置变量来有条件地注册托管服务。我知道这是一个丑陋的解决方案,但到目前为止它还可以工作。在这种情况下,使用AWS Lambdas进行后台服务会更好。(您是否在AWS上托管?) - Wijitha
我的ASP.NET Core应用程序托管在IIS上。我认为我们将研究使用Hangfire(https://www.hangfire.io/)来解决负载均衡器问题。谢谢。 - Ryan Buening
3个回答

0
你需要使用分布式锁系统。例如,你可以使用一个分布式内存缓存,在某人(集群节点)在后台工作时放置锁定。如果另一个节点试图执行相同的任务,则在未完成工作之前,该工作将被第一个锁定。如果所有节点都没有“同步处理程序”,那么无法处理此类情况。可以是SQL应用程序锁、分布式内存缓存或其他。

0

我面临着相同的情况,正在考虑实现一种自定义服务架构,可以在所有实例上正常运行,但利用发布/订阅代理和分布式内存服务,使这些小型服务彼此联系并协调完成任务。开发过程复杂,但在我看来是非常强大的解决方案。


0

有一个叫做Mutex的东西,但即使在多实例环境下也无法控制它。然而,有一些方法可以在一定程度上控制它(甚至可能达到100%)。其中一种方法是在数据库中保留跟踪器。例如,如果工作需要每天运行,在后台服务中启动任务之前,您可能想要查询数据库,以查看今天是否有任何条目,如果没有,则插入一个条目并开始工作。


目前你的回答不够清晰。请编辑并添加更多细节,以帮助其他人理解它如何回答所提出的问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接