Django Channelsでメッセージを送信すると、"Connection timed out"が発生する。
解決済
回答 3
2023/01/19 04:10
質問内容

いつもお世話になっております。

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"
	}
}
回答 3
ベストアンサーを選択すると、解決済みとなります。
nodata
まだ回答がありません
回答
nodata
回答するにはログインが必要です