【问题标题】:.Net Core Hosted Services in a Load Balanced Environment负载平衡环境中的 .Net Core 托管服务
【发布时间】: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) 来解决负载均衡器问题。谢谢。

标签: asp.net-core amazon-elastic-beanstalk amazon-elb aws-load-balancer asp.net-core-hosted-services


【解决方案1】:

我面临着同样的情况,并正在考虑一种方法来实现一个自定义服务架构,该架构可以在所有实例上正常运行,但要利用 pub/sub 代理和分布式内存服务,这样这些小型服务就会相互联系并协调要做什么。开发是复杂的,但 IMO 是一个非常强大的解决方案。

【讨论】:

    【解决方案2】:

    您将“必须”使用分布式“锁定”系统。例如,您必须使用分布式内存缓存,当有人(集群的一个节点)在后台工作时,它会加锁。如果另一个节点试图做同样的工作,如果工作还没有完成,他将被第一个锁锁定。 我的意思是,如果您的所有节点都没有“同步处理程序”,您将无法处理这种情况。可能是 SQL 应用锁、分布式内存缓存或其他东西..

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-04-28
      • 2015-08-02
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 2020-10-29
      • 1970-01-01
      相关资源
      最近更新 更多