负载平衡环境中的 .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 连接

跨负载平衡服务器的选择性缓存清除 (ASP.Net)

Log4Net - 用于 Windows 负载平衡的日志服务器 IP

AWS负载均衡器后面的ASP.NET Core 2.1 HTTPS重定向?

.net core grpc consul 实现服务注册 服务发现 负载均衡