前提・実現したいこと
Websocket通信にて情報が欠落することの対策を取りたいが、いまどのような状態になっているのかわからず、デバック方法を含めて対策を検討したい。
目的としてはコードというよりもwebsocketの仕様についての見解をいただけたら幸いです。
該当のソースコード
コードが長すぎるので省略しながら記載しますが、基本的にはwebsocketにてon_messageのあと一度なにを受信したものを表示させてその後の処理を行っています。
よって受信したmessageは必ずpprint表示させています。
Python
1import websocket 2 3""" 中略 """ 4 5class sock: 6 def __init__(self, api_key, api_secret): 7 websocket.enableTrace(True) 8 self.ws = websocket.WebSocketApp(endpoint, 9 on_message=self.on_message, 10 on_error=self.on_error, 11 on_close=self.on_close, 12 on_open=self.on_open, 13 header=self.__get_auth()) 14 self.wst = threading.Thread(target=lambda: self.ws.run_forever()) 15 self.wst.daemon = True 16 self.wst.start() 17 18 def on_message(self, ws, message): 19 message = json.loads(message) 20 pprint(message) 21 22""" 中略 """ 23
事象
基本的な動作は問題なく、正常に動くのだがイベントが一時的に増え、送信情報が混みあったときに送られてくるはずのメッセージが欠落しているようでその後の処理に誤動作を起こす。
欠落していることの確認はpprintで受け取ったmessageを表示させているがそこにないことから判明。
ただここまで来たが、これからどんなデバック、対策を取ればいいのかわからず、こちらにご相談させていただきました。
仮説1)情報が欠落することがwebsocketの仕様
→混みあったときにはサーバ側として送れるものだけ送るという仕様であればチャンネルを減らすなどして負荷低減を行う、もしくはそれを前提にREST APIで情報を補完する処理を入れる、という対策が考えられる。
仮説2)自分のプログラムの処理が間に合わず、ライブラリなどが受け取ったmessageを意図的に捨てている。
→そうであれば処理の高速化や捨てるmessageの優先順位などを付けられないか、という対策が考えられる。
仮説3)本当は正常にすべてのmessageを受け取っているが、自分のプログラムミスにより表示できていない
→on_messageの開始時に表示させているため、受け取ったものはすべて表示できているはず。。
ただ情報は欠落しないということになると今度は処理が遅く、受信情報がたまってきてリアルタイム性が失われる仕様であれば、それについても別途対策の検討が必要になる可能性。
Webで検索しましたが、Websocketの情報欠落に関する情報が見当たらず、ご意見等いただけますと幸甚に存じます。
よろしくお願いします。
補足情報(FW/ツールのバージョンなど)
Windows10
Python 3.7.1
Pycharm
回答2件
あなたの回答
tips
プレビュー