首页 -> 数据分析

用WebSocket、RabbitMQ技术实现后台Python脚本的运行状态推送到网页前端

流星雨 196 天前建立 •  226   

之前用Workerman做了WebSocket的服务器,实现网页和后端通信很方便,但PHP程序是阻塞的,只能有个定时器可以定时做点东西。但如果再连RabbitMQ队列服务器等待消息,则这个也会阻塞,导致WebSocket无法正常工作。


本来项目很小,本着简单实用的原则,考虑了以下几个方案。

1、再写一个PHP脚本在后端运行,专门负责访问RabbitMQ消息队列,收到消息就Push到本地Redis List里,Workerman的定时器每隔几秒从Redis的List中Pop出消息,然后使用WebSocket的功能发送给前端网页。有延迟,需要维护两个PHP脚本运行。

2、抛弃RabbitMQ消息队列,直接使用Redis的List功能,即原来发送给消息队列的代码更改为Push到Redis的List,Workerman用1的方法获取消息。有延迟,需要维护两个PHP脚本运行,虽然省了RabbitMQ。

3、不使用RabbitMQ或Redis,直接使用WebSocket的客户端方式直接推送的Workerman,然后由Workerman转发给网页。 无延迟,只需要保证Workerman的PHP脚本稳定就可以了。

4、不使用Workerman而用Python写一个Websocket服务器,用Python开启另一个线程访问RabbitMQ,收到消息后转给Websocket服务器,再发给网页。 无延迟,Python脚本有可能比PHP稳定,也能直接接收客户端发送转发的方式,也可以使用RabbitMQ,但需要重新开发Python Websocker服务器。

5、RabbitMQ的Websocket插件。RabbitMQ Web STOMP Plugin https://www.rabbitmq.com/web-stomp.html ,可以直接从网页端取消息队列数据,但会暴露用户名和密码。


最后决定先试试以下这两个方式:

1、用Python的Websocket客户端直接发信息给服务器,由服务器转发。

2、或者发给redis的list,服务器端定时访问redis的list,pop出信息。

回复

登录发表 or 还没有账号?去注册