负载平衡环境中的 .Net Core 托管服务
Posted
技术标签:
【中文标题】负载平衡环境中的 .Net Core 托管服务【英文标题】:.Net Core Hosted Services in a Load Balanced Environment 【发布时间】:2020-02-07 10:29:22 【问题描述】:我们正在使用 .Net Core 开发 Web API。为了执行后台任务,我们使用了托管服务。
系统已通过负载均衡器托管在 AWS Beantalk 环境中。因此,Beanstalk 会根据负载创建/删除系统的新实例。
我们的问题是, 由于后台服务也在 API 内部运行,当负载均衡器增加实例时,后台服务的数量也会增加,并且有可能多次执行相同的任务。理想情况下,应该只有一个后台服务实例。
解决此问题的一种方法是在负载平衡环境中停止执行后台服务,并为后台服务提供专用的非负载平衡单实例环境。
这是一个有点丑陋的解决方案。所以,
1) 有没有更好的解决方案?
2) 有没有办法在负载平衡环境中识别主实例?如果是这样,我可以有条件地注册托管服务。
非常感谢任何帮助。
谢谢
【问题讨论】:
我遇到了同样的问题。你找到更多关于这方面的信息了吗? 并非如此。目前我所做的是,在负载平衡的环境中禁用执行后台服务,并为后台服务设置另一个单实例环境。我使用 app-settings 变量有条件地注册托管服务。我知道这是一个丑陋的解决方案,但到目前为止它工作正常。在这种情况下,将 AWS Lambdas 用于后台服务会更好。 (您在 AWS 上托管吗?) 我的 ASP.NET Core 应用托管在 IIS 上。我想我们将研究使用 Hangfire (hangfire.io) 来解决负载均衡器问题。谢谢。 【参考方案1】:我面临着同样的情况,并正在考虑一种方法来实现一个自定义服务架构,该架构可以在所有实例上正常运行,但要利用 pub/sub 代理和分布式内存服务,这样这些小型服务就会相互联系并协调要做什么。开发是复杂的,但 IMO 是一个非常强大的解决方案。
【讨论】:
【参考方案2】:您将“必须”使用分布式“锁定”系统。例如,您必须使用分布式内存缓存,当有人(集群的一个节点)在后台工作时,它会加锁。如果另一个节点试图做同样的工作,如果工作还没有完成,他将被第一个锁锁定。 我的意思是,如果您的所有节点都没有“同步处理程序”,您将无法处理这种情况。可能是 SQL 应用锁、分布式内存缓存或其他东西..
【讨论】:
以上是关于负载平衡环境中的 .Net Core 托管服务的主要内容,如果未能解决你的问题,请参考以下文章
AFNetworking:负载平衡/服务器托管/重定向的奇怪处理
Google Cloud 中的负载平衡 websocket 连接
Log4Net - 用于 Windows 负载平衡的日志服务器 IP