
因為傳統php架構,沒有資料庫連接配接池,不知道被嘲笑了多少次,包括很多團隊内部,因為沒有資料庫連接配接池,被java團隊給擠掉。這次我們就聊一聊如何用swoole,實作資料庫連接配接池。
為什麼要建立資料庫連接配接池?
連接配接池是可以有效降低MySQL-Server負載的。原理是 連接配接池使用一個共享資源的模式,如并發100個請求,實際上并不是每個請求的所有時間都在執行SQL查詢。這樣100個請求,共享20個MySQL連接配接就可以滿足需求了。當一個請求操作完資料庫後,開始進入模闆渲染等流程,這時就會釋放資料庫連接配接給其他的請求使用。
連接配接池僅在超大型應用中才有價值。普通的應用采用MySQL長連接配接方案,每個php-fpm建立一個MySQL連接配接,每台機器開啟100個php-fpm程序。如果有10台機器,每台機器并發的請求為100。實際上隻需要建立1000個MySQL連接配接就能滿足需求,資料庫的壓力并不大。即使有100台機器,硬體配置好的存儲伺服器依然可以承受。
達到數百或者數千台應用伺服器時,MySQL伺服器就需要維持十萬級的連接配接。這時資料庫的壓力就會非常大了。連接配接池技術就可以派上用場了,可以大大降低資料庫連接配接數。
如何實作?
1 同步阻塞模式
可基于swoole的AsyncTask子產品實作的連接配接池,程式設計簡單,沒有資料同步和鎖的問題。甚至可以多個服務共享連接配接池。缺點是: 1. 靈活性不如多線程連接配接池,無法動态增減連接配接 2. 有一次程序間通信的開銷
2 協程模式
可使用channel實作連接配接池。
我個人推薦使用協程模式,使用協程效率高。
如果用協程實作?
實作原理,其實swoole也有類似go語言的channel,我們執行個體化一定數量的mysql的pdo連接配接,然後把pdo連接配接放到channel裡面,channel支援push和pop,channel是作用域是在整個程序,是以在一個程序中,如果channel已經為空,就得等待其它協程釋放連接配接資源,否則就會挂起。
長時間不用的連接配接要定時釋放
可以在程序中,通過一個定時器,檢查每次連接配接的上次使用時間,如果已經過期,就釋放掉,進而減輕mysql的負載。
大家可以動手試一試,明白了道理後,其實很簡單的。