这可能是一个愚蠢的问题,但我现在有一个很大的心理障碍。我看不到 SQS 队列与将处理消息的 EC2 实例之间的连接。
也就是说:客户端在网页上填写表单(该网页托管在 EC2 实例中),并且该表单作为消息发送到 SQS 队列。之后,我的云应用程序的目标是获取消息的表单信息并使用该信息运行 .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 程序?
还有另一种方法可以通过任何亚马逊服务以更简单的方式做到这一点吗?
谢谢
最佳答案
So, how can my SQS Queue run a .sh in a EC2 instance?
看来您已经用自己的代码回答了这个问题。
The only way I figured out to do so with Python-Boto, is creating a "listener" to constantly read the messages and "do something" with that message.
是的,这就是队列的工作原理。
How can I process the incoming messages in parallel in different EC2 instances?
只需运行处理多个 EC2 实例上的消息的代码
I don't see how, because I only have one listener, and if the listener is busy processing one message, it won't process any other until it finishes the first one.
这对于您的单线程来说是正确的。因此,您可以创建多个线程来运行您拥有的循环。您还可以创建多个包含这些线程的进程(在同一虚拟机或多个虚拟机上)。
How can I know which EC2 instance will run my .sh program?
你不知道。无论哪个 EC2 实例选择它都会运行它。这通常是通过队列解耦前端和后端处理的预期行为。
There is another way to do this in a much easier way with any Amazon Service?
不,这种方法是最简单的,假设您正在尝试从前端 Web 服务器分离和/或卸载支持的处理。我认为这根本不复杂。
另外,删除你的 sleep ,并使用 long polling
关于python - 在 Amazon 中处理消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29897174/