【问题标题】:How should Amazon SQS be used? Import / Process Scenario应该如何使用 Amazon SQS?导入/处理场景
【发布时间】: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 可能是将消息添加到队列的可靠方式。那么就不需要了吗?
  • 啊,这样可以避免轮询。当然取决于用例,但也许长轮询就足够了。但是,这里使用 SNS 的全部意义是不同的:您不必不断地轮询队列。相反,SNS 做了两件事 - 将消息放入队列通知服务器 B 它应该检查队列。否则你不需要 SNS。
  • @adamw 所以我可以跳过 SNS,只需使用长轮询的 SQS 并通过 SQS 直接向队列添加消息,而不是 SNS?

标签: python amazon-web-services amazon-sqs amazon-sns


【解决方案1】:

对于亚马逊提供 SQS 服务,我感到非常抱歉。这不是一个“简单的队列”,在你的情况下可能不是最好的选择。具体来说:

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

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

【讨论】:

  • 这当然不是我使用 SQS 的经验。我获得了出色的性能,并且有了最新的更新,投票也很容易。
  • 也不是我的经验。我们在几个项目中使用 SQS,没有任何问题。
  • 或许最新的更新提升了性能,不错。但是乱序消息和重复消息呢?这些是 SQS 设计的一部分,我认为这永远不会改变。
  • @Jeff,是的,这是真的,这是设计使然,“这是一个功能,而不是错误”。取决于您在应用中需要什么;)
【解决方案2】:

您所布置的内容理论上可行,但我不再将消息直接放入队列,而是将这些消息放入 SNS 主题,然后将队列订阅到主题以获取它们 - 为您提供更多无需每次接触代码或生产中的服务器,就可以灵活地进行更改。

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

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

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

    • 感谢您的回复。所以我应该为每个服务器创建一个 SNS 主题。例如,ServerA 将有其唯一的主题“ServerA”,然后此 SNS 系统可用于创建可以运行任务的 SQS 队列?
    • 是的,我的想法是如何为消息路由制作消息代理。您不能使用 SNS - 它只是附加层,它可以帮助您,例如,替换 SQS 以调用 REST API 或添加 Web 挂钩,这将对您的应用程序进行回调。
    猜你喜欢
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-28
    • 2018-07-15
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多