使用AWS ECS创建可伸缩且容错的系统

问题描述 投票:0回答:1

我们正在设计将在AWS ECS实例上运行的C#计划任务(每隔几小时运行一次),该实例将从端点获取数千个客户的批量交易数据,修改数据然后将其发送到另一个Web服务。我们将在一个单独的数据库中维护最后一个成功批处理的状态(使用某些类似创建的事务日期)。我们需要系统可扩展,以便在添加更多客户时添加额外的ECS容器来处理数据。我们正在考虑的选择:

  1. 每个容器仅处理数据的特定子集。随着更多客户的添加,添加了更多包含。我们需要保持逻辑分离包含正在处理客户数据的内容。
  2. 所有容器都处理所有客户。我们在数据库上使用某种锁定标志,让其他进程知道正在处理客户数据。
  3. 其他一些方法。

我认为选项2可能是最好的,但它增加了很多关于锁定和解锁客户的复杂性。如果是正确的解决方案,我是否可以指出具体的设计模式?

concurrency architecture locking amazon-ecs
1个回答
1
投票

在这两种情况下,要考虑的重要事项是在特定客户的处理失败的情况下重试。通过重试在大量容器中分配作业的一种可能方法是使用AWS SQS。

每隔几个小时就会定期运行一个容器并成为作业生成器。它将为每个需要处理的客户创建一个SQS排队项。为了响应队列中出现的项目,ECS将旋转许多“工作”容器以使用队列中的项目。这可以相对于队列中的项目数进行自动调整,以快速启动可以并行工作的许多容器。

每个容器都会使用自己的高性能并发轮询器(https://www.npmjs.com/package/squiss)来开始从队列中抓取项目并处理它们。如果工作人员因错误而失败或崩溃,那么SQS将自动重新启动并丢弃工作人员在超时后工作的其他工作人员排队的项目。

这种方法可以为您提供极大的灵活性,并允许您横向扩展工作者数量,同时让任何工作者处理其抓取的队列中的任何作业。它还可以确保每个排队的项目至少处理一次,并且在发生崩溃或出错的情况下不会永远丢弃。

© www.soinside.com 2019 - 2024. All rights reserved.