【发布时间】:2013-11-10 17:53:01
【问题描述】:
我有一个 Python 脚本,它将在需要访问消息队列 (RabbitMQ) 或通过 HTTP 接收订阅事件的本地机器上运行。我研究了几种解决方案,但似乎没有一个是原生设计来允许桌面客户端通过 HTTP 访问它们的。我认为使用 Twisted 作为代理也是一种选择。任何指导或建议将不胜感激。提前致谢。
【问题讨论】:
标签: python rabbitmq twisted publish-subscribe amqp
我有一个 Python 脚本,它将在需要访问消息队列 (RabbitMQ) 或通过 HTTP 接收订阅事件的本地机器上运行。我研究了几种解决方案,但似乎没有一个是原生设计来允许桌面客户端通过 HTTP 访问它们的。我认为使用 Twisted 作为代理也是一种选择。任何指导或建议将不胜感激。提前致谢。
【问题讨论】:
标签: python rabbitmq twisted publish-subscribe amqp
我在RabbitMQ site 上阅读了本教程,它们提供了一些可以解决接收消息的库的名称。
发件人:send.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
channel.basic_publish(exchange='',
routing_key='hello',
body='Hello World!')
print " [x] Sent 'Hello World!'"
connection.close()
接收者:receive.py
#!/usr/bin/env python
import pika
connection = pika.BlockingConnection(pika.ConnectionParameters(
host='localhost'))
channel = connection.channel()
channel.queue_declare(queue='hello')
print ' [*] Waiting for messages. To exit press CTRL+C'
def callback(ch, method, properties, body):
print " [x] Received %r" % (body,)
channel.basic_consume(callback,
queue='hello',
no_ack=True)
channel.start_consuming()
现在我们可以在终端中试用我们的程序了。首先,让我们使用我们的 send.py 程序发送一条消息:
$ python send.py
[x] Sent 'Hello World!'
生产者程序 send.py 将在每次运行后停止。让我们接收它:
$ python receive.py
[*] Waiting for messages. To exit press CTRL+C
[x] Received 'Hello World!'
万岁!我们能够通过 RabbitMQ 发送我们的第一条消息。您可能已经注意到,receive.py 程序并没有退出。它将保持准备好接收更多消息,并且可能会被 Ctrl-C 中断。
尝试在新终端中再次运行 send.py。
我们已经学习了如何从命名队列发送和接收消息。是时候进入第 2 部分并构建一个简单的工作队列了。
【讨论】:
我决定使用 wamp http://wamp.ws/。仍在尝试,但目前运行良好。
【讨论】:
选择 #1 你可能对此感兴趣RabbitHub
选择 #2 如果您希望它在端口#80 上,您不能使用代理进行端口转发吗?这可能具有挑战性,但是
选择 #3 如果您的脚本与 RMQ 消息格式不紧密耦合,您可以尝试 celery(它在下面使用 RMQ),如果您想直接触发任何其他应用程序,您可以尝试 celery Http gateway 或 celery web hooks
启动它可能很耗时。然而,Celery 带来了极大的灵活性
选择 #4 对于我的一个项目,我开发了一个中间 Web 服务(Flask Service)来使用 RMQ 不理想,但在当时起到了作用。
【讨论】: