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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用AWS ECS创建可伸缩且容错的系统相关的知识,希望对你有一定的参考价值。

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

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

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

答案

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

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

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

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

以上是关于使用AWS ECS创建可伸缩且容错的系统的主要内容,如果未能解决你的问题,请参考以下文章

ECS 弹性伸缩:缩容

如何使用 SDK 为 ecs 服务的弹性伸缩策略设置最小和最大任务?

如何构建一个高效且可伸缩的缓存

使用预留实例和自动伸缩组

可伸缩系统架构探讨

text 我们使用它来创建维持比率的可伸缩元素(通常是图像/背景图像)。