odoo16开启gevent多进程,提高性能及启用消息推送

发布时间 2023-10-06 21:52:42作者: CrossPython

原文地址: https://www.odooai.cn/blog/odoo-install-deploy-6/odoo-gevent-web-socket-boost-setup-286
odoo16有一个最大的性能提升,就是从longpolling改成了web socket的方式来推送消息。这个改进顺应了互联网应用的趋势,同时这也是我们整合AI服务的基础,因为AI都是通过消息推送来进行服务的,而且是高频推送。

以下是启用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服务中心,这类应用都需要高频的推送消息。

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;
}