2

我想协调告诉服务器 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 还是我完全忽略了这一点?

4

3 回答 3

3

亚马逊提供 SQS 作为服务,我几乎感到抱歉。它不是“简单队列”,在您的情况下可能不是最佳选择。具体来说:

  • 它在低容量消息传递中表现不佳(某些消息需要 90 秒才能到达)
  • 不保留消息顺序
  • 它喜欢多次传递信息
  • 他们向你收取投票费用

好消息是它可以很好地扩展。但是你猜怎么着,你没有规模问题,所以处理 SQS 的古怪行为只会让你无缘无故地感到痛苦。我强烈建议您查看 RabbitMQ,它的行为与您想要一个简单队列的行为完全一样。

于 2013-03-13T16:50:19.693 回答
1

好吧... SQS 不支持消息路由,以便将消息分配给服务器 A 或 B,这就是为什么可用的解决方案之一:创建 SNS 主题“服务器 a”和“服务器 b”。这些主题应该将消息发送到 SQS,您的应用程序将拉取这些消息。还可以实现网络挂钩 - SNS 事件的订阅者,它将分析消息并对您的应用程序进行回调。

于 2013-03-13T21:42:54.600 回答
1

您布置的内容在理论上可行,但我不再将消息直接放入队列,而是将这些消息放入 SNS 主题,然后将队列订阅到主题以将它们带到那里 - 为您提供更大的更改灵活性无需每次接触代码或生产中的服务器即可完成后续工作。

对于您现在正在做的事情,SNS 部分是不必要的,但使用将允许您更改功能而无需触及您现有的服务器。

例如:需要更改,并且您想要添加一个进程 C,该进程 C 每次在服务器 B 上运行“启动进程”时也会启动。通过 AWS SNS 控制台,您可以将消息的第二个副本定向到之前执行的另一个队列不存在,并设置一个从该队列轮询的服务器 C(扇出模式)。

此外,我在初始推出期间经常喜欢做的是向 SNS 添加通知,这样我就知道发生了什么,即每次发生“启动进程”事件时,我都会在我的手机(或电子邮件地址)上订阅该主题,这样我就知道了通知 - 我可以实时监控正在(或没有)发生的事情。在生产部署后经过一段时间后,我可以进入 AWS 控制台并简单地从该过程中取消订阅我的电子邮件/单元格 - 无需每次接触任何服务器或代码。

于 2013-04-08T12:41:19.380 回答