odoo12 mysql_[转载]odoo集成websocket的实践

碰到一个需求,即在某个对象被创建的时候,现实对某些正在浏览该对象的列表视图的人进行实时的通知,并播放声音进行提醒。这里的业务场景是,工厂的操作员需要某个技术员进行协助的时候,发起一个协助请求,技术员在接收到通知后去操作员那里进行协助。

技术分析

最容易想到的解决方案就是在技术员打开的列表视图加入轮询式的脚本,不停地刷新,有新数据产生的时候进行通知。实现这种功能的技术也非常成熟了,就是利用http协议中的轮询、长连接等方式实现。但这样做的缺点有两个:

HTTP轮询和长连接带来的性能开销

用户界面定时刷新不是那么简洁,而且如果数据超过一页,当用户去看第二页的时候就会被翻页返回第一页

所以就想到了用websocket方式来替代HTTP,Python对websocket的实现有多种,比较著名的有:Autobahn、Django

Channel、Flask-SocketIO、Websocket-client、Crossbar.io等,但搜了一下odoo对websocket的支持,貌似目前还没有,虽然官方IM模块实现了实施通讯的功能,但底层实现的技术没有细究。这里我们采用Python的另一个著名框架tornado来实现,tornado原生就支持了websocket,所以我们不需要再多安装什么。

Websocket 与 HTTP的前世今生

Http诞生之时,被设计为了被动、无状态的,意思就是request和response总是成对出现的,并且sever端不能主动向client端发送消息,且一次交互过后server端就不再保存client端的信息(即拔*无情),再次连接还得重新握手重新建立连接。因为这种无状态的特性,催生了cookie和session等保持用户身份的技术,也是因为这种被动的特性,催生一个新协议的诞生——websocket。websocket是一种基于http的全双工协议,即建立连接后,server端既可主动向客户端发送消息,客户端也可以主动向server端发送消息,这种方式性能开销小,不像http那样每次都要重新握手进行连接,也不像长连接那样需要server端一直hold住连接从而节省了server端的性能开销。

Tornado的Websocket Server实现

用tornado是实现一个webserver的服务端非常简单:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

from tornado.options import

define, options, parse_command_line

define("port",

default=8888, help="run on the given port", type=int)

# we gonna store clients in

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值