見出し画像

将棋クエスト履歴検索β 開発日誌 棋譜取得処理をヘッドレスブラウザによるダウンロードからソケット通信に切り替えました

この記事は、マガジン 『将棋クエスト履歴検索β 開発日誌』の記事です。
過去の記事も以下よりお読みいただけます。

将棋クエスト履歴検索βとは ( おなじみの方はここは読み飛ばしてOK )

「将棋クエスト履歴検索β」 は将棋クエストの対局履歴の検索サービスです。一度検索した対局履歴は履歴検索βのサーバーに保存されますので、公式Webや公式アプリには表示されなくなる過去の履歴も振り返ることができます。

棋譜をダウンロードして解析や検討に活用したり、スマホからご利用の方はぴよ将棋ボタンからぴよ将棋アプリで棋譜を開いて解析・検討をすることもできます。ぴよ将棋アプリのトップ画面にも「将棋クエスト棋譜検索」ボタンとして掲載いただており、ぴよ将棋アプリと履歴検索βの検索ページの画面往復をスムーズに行っていただけます。

履歴検索β上では、レーティングの遷移をグラフで確認したり、対局履歴のCSVをダウンロードしてお手元に記録として保存しておくこともできます。

今回の更新内容

2022年11月6日の更新で、履歴検索βサーバー上で実施している、棋譜の取得処理方式をヘッドレスブラウザによる取得方式からソケット通信による取得方式に切り替えました。

切り替えの経緯は以下のツイートをご参照ください。

旧方式はブラウザ版の将棋クエストのサイトから棋譜が入手できることが前提条件となっておりましたので、今回の更新により、ブラウザ版の将棋クエストがサ終となっても、皆様には今まで通り棋譜ファイルをダウンロードいただける見込みです。
また、棋譜ファイルをダウンロードいただく準備が整うまでこれまで数秒だったのが1秒程度まで短縮されましたので、使い勝手も向上していると思います。

前述のツイート内容の移行案を10月8日からテストしており、11月6日から本番稼働させた運びとなります。切り替えの案内については以下にツイートしています。

新旧の方式についてご紹介します。

旧方式

旧方式 は、ブラウザ版将棋クエストの対局結果ページを、履歴検索βサーバー上で動作しているブラウザ(画面のないヘッドレスブラウザと呼ばれる自動化処理に向いているブラウザです)で開き、対局ページに表示されている棋譜の出力ボタンを、自作のプログラムから自動的に押すことによって、棋譜を生成するJavaScriptのコード(ブラウザ版将棋クエストの対局結果ページのJavaScriptです)を動作させ、対局結果ページに表示されるCSA形式の棋譜文字列を自作プログラムから読み取り、履歴検索βサーバーに保存する方式でした。

ご参考コード

履歴検索βで使用しているコードそのものではないのですが、ブラウザ版クエストから棋譜を取得できるプログラムを以下に公開しています。サ終後は確実に使用できなくなりますが、ご興味のある方は見てみてください。

サイトのHTMLに棋譜文字列が書いてある場合はヘッドレスブラウザは不要ですが、ブラウザ版将棋クエストの棋譜文字列は、サイト上でボタンを押すなどの操作をすることによって動作するJavaScripitによって初めて生成・表示される情報なため、このようなヘッドレスブラウザを使ったボタン操作を自動化するという方式にしていました。

キューについて
皆様が履歴検索βで対局履歴を検索いただいた際、バックエンドでは棋譜の取得jobをキューにキューイングするようにしています。履歴検索βサーバーでは、定期的にキューから1つjobを取り出してはヘッドレスブラウザを起動し棋譜を取得・サーバーに保存し、皆様にダウンロードいただけるようにしていました。

キューからのjob取り出し処理は1秒間隔で行っており、ヘッドレスブラウザは最大5並列で起動可能としていました。5という数字はサーバーへの負荷をテストして決めました。またキューからのjob取り出しは単純なFIFOではなくユーザー単位にラウンドロビンで取り出すようにしていました。これにより検索いただいているみなさまが何名いても平等に棋譜ダウンロードが可能となる機会が訪れるようにし、既存のユーザーさんの棋譜取得処理がすべて終わるまで、それ以降のユーザーさんの棋譜取得処理が全くされないということはなく、棋譜のダウンロードが可能となる状態までの待ち時間を全ユーザーさんで平均化しています。

切り替え後の方式

前述のツイートの通りブラウザ版将棋クエストがサ終するという告知がされました。ヘッドレスブラウザでアクセスするサイトがなくなるということです。ブラウザ版将棋クエストではなく、将棋クエストのアプリが行っている棋譜取得処理の通信を真似たプログラムを自作することにしました。

もともと、対局履歴の検索処理については、将棋クエストのアプリの通信を真似たクライアントを作成済で、すでに稼働済みでしたので、棋譜の取得処理についても同じようなプログラムを作ることにしました。

アプリの通信をキャプチャし通信を見てみると棋譜の取得処理は、対局履歴の検索と同じく、WebSocketと思われる通信をしていました。
WebSocketではAPI(コマンド)名と必要なパラメタをソケットに書き込むとそのAPI(コマンド)のレスポンスが返ってきますので、アプリの通信のパケットキャプチャから、目的の通信(今回は棋譜の取得)を行っているAPI名とパラメタを調べ、同じようにソケットに書き込むプログラムを作成することで、アプリの通信を模倣するプログラムを書くことができます。

今回試してみたところ、1棋譜が約1秒で取得できましたので、旧方式よりも高速に取得することが可能となりました。

また棋譜取得のためにヘッドレスブラウザを起動することも不要となりましたので、ヘッドレスブラウザを起動できる環境(某VPSを利用)は不要となり、PHPやPythonなどのスクリプトを動かすことのできるサーバー(某レンタルサーバーを利用)のみで実現可能となりました。

また、jobを格納するキューも別サーバー(某クラウドサービスの仮想マシン)に置いていたのですが、これも棋譜取得処理を稼働させている某レンタルサーバーに集約しました。キューはプログラム(nodejs)で書いていましたが、某レンタルサーバーでnodejsは動かないのとキューとして常駐するタイプのプログラムは動かないので、RDB(SQLite)で実現することにしました。

某クラウドの仮想マシンの課金を解除できる日も近づいてきました。

今後の展望

以前の記事でもぼやいているとおり、履歴検索β運用のための時間的・金銭的コストを削減するために、前述した某VPSの仮想マシンと某クラウドの仮想マシンを捨てたいと思っています。

そのためには、1)ヘッドレスブラウザ環境(on 某VPSの仮想マシン)を捨てる、2)job管理キュー環境(on 某クラウドの仮想マシン)を捨てる、3)データベース(on 某VPS の仮想マシン上の MongoDB)を安価な環境に移行するの3つが必要で、今回1) と 2)を実現することができ、コスト削減計画を2歩進めることができました。

あとは3) データベース(on 某VPS の仮想マシン上の MongoDB)の移行ですが、これも安価にすませるために某レンタルサーバーで使える機能で済ませるような方式(RDB(SQLite)にしてしまおうと思っています)を画策中です。

某VPSや某クラウドサービスの仮想マシンは当時手軽に入手できるLinux環境として、DB(MongoDB)の構築やヘッドレスブラウザによる自動化やプログラム開発の勉強の意味も兼ねて課金していましたが現在その分野の勉強の役割は薄まっており、履歴検索βを稼働させるプログラムやDBだけが残っている状態でした、オーバー課金です。もう少しで捨てることができそうです。

ちなみにこのサービスは2015年に開発開始しましたが、同じようなサービスを今の時代に作り始めるとしたら"仮想マシン"という選択肢はコスト面のメリットが美味しくない限りは選ばない可能性が高いですね。
開発開始から7年経過(途中、2017年から5年以上の放置期間を含む)した2022年現在、インフラの構築やアプデなどの運用をあまり頑張らずに、自分のサービスの機能改善に注力できるようお膳立てしてくれる環境を提供してくれる選択肢が増えており、良い時代になってきています。

また開発日記を書くかもしれません。ご興味のある方はぜひマガジンを以下より購読してみてください。

ここまで読んでいただきありがとうございました。



この記事が気に入ったらサポートをしてみませんか?