3

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 サーバーに何か問題があるということですか?

4

1 に答える 1