odoo16开启gevent多进程,提高性能及启用消息推送
- 
原文地址: 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 -> httpsserver { 
 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 parametersssl_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;logaccess_log /var/log/nginx/odoo.access.log; 
 error_log /var/log/nginx/odoo.error.log;Redirect websocket requests to odoo gevent portlocation /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 serverlocation / { 
 # 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 gzipgzip_types text/css text/scss text/plain text/xml application/xml application/json application/javascript; 
 gzip on;
 }
