我们正在设计C#计划任务(每隔几个小时运行一次),该任务将在AWS ECS实例上运行,该实例将从端点获取成千上万个客户的批量交易数据,修改数据然后将其发送到另一个Web服务。我们将在一个单独的数据库中维护上次成功批处理的状态(使用某些类似事务的创建日期)。我们需要系统具有可伸缩性,以便随着更多客户的加入,我们添加其他ECS容器来处理数据。 我们正在考虑以下选项:
我认为选项2可能是最好的,但是它在锁定和解锁客户方面增加了很多复杂性。如果能找到正确的解决方案,是否有针对性的设计模式?
答案 0 :(得分:1)
在两种情况下,要考虑的重要一件事是重试,以防对特定客户的处理失败。可以通过重试在众多容器中分配作业的一种潜在方法是使用AWS SQS。
一个容器将每隔几个小时定期运行,并成为作业生成器。它将为每个需要处理的客户创建一个SQS排队项目。响应于项目出现在队列中,ECS会启动多个“工作人员”容器以消耗队列中的项目。可以相对于队列中的项目数自动缩放,以快速启动许多可以并行工作的容器。
每个容器都将使用类似于(https://www.npmjs.com/package/squiss)的自己的高性能并发轮询器来开始从队列中获取项目并进行处理。如果某个工作人员由于错误而失败或崩溃,那么SQS将在其超时后自动将该工作人员一直在处理的排队项目重新交付并丢弃到另一工作人员。
这种方法将为您提供极大的灵活性,并使您可以水平扩展工作人员的数量,同时让任何工作人员都可以处理其所抓取的队列中的任何作业。它还将确保每个排队的项目至少被处理一次,并且万一发生崩溃或出错,不会永远丢弃任何东西。