2017-10-16 190 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的开放和通信套接字。所以,我想我们会增加倾听更多流量频道的工作人员的数量。谢谢 :) –