首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >当从单个服务器扩展到弹性计算(许多并发服务器)时,时间任务是如何扩展的?

当从单个服务器扩展到弹性计算(许多并发服务器)时,时间任务是如何扩展的?
EN

Software Engineering用户
提问于 2021-09-13 01:16:06
回答 3查看 213关注 0票数 0

我们一直在扩大我公司的基础设施,我们已经从单一的服务器升级到可伸缩的自动扩展的AWS Ec2服务器,但是有一个小项目没有很好的扩展。

以前,服务器操作系统启动了一个脚本,该脚本通过cron任务(ubuntu )发送电子邮件,不幸的是,由于有多个并发服务器,这些cron任务同时启动,而不是发送1封电子邮件,它们现在发送的2+电子邮件取决于给定时刻运行的服务器数量。

最初,我尝试使用我们的一个数据库创建一些东西,以检查任务在允许任务运行前5分钟内是否运行过,但是如果它们在完全相同的时间启动和访问数据库而没有延迟,那么它们都将继续运行。情况似乎是这样的,因为多封电子邮件仍在发送。我还没有找到一个好的解决方案,有什么想法,我可以做的规模以外的任务运行,把这个任务转移到一个无服务器的东西?

对不起,让我进一步解释一下这个应用程序每周都在做什么(不是电子邮件服务器)--我公司的一群人将收到他们的进度报告,应用程序生成一份报告并将其保存到数据库,然后通过电子邮件将链接发送给用户。因为这些都是由命令行脚本使用cron生成的,所以在早上6点,计算机运行命令行脚本,生成所有40+报告,并向每个用户发送一个链接。因为现在有多个并发服务器,每个服务器同时运行相同的脚本--生成一个独立的报告,并将链接发送给用户。从用户的角度来看,他们收到了两封数据相同的电子邮件。

EN

回答 3

Software Engineering用户

发布于 2021-10-14 14:12:36

工作共享是一个众所周知的问题。有两个主要挑战(更多的挑战取决于您选择的解决方案):

  • 确保处理只发生一次(即只有一个实例同时处理报告)
  • 确保该处理的输出只发生一次(即只在最后生成一封电子邮件)

一个常见的解决方案是让一个进程将工作推送到一个队列上,多个进程完成下一个工作请求并处理它。如果订单不重要,这是分配负载和确保只处理一次的有效方法。有一些错误条件您必须处理:

  • 使用死信队列处理错误条件,以便重新处理丢失的报告。
  • 这项工作可以为每一份报告分别生成电子邮件。

您可以通过拥有另一个队列和一个进程来对电子邮件进行批次,删除那些报告结果消息并合并列表。电子邮件将按计划生成,所有该电子邮件地址的报告都将包含在邮件正文中。

票数 1
EN

Software Engineering用户

发布于 2021-09-13 19:02:39

我想我要做的是查询AWS,以确定有多少重复的服务器同时运行,找出如何对它们进行计数,并且只有当该框是服务器#1时才允许脚本执行

票数 0
EN

Software Engineering用户

发布于 2021-11-13 15:35:50

一个有点规范的AWS回答是使用CloudWatch事件来调度SQS消息。这种组合为您处理了大多数分布式系统关注点。您可以编写熟悉的cron表达式,以便按计划将消息拖放到SQS队列中。您的实例每个都试图在某些韵律中将消息从队列中弹出。第一个看到消息的实例将处理它。其余的服务器将继续幸灾乐祸地不知道队列中有一个事件。无论服务器/订阅服务器计数如何,这一切都可以工作。

https://docs.aws.amazon.com/AmazonCloudWatch/latest/events/ScheduledEvents.html

我不熟悉文档中提到的EventBridge。但是,在这个用例中,这听起来只是CW事件的一个替代方案。

票数 0
EN
页面原文内容由Software Engineering提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://softwareengineering.stackexchange.com/questions/431834

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档