python web service開發
由于項目業務需要,接下來的一段時間主要是做web service開發。關于python web service開發主要有兩方面的考量:
- 實作服務
- 測試服務性能
服務的整個過程就是提供一個接口供别人來請求,伺服器接收請求後就準備資料,并将準備好的結果傳回給請求端。小組采用Flask + Gunicorn + Nginx 部署的整體方案來實作服務支援,其中重點需要了解的是Flask和Gunicorn,Nginx是運維那邊負責。
Nginx
Nginx(發音同engine x)是異步架構的
網頁伺服器,也可以用作
反向代理、
負載平衡器和
HTTP緩存。該軟體由
伊戈爾·賽索耶夫建立并于2004年首次公開釋出。2011年成立同名公司以提供支援。2019年3月11日,Nginx公司被
F5 Networks以6.7億美元收購。
Nginx是免費的
開源軟體,根據類
BSD許可證的條款釋出。一大部分Web伺服器使用Nginx,通常作為
負載均衡器,作用如下:
- Nginx可以緩存住請求,然後内網再次發起請求,并且可以配置負載均衡,如果一台機器 的多程序(Gunicorn就是多程序)吃不消的情況下,負載均衡可以把請求打向多個機器
- Nginx替代Python處理靜态檔案的請求,以提高性能
- 很多時候一個機器上可能不止一個服務,需要像Nginx這樣的web伺服器做一次proxy_pass
下面是其基本架構:
Gunicorn
Gunicorn是Python下的一個WSGI伺服器,聽起來很普通,不過因為它支援很多特性,在 Python界還是很流行,例如作為起Flask的父程序,支援用gevent把Flask打個patch等。
它使用的是pre-fork的模式,即啟動的時候fork出n個程序,然後master程序負責監聽 信号和子程序,如果子程序挂了,那麼master會拉一個新的起來,如果有對應信号, master會發起相應的動作。
Gunicorn的選項從三個地方讀取:
- 首先從架構裡指定,這裡隻有一個叫Paste的架構才有,我們可以忽略之
- 其次從
中指定的python檔案裡讀取-c <path/to/configuration>
- 最後從指令行參數裡讀取
順序是從上往下,優先級遞增。
詳細的配置都在這裡:
http://docs.gunicorn.org/en/stable/settings.htmlFlask
Flask是一個使用
Python編寫的輕量級
Web應用架構。基于Werkzeug
WSGI工具箱和Jinja2
模闆引擎。Flask使用BSD授權。
Flask被稱為“microframework”,因為它使用簡單的核心,用extension增加其他功能。Flask沒有預設使用的資料庫、窗體驗證工具。然而,Flask保留了擴增的彈性,可以用
Flask-extension加入這些功能:
ORM、窗體驗證工具、檔案上傳、各種開放式身份驗證技術。
主要服務程式是基于Flask架構編寫的,将離線封裝好的python程式用Flask封裝一下,使其支援GET或POST請求。例如
from flask import Flask
app = Flask(__name__)
@app.route("/")
def hello():
return "Hello World!"
if __name__ == "__main__":
app.run()
上面這個程式為印出Hello World的網頁程式,程式啟動之後,在本地輸入
0.0.0.1:5000/
即可出現顯示Hello World的網頁。
def hello()
就是主函數,離線運算的主函數封裝在此就行,其餘的Flask架構都封裝好的,友善實作接口伺服器。
緩存
用完緩存之後,性能得到飛躍的提升。
連接配接池
由于項目需要多線程讀寫資料庫,是以使用資料庫連接配接池這種方式連接配接會比較好,不然容易産生資料庫事務問題。
資料庫連接配接池負責配置設定、管理和釋放資料庫連接配接,它允許應用程式重複使用一個現有的資料庫連接配接,而不是再重建立立一個;釋放空閑時間超過最大空閑時間的資料庫連接配接來避免因為沒有釋放資料庫連接配接而引起的資料庫連接配接遺漏。這項技術能明顯提高對資料庫操作的性能。
性能測試
性能測試使用工具是siege,在之前的文章《
web service壓測工具:siege安裝及使用介紹》中介紹過了,這裡不再進行詳細介紹,下面展示性能測試結果:
- 未使用緩存的情況:
- 使用緩存的情況:
- 使用緩存和連接配接池的情況:
可以看到,當使用緩存時,性能得到飛躍的提升,使用連接配接池,性能變化不大,但不會産生事物問題。