いつもお世話になっております。
https://www.fullstackchannel.com/questions/98
で質問をしました、Channelsを用いたアプリについての質問です。。
レイヤーにAWSのRedisを用いると、メッセージの送信は出来るのですが、
送信するとコネクションが切れてしまい、送信したメッセージの受信ができません。
エラーログを見ると下記のようになっています。
[error] 5225#5225: *2111 upstream timed out (110: Connection timed out) while reading response header from upstream, client: ***.31.**.204, server: , request: "GET /ws/thread/****/ HTTP/1.1", upstream: "http://127.0.0.1:8000/ws/thread/****/", host: "*****.com"
送信後にオブジェクトは作成されているので、jsonの受信自体はできているようです。
async def receive_json(self, data):
[A]
if 'rf' in data:
await self.channel_layer.group_send( ← すべて送信される
self.room_id,
{
'type': 'rf',
'ids':data['ids'],
}
)
else:
[B]
message_object = await self.createMessage(data) ← ここまでは処理される
await self.channel_layer.group_send( ← この処理が送信されない
self.room_id,
{
'type': 'chat_message',
'message': message_object,
}
)
上記がwebsocketからの受信後の処理となっております。
[A]の処理は問題なく行えるのですが、[B]の処理となると接続が切れてしまいます。
[A]と[B]の処理の違いは、オブジェクトの作成の有無です。
Aはオブジェクトの作成は無く、またBはオブジェクトの作成と同時にメールの送信も行われます。
処理の重さによりコネクションが切れてしまっているのか、はたまた他の原因があるのか、調べてみたのですがなかなか原因が掴めず。。。
なお、RedisのTimeoutのパラメータは60秒に設定しています。
解決策をご教示頂けましたら幸いです。
尚、暫定的な処置として、BACKENDをInMemoryChannelLayerに設定をしております。
この場合はすべての処理が行われます。
なので、プログラムの問題では無いような気がしています。
CHANNEL_LAYERS = {
"default": {
"BACKEND": "channels.layers.InMemoryChannelLayer"
}
}
私の経験上、タイムアウトが発生する場合は、大体は接続先が間違っている可能性があります。
InMemoryChannelLayerは本番環境では使用しないでと書いてありますね。
https://channels.readthedocs.io/en/stable/topics/channel_layers.html
ありがとうございます。
原因が見つかって良かったです。
ありがとうございます。
色々と試行錯誤した結果、下記の2つが失敗の原因でした。
1, グループレイヤーにオブジェクトを直接渡していた事
2, 非同期処理でオブジェクトの取得が終わるよりも先に、そのオブジェクト変数を参照していた事
タイムアウトではなく、エラーが原因で接続が切れてしまっていたようでした。