上海序說科技,專注于基于Odoo專案實施,實作企業數智化,助力企業成長,
老韓頭的開發日常,博客園分享(2022年前博文)
10月12日,Odoo16版本正式發布,本文將就Odoo官方在性能方面做的優化做一個總結,如果需要官方視頻,可以翻閱B站,有不少朋友已經做了搬運工,
性能提升切入點
Odoo作為B/S架構的應用,終端用戶一般使用的是瀏覽器訪問,因此,對于用戶側而言,性能提升的感覺主要體現在用戶點擊后回應實作變化,如下圖

官方將該程序分為了
- Web應用終端
- 網路請求
- 業務應用
- Odoo主框架邏輯
- 硬體層面
Web應用終端
在Web應用終端,其實也就是用戶側的瀏覽器,官方在JS和CSS方便都做了不同程度的優化,如下圖

BlockDOM
官方定義是一種更為底層的對于DOM物件的抽象管理庫,可以在渲染頁面DOM物件的時候以塊的形式進行,并區分了其中的靜態元素和動態元素,
關于BlockDOM的詳細說明,博主將在后續的文章中進行介紹,
blockdom is a very fast virtual dom library. Its main selling point is that it does not represent DOM element by element, but instead block by block, where a block is an element with all its static content and some special tags to indicate dynamic content. This allows blockdom to use cloneNode(true) on blocks and speed up the diff process, since the vdom tree is much smaller.
OWL2 框架
我們知道自Odoo15開始,官方引入了新的前端框架OWL,隨著Odoo16的發布,OWL框架也進入2.x版本,其中與1.x版本還是有一些不同的,這也是為什么博主會寫 OWL系列教程 的原因,

如上,在Odoo15中,只有30%的前端組件使用了OWL1框架,那么在本次發布的Odoo16版本中,除了Odoo Studio模塊的部分前端代碼依舊保留有Widget形式外,已經有99%的代碼使用OWL 2進行了重構,
由此帶來的效果是:
- 縮減了30%的代碼行數
- 頁面渲染速度實作了2到20倍不同程度的提升
CSS Cleanup
Odoo16中大幅縮減了SCSS的代碼行數,從而減少了渲染頁面時的時間,

其他
- 在Tree視圖下的,將該物件下全部的資訊的數量調整為上限10000,如下圖所示,性能提升效果還是很明顯的,
- 減少或合并了一些RPC請求,進而提高客戶端的回應
- 重構了討論模塊并將longpoll改為了websocket(終于改了,該功能在Odoo14的時候就已經有開發者pull了,但一直沒有合并 )

網路請求
作為BS架構的應用,用戶的每一次操作都需要與服務器實作有效的資料互動,因此,優化的重點就放在了

- 縮減請求包體大小
- 合并請求數量
將分別將JS、CSS檔案合并為一個檔案,并去除了冗余代碼:

優化load_views()中邏輯,精簡欄位資料:

- 通過NGINX等軟體代理實作大檔案的下載
在啟動Odoo實體的時候,添加--x-sendfile指令,可以在用戶請求大檔案的時候,回應用戶請求的worker可通過添加X-Accel-Redirect頭,實作NGINX直接將快取檔案發送回用戶,減少對應用的壓力,

業務應用
業務應用方面的優化主要是體現在
- onchange -> compute
- 代碼重構

onchange -> compute

在上圖中該銷售單共有多個產品行,每個訂單行的金額小計依賴于商品價格、數量、優惠等,而訂單總金額則依賴于每行的金額小計,因此,在上圖中,若我們改變了三行的優惠額度,那么對于總價而言,也將計算三次,但是,若我們將總金額通過compute方式實作,就只需要計算一次就夠了,
如下圖所示,Compute與onchange的對比:

Odoo16在field定義的時候,還新增了precompute關鍵字,可用于替換特定場景下的default,有效減少SQL操作,

Odoo主框架邏輯
Odoo16在主框架上優化還是很明顯的,對于已有專案的遷移可能是個挑戰,正好有客戶使用的Odoo14版本,后續將遷移程序也會整理下,
- 翻譯欄位優化
- 片段優化
- 索引優化
- 視圖和選單優化
- Sessions

翻譯欄位優化

我們看到,在老版本的Odoo中,res.country物件在不同語種情況下的名稱是單獨定義在iir.tanslation物件中的,那么,當我們需要非英語的國家名稱時,需要將兩張表關聯查詢才能得到目標值,
Odoo16將類似這種情況下的欄位,調整為了JSONB格式欄位,這樣就允許我們較為直接的查詢到我們的目標值,優化后在查詢和更新時都會有較為明顯的提升,唯一一個缺點是我們需要安裝一個新的語種時會慢一點,不過這也能夠理解,畢竟是新的語種需要將所涉及到的翻譯全部都更新一遍,

片段快取
在Odoo16的視圖渲染中,引入了片段快取的概念,如下圖,我們可以在視圖中通過t-cache關鍵字標識該區域是否啟用快取或者依賴于哪些物件,比如,header、footer標簽一般是所有頁面通用的,因此此處我們設置為t-cache="True",在Section標簽中,有可能展示不同的商品資訊,此處我們配置了t-cache="products,pricelist"物件,而在購物車的位置,將需要判斷用戶是否登陸再渲染,所以此處設定為t-cache="None",

通過片段快取技術,頁面渲染的速度得到蠻大的提升,

索引優化
在Odoo16中,擴展了索引的方式,btree_not_null(并無索引null)和trigram(用于字串搜索,ilike等場景),

視圖和選單
引入視圖快取的方式及優化選單冷加載,可將視圖加載的時間提高6.5倍,

Sessions
僅存盤必要的Sessions資訊,對于訪客的Session將不再存盤,

硬體層面
這點沒什么好說的
本文來自博客園,作者:老韓頭的開發日常,轉載請注明原文鏈接:https://www.cnblogs.com/xushuotec/p/16817886.html
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/519069.html
標籤:其他
下一篇:PKI,CA詳解學習筆記
