Concurrency 使用AWS ECS创建可扩展的容错系统

Concurrency 使用AWS ECS创建可扩展的容错系统,concurrency,architecture,locking,amazon-ecs,Concurrency,Architecture,Locking,Amazon Ecs,我们正在设计C#计划任务(每隔几个小时运行一次),该任务将在AWS ECS实例上运行,该实例将从一个端点获取数千名客户的批量事务数据,修改数据,然后将其发送到另一个web服务。我们将在一个单独的数据库中维护最后一个成功批处理的状态(使用一些类似事务的创建日期)。我们需要系统具有可扩展性,以便随着更多客户的增加,我们会添加额外的ECS容器来处理数据。 我们正在考虑以下几种选择: 每个容器只处理特定的数据子集。随着越来越多的客户加入,也会加入更多的内容。我们需要在处理客户数据时保持逻辑上的分离 所有

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

  • 每个容器只处理特定的数据子集。随着越来越多的客户加入,也会加入更多的内容。我们需要在处理客户数据时保持逻辑上的分离
  • 所有容器处理所有客户。我们在数据库上使用某种锁定标志,让其他进程知道正在处理客户数据
  • 其他一些方法

  • 我认为选项2可能是最好的,但它在锁定和解锁客户方面增加了很多复杂性。如果在两种情况下,如果正确的解决方案?

    < P>有一个特定的设计模式,那么在一个特定客户的处理失败的情况下,重要的事情就是重试。通过重试将作业分布到大量容器的一种潜在方法是使用AWS SQS

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

    每个容器将使用自己的类似于()的高性能并发轮询器从队列中抓取项目并对其进行处理。如果某个工作人员由于错误而失败或崩溃,那么SQS将自动重新传递并在超时后将该工作人员一直在处理的队列项目丢弃给另一个工作人员


    这种方法将为您提供很大的灵活性,并允许您横向扩展工作人员的数量,同时允许任何工作人员处理它所获取的队列中的任何工作。它还确保每一个排队的项目至少被处理一次,并且在发生崩溃或出错的情况下,没有一个被永远丢弃。

    在这两种情况下,一个重要的事情是在特定客户的处理失败时重试。通过重试将作业分布到大量容器的一种潜在方法是使用AWS SQS

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

    每个容器将使用自己的类似于()的高性能并发轮询器从队列中抓取项目并对其进行处理。如果某个工作人员由于错误而失败或崩溃,那么SQS将自动重新传递并在超时后将该工作人员一直在处理的队列项目丢弃给另一个工作人员

    这种方法将为您提供很大的灵活性,并允许您横向扩展工作人员的数量,同时允许任何工作人员处理它所获取的队列中的任何工作。它还将确保每个排队的项目至少被处理一次,并且在发生崩溃或错误时不会永久删除任何项目