こんにちは!今日は、香港株のリアルタイム相場をプログラムで取得しているときに起こる「タイムアウト」の悩みを解決した方法をお話しします。投資のシグナル配信をしていたときに本当に困って、いろいろ試した結果たどり着いたテクニックです。
なんでタイムアウトしちゃうの?
私の経験だと、ふたつのパターンがあります。ひとつは、データを配信しているサーバーが混雑していて、単純に返事が遅くなるケース。もうひとつは、自分のパソコンやプログラムの中でデータの処理が詰まってしまい、次のデータを受け取れなくなるケース。後者は意外と見落としがちなので注意が必要です。
リクエストのしすぎに注意
昔は数秒おきに HTTP で「新しいデータありますか?」と問い合わせる方法を使っていました。でも銘柄が増えると、そのたびに接続と切断を繰り返すので、すぐにサーバー側の制限に引っかかってしまいます。リトライを増やすのは逆効果でした。
リアルタイムはWebSocketが安心
そこで今は WebSocket を使うようにしています。これは一度つないだら、サーバーから最新のティックが自動的に流れてくる仕組みです。私の環境では、AllTick の WebSocket API を使って香港株のリアルタイムデータを取っています。最初に「この銘柄をお願いします」と送るだけで、あとはどんどん届くので、接続のタイムアウトに悩まされることがなくなりました。プログラムを書くときも、受け取ったデータを表示したりキューに入れたりするだけなので、すごくシンプルです。
ちょっとした工夫で安定度アップ
たくさんの銘柄を一気に購読するのは避けて、小分けにして少しずつ送るようにしています。たとえば 10 銘柄ずつ、ほんの少し間を空けて送信すれば、サーバーにも自分のプログラムにも負担がかかりません。これだけで取りこぼしがグッと減ります。
万が一切れたときの自動復旧
どんなに安定していても、ネットワークの都合で接続が切れることはあります。そんなときのために、定期的に「生きてる?」という確認(ハートビート)を入れて、切れたことをすぐ検知できるようにしています。再接続するときは、すぐに何度も試すのではなく、1秒待ってダメなら2秒、4秒と間隔を伸ばしていくのがコツです。また、全部の銘柄をもう一度取り直すのではなく、エラーになったものだけを再購読するようにしています。
データの受け取り側もサボらせない
受け取った後の処理が遅いと、結局データが渋滞してしまいます。私は、受け取ったデータをすぐに一時的な待機列(キュー)に入れて、裏方の処理に回すようにしています。データベースへの保存も、1件ずつではなくある程度まとめて行うことで、書き込み待ちによる遅延をなくしています。
まとめ
これらの小さな工夫の積み重ねで、香港株のリアルタイムデータはかなり安定して取れるようになりました。もし同じようなストレスを感じている方がいたら、接続方法の見直しと、受け取ったあとの処理の分離から試してみるといいですよ。