3

我们正在使用 .Net Core 开发 Web API。为了执行后台任务,我们使用了托管服务。

系统已使用负载均衡器托管在 AWS Beantalk 环境中。因此,基于负载 Beanstalk 创建/删除系统的新实例。

我们的问题是,由于后台服务也在 API 内部运行,当负载均衡器增加实例时,后台服务的数量也会增加,并且有可能多次执行相同的任务。理想情况下,应该只有一个后台服务实例。

解决此问题的一种方法是在负载平衡环境中停止执行后台服务,并为后台服务提供专用的非负载平衡单实例环境。

这是一个有点丑陋的解决方案。所以,

1)有没有更好的解决方案?

2) 有没有办法在负载平衡环境中识别主实例?如果是这样,我可以有条件地注册托管服务。

非常感谢任何帮助。

谢谢

4

2 回答 2

0

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

于 2021-08-09T12:37:50.310 回答
0

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

于 2020-09-05T07:44:19.027 回答