你知道IG是用Django開發的嗎?
由於 Django 是同步阻塞型框架,在基本部署架構下,同一時間只能處理一個請求。隨著使用者增加,系統確實必須考慮如何確保能夠有效處理同時到來的大量請求。
然而,解決高並發問題並不一定需要更換開發語言或框架作為首要方案。
透過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
# 安裝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服务器有設定密碼
}
}
}
以部署在AWS為例,假如高並發的數量繼續增加,我們可以開始將NGINX、WEB APP Server(UWSGI+Django)、DB Server(Redis+Posgres or MySql)拆分至不同的EC2,並根據需求擴展WEB APP Server的數量。
在一些需要同時處理大量用戶請求的場景下,如電商搶購或疫苗預約,大量用戶可能會同時讀取和更新商品或疫苗庫存。為了保證不會發生超量銷售或預約,不僅需要資料庫的水平擴展來提升處理能力,同時還必須設計有效的庫存同步機制以確保數據的一致性。通常,只有資源充足的大公司才有能力完成這一設計。
當服務需要進行密集的數據運算時,使用Go lang或是PHP雖然處理速度上優於Python,但是仍然難以跟C++或Java等語言相比,因此這類型的服務通常會選擇另外撰寫專門處理數據運算的外部程式。
Instagram 是最著名的 Django 專案之一。儘管 Instagram 的開發團隊對 Django 的原生程式碼進行了多項修改,比如不使用 ORM 並引入了 GraphQL 來處理圖像和影片數據,但不可否認的是,Instagram 仍然基於 Django 框架處理了大量的業務邏輯。
通常來說,通過充分利用 CPU 和記憶體資源、減少對資料庫的直接讀取,就能顯著提高系統處理高並發的能力。如果系統不涉及到計算密集型的需求,大膽放心的使用自己喜歡的框架進行開發吧!