You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
WebSocket open 時のコールバックに store.initialize を設定できるようにする
Pros: REST API によるデータから無限待機を回避できる
Cons: REST API によるデータで必ず watch メソッドがイテレーションするとは限らない(そもそも、この件に限らず open 時に initialize するべき)
WebSocket が「TCP コネクションが繋がっているが、メッセージが受信されない」状態の時、 bot が無限待機されたりロジックにバグが発生する可能性がある。
課題
以下は FTX - WebSocket API - Ticker の接続イベントとメッセージのログである。
このログは WebSocket が何かの要因で切断され、その後再接続されていることを表している。
注目する必要があるのが 2022-07-21 16:35:04.065 の最後のメッセージから 2022-07-21 16:35:10.578 の closed までの時間、約6秒の間がある。
つまり、この期間は「
ws.closed == False
だが、メッセージが受信されない」ことになる。pybotters の DataStore のような WebSocket のデータを頻繁に参照する bot においては、リクエストした REST API のレスポンスと同等のデータが DataStore に反映されるまで watch メソッドで待つと言ったユースケースが存在する。
そのユースケースの際、watch メソッドが無限待機にならないように
if not ws.closed:
と確認してから watch メソッドに入ったとしても、上記メッセージが受信されない期間に当たってしまうと無限待機になってしまう。対策
watch メソッドにタイムアウトを設定可能にする
Pros: 簡単な実装でタイムアウトさせて無限待機を回避できる
Cons: 正しくないタイムアウトが発生する場合がある
WebSocket open 時のコールバックに store.initialize を設定できるようにする
Pros: REST API によるデータから無限待機を回避できる
Cons: REST API によるデータで必ず watch メソッドがイテレーションするとは限らない(そもそも、この件に限らず open 時に initialize するべき)
WebSocket が切断されたら bot ロジックも終了させる.
Pros: 最も堅牢な方法でロジックにバグが起こりにくい
Cons: pybotters の WebSocket クラスを自動再接続されないものに変更する必要があり、書き方も大きく変わる
watch メソッドに WebSocket closed な例外を伝搬させる
Pros: 従来の書き方を大きく変更せず無限待機を対処でき、タイムアウトより正確
Cons: DataStore を WebSocket の概念に依存させる必要がある
The text was updated successfully, but these errors were encountered: