2017-10-16 191 views
0

我正在使用django-channels添加HTTP2 & WebSocket支持我的應用程序。關於如何擴展頻道,我找不到很多文檔。以下是我的nginx配置,負載平衡運行在同一臺計算機上但運行不同端口的多個實例daphne。這是做到這一點的正確方法嗎?在負載均衡器後面運行daphne的多個實例:django-channels

upstream socket { 
    least_conn; 
    server 127.0.0.1:9000; 
    server 127.0.0.1:9001; 
    server 127.0.0.1:9002; 
    server 127.0.0.1:9003; 
} 

server { 
    listen 80; 
    server_name 127.0.0.1; 

    location = /favicon.ico { access_log off; log_not_found off; } 

    location /static/ { 
     root /home/niscp/home-screen; 
    } 

    location /nicons/ { 
     root /home/niscp/home-screen; 
    } 

    location/{ 
     include uwsgi_params; 
     uwsgi_pass unix:/home/niscp/home-screen/home-screen.sock; 
    } 

    location /ws/ { 
     proxy_http_version 1.1; 
     proxy_set_header Upgrade $http_upgrade; 
     proxy_set_header Connection "upgrade"; 
     proxy_pass http://socket; 
    } 
} 

伴隨着的是,我正在運行的workers單個實例來聽以下方式單個通道:

python manage.py runworker --only-channels=websocket.connect 
python manage.py runworker --only-channels=websocket.receive 
python manage.py runworker --only-channels=websocket.disconnect 

我有uwsgi來處理所有HTTP請求的方式django正常處理它們。所有daphneworkers做的是處理WebSocket請求。 這是一個可行的方法來衡量django-channels,或有什麼我可以做得更好?

回答

1

這裏有幾件事。首先,我不認爲在不同的流程中運行不同類型的請求會帶來很大的收益。您的斷開連接處理程序可能會非常輕 - 除了清理之外沒有太多的工作。連接可能做得不太好,接收會得到大部分的負載。

你打賭使用--threads參數並啓動多個線程。您當前的設置只會爲每種類型的處理程序運行一個線程。

runworker的工作方式是通過你的通道層(前Redis)與Daphne進行通信。所有的工作人員都在聽隊列。當一個工作人員發出請求時,會處理它。在該工作人員處理該請求時,其他工作人員將等待後續請求並處理它們。一旦他們發送了他們的迴應,他們就會回到收聽隊列。如果沒有指定任何渠道,每個流程都將取消請求並儘可能快地處理它們,並且它們都不會在周圍等待。

它通過運行多個進程和--threads參數來找到線程/工作者的最佳平衡。你也可以讓工作人員爲重型頻道保留所以他們不會拖延你的網站。

有多個達芙妮實例將有所幫助。但是,因爲他們所做的只是在服務器和工作人員之間發送消息,所以您可能看不到運行其中4個消息的好處。

+0

我們正在部署至少50k的開放和通信套接字。所以,我想我們會增加傾聽更多流量頻道的工作人員的數量。謝謝 :) –