这可能是一个愚蠢的问题,但我现在有一个很大的心理障碍。我看不到我的SQS队列和将处理该消息的EC2实例之间的连接。
也就是说:客户端在网页上完成表单(此网页托管在EC2实例中),该表单作为消息发送到SQS队列。之后,我的Cloud-Application的目标是获取消息的表单信息并运行带有该信息的.sh。下面的图片显示了这个过程的一个例子:
那么,我的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程序?
对于任何亚马逊服务,还有另一种方法可以更轻松地完成此操作吗?
由于
答案 0 :(得分:2)
那么,我的SQS队列如何在EC2实例中运行.sh?
看起来你已经用自己的代码回答了这个问题。
我用Python-Boto想出的唯一方法是创建一个 "听者"不断阅读信息和做某事"同 那条消息。
是的,这就是排队的工作方式。
如何在不同的EC2中并行处理传入的消息 实例
只需运行处理多个EC2实例上的消息的代码
我不知道如何,因为我只有一个听众,如果是听众 正忙于处理一条消息,它不会处理任何其他消息 完成第一个。
这适用于您的单线程。因此,您可以创建运行该循环的多个线程。您还可以创建多个进程,其中包含这些线程(在同一个VM或多个VM上)。
我怎么知道哪个EC2实例会运行我的.sh程序?
你不是。无论哪个EC2实例选择它都会运行它。这通常是通过队列解耦前端和后端处理的预期行为。
对于任何亚马逊服务,还有另一种方法可以更轻松地完成此操作吗?
不,这种方式最简单,假设您尝试从前端Web服务器解耦和/或卸载支持的处理。我根本不认为它很复杂。
此外,请删除您的睡眠,而是使用long polling