Python Amazon SQS应该如何使用?导入/处理场景

Python Amazon SQS应该如何使用?导入/处理场景,python,amazon-web-services,amazon-sqs,amazon-sns,Python,Amazon Web Services,Amazon Sqs,Amazon Sns,我想协调告诉服务器B从服务器a启动一个进程,然后在完成后,在服务器a上运行一个导入脚本。我很难确定在这种情况下应该如何正确使用SQS 服务器A:主专用服务器 服务器B:云进程服务器 服务器A通过SNS向SQS发送消息说“启动流程” 服务器B不断轮询SQS以获取“启动进程”消息 服务器B在SQS上找到“启动进程”消息 服务器B运行“process.sh”文件 服务器B完成运行“process.sh”文件 服务器B从SQS中删除“启动流程” 服务器B通过SNS向SQS发送消息说“开始导入” 服务器

我想协调告诉服务器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的使用方式,还是我完全没有抓住要点?

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

  • 它在低容量消息传递方面的性能非常差(有些消息需要90秒才能到达)
  • 不保留消息顺序
  • 它喜欢不止一次地传递信息
  • 他们向你收取投票费

好消息是它的伸缩性很好。但是你猜怎么着,你没有规模问题,所以处理SQS的古怪行为只会让你无缘无故地痛苦。我强烈建议您查看RabbitMQ,它的行为将完全像您希望一个简单队列的行为一样。

好吧。。。SQS不支持消息路由,为了将消息分配给服务器A或B,这就是为什么有一个可用的解决方案:创建SNS主题“服务器A”和“服务器B”。这些主题应该将消息放在SQS上,您的应用程序将从中提取这些消息。还可以在SNS事件上实现web钩子-订阅者,它将分析消息并回调到您的应用程序。

您所布置的理论上可行,但我不再将消息直接放入队列,而是将这些消息放入SNS主题中,然后订阅主题的队列,让它们到达目的地,这样您就可以更灵活地在不涉及生产中的代码或服务器的情况下进行更改

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

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


此外,在首次推出时,我通常喜欢做的是向SNS添加通知,以便我知道发生了什么,即每次“启动流程”事件发生时,我都会将我的手机(或电子邮件地址)订阅到该主题,以便我得到通知——我可以实时监控正在发生(或未发生)的事情。一旦生产部署完成一段时间后,我就可以进入AWS控制台,简单地从过程中取消订阅我的电子邮件/手机,而不必触摸任何服务器或代码。

为什么需要SNS?此外,“持续轮询”最近变得更好了,因为您可以使用长轮询,即指定如果队列中没有消息,SQS服务器最多应等待20秒。这样,如果没有消息,您只需每20秒发出一个请求。@adamw我认为SNS是向队列添加消息的可靠方法。“那就不需要了吗?”阿达姆这样说:啊,那样你就可以避免投票了。当然,这取决于用例,但可能长时间的轮询就足够了。然而,在这里使用SNS的全部意义是不同的:您不必不断地轮询队列。相反,SNS做两件事——将消息放入队列并通知服务器B它应该检查队列。否则你就不需要SNS了。@adamw这样我就可以跳过SNS,只需使用SQS进行长轮询,直接通过SQS而不是SNS将消息添加到que?这肯定不是我使用SQS的经验。我的表现很好,有了最新的更新,投票也很容易。我的经验也不一样。我们在几个项目中使用SQS,没有任何问题。也许最新的更新提高了性能,很好。但是,那些无序的消息和重复的消息呢?这些都是SQS设计的一部分,我认为这永远不会改变。@Jeff,是的,这是真的,这是设计的,“这是一个功能,不是一个bug”。取决于您在应用程序中需要什么;)谢谢你的回复。所以我应该为每台服务器创建一个SNS主题。例如,ServerA将有它唯一的主题“ServerA”,然后这个SNS系统可以用来创建可以运行任务的SQS队列?是的,我的想法是如何为消息路由创建MessageBroker。您不能使用SNS—它只是一个附加层,它可以帮助您,例如,替换SQS来调用RESTAPI或添加web钩子,这将回调您的应用程序。