2024-05-05|閱讀時間 ‧ 約 24 分鐘

Python開發後端的速度很快,但是總有一天會為直譯語言的效能付出代價? 淺談Django高並發處理

你知道IG是用Django開發的嗎?
raw-image

正在學習或使用Django、Flask框架開發後端的你,是否也常在享受Python語法的舒適之餘,仍然煩惱著是否該學習效率更好的Go或Laravel。


Django基本部署架構圖

由於 Django 是同步阻塞型框架,在基本部署架構下,同一時間只能處理一個請求。隨著使用者增加,系統確實必須考慮如何確保能夠有效處理同時到來的大量請求。

然而,解決高並發問題並不一定需要更換開發語言或框架作為首要方案。

提升高並發處理能力

  • 充分利用CPU與Memory - 增加Process/Thread

透過uwsgi的workers參數,增加UWSGI的process數目。

uwsgi --workers 3 --socket :$UWSGI_PORT --module $UWSGI_MODULE_FILE --daemonize=/dev/null

除了增加process數目之外,還可以進一步增加thread數目,例如使用gevent。

uwsgi --workers 3 --gevent 100 --socket :$UWSGI_PORT --module $UWSGI_MODULE_FILE --daemonize /dev/null


  • 減少直接讀取資料庫 - 使用Cache
# 安裝django redis
pip install django-redis
# 修改setting.py
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/1",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"PASSWORD": "your_redis_password", # 如果Redis服务器有設定密碼
}
}
}


  • 水平擴展 - WEB APP Server

以部署在AWS為例,假如高並發的數量繼續增加,我們可以開始將NGINX、WEB APP Server(UWSGI+Django)、DB Server(Redis+Posgres or MySql)拆分至不同的EC2,並根據需求擴展WEB APP Server的數量。


  • 水平擴展 - DB Server

在一些需要同時處理大量用戶請求的場景下,如電商搶購疫苗預約,大量用戶可能會同時讀取和更新商品或疫苗庫存。為了保證不會發生超量銷售或預約,不僅需要資料庫的水平擴展來提升處理能力,同時還必須設計有效的庫存同步機制以確保數據的一致性。通常,只有資源充足的大公司才有能力完成這一設計。


語言成為效能瓶頸 - 密集運算

當服務需要進行密集的數據運算時,使用Go lang或是PHP雖然處理速度上優於Python,但是仍然難以跟C++或Java等語言相比,因此這類型的服務通常會選擇另外撰寫專門處理數據運算的外部程式。


結論

Instagram 是最著名的 Django 專案之一。儘管 Instagram 的開發團隊對 Django 的原生程式碼進行了多項修改,比如不使用 ORM 並引入了 GraphQL 來處理圖像和影片數據,但不可否認的是,Instagram 仍然基於 Django 框架處理了大量的業務邏輯。

通常來說,通過充分利用 CPU 和記憶體資源、減少對資料庫的直接讀取,就能顯著提高系統處理高並發的能力。如果系統不涉及到計算密集型的需求,大膽放心的使用自己喜歡的框架進行開發吧!

分享至
成為作者繼續創作的動力吧!
© 2024 vocus All rights reserved.