【发布时间】:2013-03-13 09:15:18
【问题描述】:
我想协调告诉服务器 B 从服务器 A 启动一个进程,然后当它完成后,在服务器 A 上运行一个导入脚本。我很难弄清楚我应该如何正确使用 SQS在这种情况下。
服务器 A:主专用服务器 服务器 B:云进程服务器
- 服务器 A 通过 SNS 向 SQS 发送消息说“开始进程”
- 服务器 B 不断轮询 SQS 以获取“启动进程”消息
- 服务器 B 在 SQS 上发现“启动进程”消息
- 服务器 B 运行“process.sh”文件
- 服务器 B 完成运行“process.sh”文件
- 服务器 B 从 SQS 中删除“启动进程”
- 服务器 B 通过 SNS 向 SQS 发送消息说“开始导入”
- 服务器 A 轮询不断轮询 SQS 以获取“开始导入”消息
- 服务器 A 在 SQS 上发现“开始导入”消息
- 服务器 A 运行 import.sh
- 服务器 A 完成运行“import.sh”
- 服务器 A 从 SQS 中删除“开始导入”
这是应该如何使用 SQS 还是我完全忽略了这一点?
【问题讨论】:
-
这里为什么需要 SNS?此外,“持续轮询”最近变得更好,因为您可以使用长轮询,即如果队列中没有消息,则指定 SQS 服务器应等待最多 20 秒。这样,如果没有消息,您只需每 20 秒发出一个请求。
-
@adamw 我认为 SNS 可能是将消息添加到队列的可靠方式。那么就不需要了吗?
-
@adamw 像这样:forecastcloudy.net/2011/07/12/…
-
啊,这样可以避免轮询。当然取决于用例,但也许长轮询就足够了。但是,这里使用 SNS 的全部意义是不同的:您不必不断地轮询队列。相反,SNS 做了两件事 - 将消息放入队列和通知服务器 B 它应该检查队列。否则你不需要 SNS。
-
@adamw 所以我可以跳过 SNS,只需使用长轮询的 SQS 并通过 SQS 直接向队列添加消息,而不是 SNS?
标签: python amazon-web-services amazon-sqs amazon-sns