使用Python通过WebSockets将RabbitMQ事件推送到浏览器的最简单方法?

1 投票
2 回答
4355 浏览
提问于 2025-04-19 12:19

我有一个现成的Python系统,它通过Rabbit MQ接收消息。请问,有什么最简单的方法可以把这些事件通过WebSockets推送到浏览器里?如果这个解决方案在所有主流浏览器上都能用,那就更好了。

谢谢,
Virgil

2 个回答

2

你可以在服务器上使用 TwistedtxAMQPAutobahn|Python 来写一个桥接程序,大概只需要50行代码。而在浏览器端,你可以使用 Autobahn|JS。Autobahn 实现了 WebSocket,并在其上面实现了 WAMP,这让你可以通过 WebSocket 进行发布与订阅(还有远程过程调用)。

如果你使用原始的 WebSocket,你就得自己想办法实现发布与订阅的功能,因为我想这正是你想要的:把 AMQP 的发布订阅功能扩展到网页上。或者你也可以看看 STOMP。

免责声明:我是 WAMP 和 Autobahn 的原作者。

6

这里有一个完整的例子,使用了 RabbitMQTornado,你可以在这个链接找到它。

你可以在网站上找到所有的说明:

总之,你需要:

pip install pika 
pip install tornado 

首先,你需要注册你的 RabbitMQ:

def threaded_rmq():
    channel.queue_declare(queue="my_queue")
    logging.info('consumer ready, on my_queue')
    channel.basic_consume(consumer_callback, queue="my_queue", no_ack=True) 
    channel.start_consuming()

然后,你需要注册你的 WebSocket 客户端:

class SocketHandler(tornado.websocket.WebSocketHandler):
    def open(self):
        logging.info('WebSocket opened')
        clients.append(self)

    def on_close(self):
        logging.info('WebSocket closed')
        clients.remove(self)

当你收到消息时,可以把它转发到 WebSocket 页面。

def consumer_callback(ch, method, properties, body):
        logging.info("[x] Received %r" % (body,))
        # The messagge is brodcast to the connected clients
        for itm in clients:
            itm.write_message(body)

撰写回答