odoo16有一个最大的性能提升,就是从longpolling改成了web socket的方式来推送消息。这个改进顺应了互联网应用的趋势,同时这也是我们整合AI服务的基础,因为AI都是通过消息推送来进行服务的,而且是高频推送。同样,物联网应用因为需要高频推送状态信息,真正运营也必须使用多进程和websocket推送。
以下是启用Web Socket后,Ai主动推送信息回答的效果,使用阿里通义千问,3秒内就响应了。
odoo16启用Web Socket
为什么必须启用Web Socket
Odoo一直以来都是一个基于互联网架构的ERP,绝大多数方面她都做得很好。
但在消息推送上,在odoo16版本以前,都是使用的http协议长连接long-polling方式,这种方式的好处是协议简单标准化,我们二开省事很多。但缺点也很明显,就是大量占据服务器资源。详情可Bing搜索一下 long polling 与 web socket 即可了解。
随着网络应用不断发展,现在绝大多数的浏览器和App都支持web socket了。因此,在 odoo16上,终于改用了 web socket 模式,虽然开发上增加了一些难度,但却带来了巨大的性能提升。
特别在针对物联网应用如RFID应用,Ai应用如我们的Ai服务中心,这类应用都需要高频的推送消息。
同时,odoo的定时任务cron也是多进程跑的,因此必须开启 genent,才能正常启用定时任务。
Web Socket好处
需要主动推送的应用通过 web socket实现,就提升明显了。
- 推送更快。每次信息互动保持一个唯一连接,消除长连接(长轮询)的延迟问题
- 内容更精简。由于不使用http协议,无需发文件头等额外信息。
- 全双工异步。客户端和服务器都可以独立地相互传输消息。
- 配置简单。在大型网络中,WebSockets 无需任何配置即可通过大多数防火墙。
odoo端配置
参考官方文档
系统配置处,配置好 odoo.conf ,一般使用默认即可,参考
https://www.odooai.cn/documentation/16.0/zh_CN/administration/install/deploy.html
如果需要自行定制端口,这个一般在国企或者有信创要求的单位很常见,就使用 gevent_port 参数。如 odoo.conf 中
gevent_port = 8072
同时注意
proxy_mode = True
Nginx 端配置
同样参考上述官方文档即可,配置好 upstream即可。
Windows 内特殊处理
由于Windows本身是不直接支持Python的多进程的,那么我们要手动再启动一个 odoo 进程,f增加使用 gevent,这时把 Websocket启用,比如执行指令中增加
%CD%\runtime\python3\python3 %CD%\source\odoo-bin gevent -c %CD%\odoo.conf --update=""
在我们的绿色版中已有内置,将 gevent 相关执行取消注释就成。
参考 odoo智能版下载中 odoo16绿色高速版处理
https://gitee.com/odooai/odoo-ai
开发端Pycharm端配置
开发端因为要自定义启动odoo,故同样要配置好 gevent。
参考下图,我们在启动正常开发Python进程时,要启一个 gevent 进程
省事可直接使用Boost提速模块
主要是针对Windows用户,在odoo13~16版本中,如果你没有配置好 long-polling 或者 web socket,你会发现你的 odoo 经常会停滞不响应,这就是因为没有配置好消息推送,导致odoo响应超时。
此时,你停止相关的推送请求即可,这个需要前端 js 及后端 py 一起处理,我们有相关模块,安装后即停止消息推送,极大的减少了 odoo 的资源使用。
市场搜索 app_odoo_boost 即可
https://apps.odoo.com/apps/modules/browse?search=app_odoo_boost
适用以下场景
- 如果你仅使用 odoo 的进销存,生产等各种功能模块,不需要讨论及Ai辅助等功能
- 在Windows下开发,只处理业务功能开发,不需要即时推送
Nginx实例
完整Nginx.conf示例
参考官方文档即可
#odoo server upstream odoo { server 127.0.0.1:8069; } upstream odoochat { server 127.0.0.1:8072; } map $http_upgrade $connection_upgrade { default upgrade; '' close; } # http -> https server { listen 80; server_name odoo.mycompany.com; rewrite ^(.*) https://$host$1 permanent; } server { listen 443 ssl; server_name odoo.mycompany.com; proxy_read_timeout 720s; proxy_connect_timeout 720s; proxy_send_timeout 720s; # SSL parameters ssl_certificate /etc/ssl/nginx/server.crt; ssl_certificate_key /etc/ssl/nginx/server.key; ssl_session_timeout 30m; ssl_protocols TLSv1.2; ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384; ssl_prefer_server_ciphers off; # log access_log /var/log/nginx/odoo.access.log; error_log /var/log/nginx/odoo.error.log; # Redirect websocket requests to odoo gevent port location /websocket { proxy_pass http://odoochat; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection $connection_upgrade; proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; } # Redirect requests to odoo backend server location / { # Add Headers for odoo proxy mode proxy_set_header X-Forwarded-Host $host; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header X-Real-IP $remote_addr; proxy_redirect off; proxy_pass http://odoo; } # common gzip gzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript; gzip on; }