いつもお世話になっております。
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" } }