フルスタックチャンネル
サインアップサインアップ
ログインログイン
利用規約プライバシーポリシーお問い合わせ
Copyright © All rights reserved | FullStackChannel
解決済
Django Channelsでメッセージを送信すると、"Connection timed out"が発生する。
Django
Python
atnek
2023/04/03 16:09

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

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件
login
回答するにはログインが必要です
はる@講師
2年以上前

私の経験上、タイムアウトが発生する場合は、大体は接続先が間違っている可能性があります。

InMemoryChannelLayerは本番環境では使用しないでと書いてありますね。

https://channels.readthedocs.io/en/stable/topics/channel_layers.html

はる@講師
2年以上前

ありがとうございます。

原因が見つかって良かったです。

atnek
2年以上前

ありがとうございます。

色々と試行錯誤した結果、下記の2つが失敗の原因でした。

1, グループレイヤーにオブジェクトを直接渡していた事
2, 非同期処理でオブジェクトの取得が終わるよりも先に、そのオブジェクト変数を参照していた事

タイムアウトではなく、エラーが原因で接続が切れてしまっていたようでした。

1