使用 AWS ECS 创建可扩展的容错系统
Creating a scalable and fault tolerant system using AWS ECS
我们正在设计 C# 计划任务(运行 每隔几个小时),它将 运行 在 AWS ECS 实例上从一个端点获取成千上万客户的批量交易数据,修改数据然后将其发送到另一个网络服务。我们将在单独的数据库中维护最后一个成功批次的状态(使用一些类似交易的创建日期)。我们需要系统具有可扩展性,以便在添加更多客户时添加额外的 ECS 容器来处理数据。
我们正在考虑以下选项:
- 每个容器只处理特定的数据子集。随着更多的客户被添加,更多的包含被添加。我们需要对包含的内容和正在处理的客户数据保持逻辑分离。
- 所有容器处理所有客户。我们在数据库上使用某种锁定标志让其他进程知道正在处理客户数据。
- 一些其他方法。
我认为选项 2 可能是最好的,但它在锁定和解锁客户方面增加了很多复杂性。如果是正确的解决方案,是否可以指出具体的设计模式?
在这两种情况下,需要考虑的一个重要事项是重试,以防特定客户的处理失败。通过重试在大量容器中分配作业的一种潜在方法是使用 AWS SQS。
单个容器会每隔几个小时定期 运行 并成为作业生成器。它将为每个需要处理的客户创建一个 SQS 排队项目。为了响应队列中出现的项目,ECS 将启动许多 "worker" 容器以使用队列中的项目。这可以相对于队列中的项目数量自动缩放,以快速启动许多可以并行工作的容器。
每个容器都将使用自己的高性能并发轮询器,类似于此 (https://www.npmjs.com/package/squiss) 开始从队列中抓取项目并处理它们。如果工作人员因错误而失败或崩溃,则 SQS 将在超时后自动将工作人员一直在处理的排队项目重新交付并丢弃给其他工作人员。
这种方法会给你很大的灵活性,并且可以让你横向扩展工作人员的数量,同时让任何工作人员处理它所抓取的队列中的任何作业。它还将确保每个排队的项目至少被处理一次,并且 none 永远被丢弃,以防出现崩溃或出错。
我们正在设计 C# 计划任务(运行 每隔几个小时),它将 运行 在 AWS ECS 实例上从一个端点获取成千上万客户的批量交易数据,修改数据然后将其发送到另一个网络服务。我们将在单独的数据库中维护最后一个成功批次的状态(使用一些类似交易的创建日期)。我们需要系统具有可扩展性,以便在添加更多客户时添加额外的 ECS 容器来处理数据。 我们正在考虑以下选项:
- 每个容器只处理特定的数据子集。随着更多的客户被添加,更多的包含被添加。我们需要对包含的内容和正在处理的客户数据保持逻辑分离。
- 所有容器处理所有客户。我们在数据库上使用某种锁定标志让其他进程知道正在处理客户数据。
- 一些其他方法。
我认为选项 2 可能是最好的,但它在锁定和解锁客户方面增加了很多复杂性。如果是正确的解决方案,是否可以指出具体的设计模式?
在这两种情况下,需要考虑的一个重要事项是重试,以防特定客户的处理失败。通过重试在大量容器中分配作业的一种潜在方法是使用 AWS SQS。
单个容器会每隔几个小时定期 运行 并成为作业生成器。它将为每个需要处理的客户创建一个 SQS 排队项目。为了响应队列中出现的项目,ECS 将启动许多 "worker" 容器以使用队列中的项目。这可以相对于队列中的项目数量自动缩放,以快速启动许多可以并行工作的容器。
每个容器都将使用自己的高性能并发轮询器,类似于此 (https://www.npmjs.com/package/squiss) 开始从队列中抓取项目并处理它们。如果工作人员因错误而失败或崩溃,则 SQS 将在超时后自动将工作人员一直在处理的排队项目重新交付并丢弃给其他工作人员。
这种方法会给你很大的灵活性,并且可以让你横向扩展工作人员的数量,同时让任何工作人员处理它所抓取的队列中的任何作业。它还将确保每个排队的项目至少被处理一次,并且 none 永远被丢弃,以防出现崩溃或出错。