处理亚马逊中的消息

时间:2015-04-27 13:29:27

标签: python amazon-web-services amazon-ec2 boto amazon-sqs

这可能是一个愚蠢的问题,但我现在有一个很大的心理障碍。我看不到我的SQS队列和将处理该消息的EC2实例之间的连接。

也就是说:客户端在网页上完成表单(此网页托管在EC2实例中),该表单作为消息发送到SQS队列。之后,我的Cloud-Application的目标是获取消息的表单信息并运行带有该信息的.sh。下面的图片显示了这个过程的一个例子:

enter image description here

那么,我的SQS队列如何在EC2实例中运行.sh?我用Python-Boto想出的唯一方法是创建一个“监听器”来不断读取消息并用该消息“做某事”。

while 1:
    m = conn.receive_message(
        q, 
        number_messages=1, 
        message_attributes=['configName'], 
        attributes='All'
    )
if not m:
    time.sleep(5)
else:
    a = str(m[0].message_attributes.get('configName').get('string_value'))
    rh = str(m[0].receipt_handle)
    # Processing the message in a EC2 instance
    conn.delete_message_from_handle(q, rh)
    time.sleep(5)

所以,正如上面的代码所示,我读取了消息的属性(在这种情况下,为了简单起见,只有一个),我必须处理它。

如何在不同的EC2实例中并行处理传入的消息?我没有看到,因为我只有一个监听器,如果监听器忙于处理一条消息,它将不会处理任何其他消息,直到它完成第一个消息。我希望监听器并行处理任意数量的消息(当然,这取决于实例的数量和我要支付的账单)。我如何知道哪个EC2实例将运行我的.sh程序?

对于任何亚马逊服务,还有另一种方法可以更轻松地完成此操作吗?

由于

1 个答案:

答案 0 :(得分:2)

  

那么,我的SQS队列如何在EC2实例中运行.sh?

看起来你已经用自己的代码回答了这个问题。

  

我用Python-Boto想出的唯一方法是创建一个   "听者"不断阅读信息和做某事"同   那条消息。

是的,这就是排队的工作方式。

  

如何在不同的EC2中并行处理传入的消息   实例

只需运行处理多个EC2实例上的消息的代码

  

我不知道如何,因为我只有一个听众,如果是听众   正忙于处理一条消息,它不会处理任何其他消息   完成第一个。

这适用于您的单线程。因此,您可以创建运行该循环的多个线程。您还可以创建多个进程,其中包含这些线程(在同一个VM或多个VM上)。

  

我怎么知道哪个EC2实例会运行我的.sh程序?

你不是。无论哪个EC2实例选择它都会运行它。这通常是通过队列解耦前端和后端处理的预期行为。

  

对于任何亚马逊服务,还有另一种方法可以更轻松地完成此操作吗?

不,这种方式最简单,假设您尝试从前端Web服务器解耦和/或卸载支持的处理。我根本不认为它很复杂。

此外,请删除您的睡眠,而是使用long polling