目前我正在解决一个工程问题,并希望与SO社区展开对话。
我想实现一个任务调度程序。我有两个独立的nodeJS应用程序实例,位于弹性负载均衡器(ELB)后面。问题是当两个实例出现时,它们试图执行相同的任务逻辑,导致任务运行多次。
我目前的解决方案是使用node-schedule来安排任务的运行,然后让它们引用数据库来检查任务是否已经运行,因为它指定了运行时间间隔。
这里的逻辑有点混乱,我想知道是否有一种更优雅的方法可以做到这一点。
也许可以在特定的实例上设置一个特定的env变量,这样只有该实例才能运行任务。
你们觉得怎么样?
您所描述的似乎是AWS简单队列服务用例的完美示例。
https://aws.amazon.com/sqs/details/解决方案中需要注意的要点:
- 确保选择一个反映工作负载的可见性超时(因此消息不会在另一个worker仍在处理时重新进入队列)
- 不要在消息中存储工作负载,引用它!消息的大小最多只能为256kb,消息的大小会影响性能和成本。
- 确保您了解计费!由于计费是按64KB块计费的,这意味着1个220KB的消息按4个64KB块/请求计费。
- 如果你让你的消息小,你可以节省更多的钱通过做批量请求,因为你的bang for buck将是更大的!
- 使用长轮询来检索消息,以便从消息请求中获得最大价值。
- 通过使用EC2 IAM Role向SQS授予应用程序权限,因为这是最佳安全实践和AWS推荐的方法。
这是一项很好的服务,应该能很好地解决你目前的需求。
谢谢!
Xavier .