django チャネルに問題があります。Daphne は WebSocket CONNECT リクエストを適切に受け入れますが、ワーカーはconsumer.pyで指定されたメソッドでリクエストに応答しません。問題は、これがほとんどの場合にのみ発生することです。時々、 consumers.pyのメソッドで応答しますが、ほとんどの場合、ワーカーはまったく応答しません。vagrant (trusty64) 環境では正常に動作する重複コードがありますが、実際の trusty64 マシンではコードがそのように動作します。アプリをホストする trusty64 マシンでは、他のアプリケーションも実行されていることに注意してください (約 4 つのアプリが同時に実行されています)。
私はこのように設定されたrouting.pyを持っています
from channels import route
from app.consumers import connect_tracking, disconnect_tracking
channel_routing = [
route("websocket.connect", connect_tracking, path=r'^/websocket/tms/tracking/stream/$'),
route("websocket.disconnect", disconnect_tracking, path=r'^/websocket/tms/tracking/stream/$'),
]
対応するconsumer.pyは次のようになります
import json
from channels import Group
from channels.sessions import channel_session
from channels.auth import http_session_user, channel_session_user, channel_session_user_from_http
from django.conf import settings
@channel_session_user_from_http
def connect_tracking(message):
group_name = settings.TRACKING_GROUP_NAME
print "%s is joining %s" % (message.user, group_name)
Group(group_name).add(message.reply_channel)
@channel_session_user
def disconnect_tracking(message):
group_name = settings.TRACKING_GROUP_NAME
print "%s is joining %s" % (message.user, group_name)
Group(group_name).discard(message.reply_channel)
そして、このようなsettings.pyのいくつかのチャンネル関連の行
redis_host = os.environ.get('REDIS_HOST', 'localhost')
CHANNEL_LAYERS = {
"default": {
# This example app uses the Redis channel layer implementation asgi_redis
"BACKEND": "asgi_redis.RedisChannelLayer",
"CONFIG": {
"hosts": [(redis_host, 6379)],
},
"ROUTING": "tms_app.routing.channel_routing",
},
}
別の質問を参照して、このようにdaphneとworkerを実行してみました
daphne tms_app.asgi:channel_layer --port 9015 --bind 0.0.0.0 -v2
python manage.py runworker -v3
ダフネとワーカーのログをキャプチャしました。次のようになります
ダフネ ログ :
2016-12-30 17:00:18,870 INFO Starting server at 0.0.0.0:9015, channel layer tms_app.asgi:channel_layer
2016-12-30 17:00:26,788 DEBUG WebSocket open for websocket.send!APpWONQKKDXR
192.168.31.197:48933 - - [30/Dec/2016:17:00:26] "WSCONNECT /websocket/tms/tracking/stream/" - -
2016-12-30 17:00:26,790 DEBUG Upgraded connection http.response!sqlMPEEtolDP to WebSocket websocket.send!APpWONQKKDXR
対応するワーカーログ:
2016-12-30 17:00:22,265 - INFO - runworker - Running worker against channel layer default (asgi_redis.core.RedisChannelLayer)
2016-12-30 17:00:22,265 - INFO - worker - Listening on channels http.request, websocket.connect, websocket.disconnect, websocket.receive
WSCONNECT イベントが発生したときにわかるように、ワーカーはそれに応答しません。
Twisted を 16.2 にダウングレードすることで解決されたこの問題に近い別の質問がありますが、私にはうまくいきません。
2017 年 1 月 3 日更新
nginx、supervisor、gunicorn、およびdaphneに同じコードと同じ設定を使用しているにもかかわらず、ローカルのvagrantマシンで問題を再現できません。redisの代わりにIPCを使用して動作するように、チャネルレイヤーの設定を変更してみました。設定は次のとおりです。
CHANNEL_LAYERS = {
"default": {
"BACKEND": "asgi_ipc.IPCChannelLayer",
"ROUTING": "tms_app.routing.channel_routing",
"CONFIG": {
"prefix": "tms",
},
},
}
ただし、IPC に比べてスケーリングが容易なため、Redis チャネル レイヤーを使用するつもりであるため、これは現在の問題を解決しません。これは、私の redis サーバーに何か問題があるということですか?