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