この記事は 地震情報アプリ界隈 Advent Calendar 2021 の4日目の記事です。
自己紹介
趣味で KyoshinEewViewer for ingen というソフトウェアを作成しています。
https://svs.ingen084.net/kyoshineewviewer/
興味あったら見ていってください。
モチベーション
この1年で地震観測というジャンルが非常に活発になってきたように思います。
主に、強震モニタ関連のソフトを並べてじゃらじゃら音を鳴らしたりソフトが反応する様子を写した動画や生放送から、揺れたことがわかりやすい物体を置いたカメラ映像をあわせて動画や生放送という形にする方向にシフトしてきています。
ところで、強震モニタに対しての負荷については考えたことはありますでしょうか。
みなさん沢山のソフトを起動して比較などを行っていますが、これらは各ソフトごとに個別に強震モニタから画像を取得しています。
そのため、ソフトを起動すればするほど強震モニタへの負荷が増えてゆき、他の利用者やNIEDに迷惑がかかっています。(現在進行系)
そこで、中間のソフトを噛ませることにより負荷をある程度軽減させよう、というのが今回の趣旨です。
使用技術
利便性
主なターゲットとしては自力で証明書の作成やキャッシュサーバーを建てることができないユーザーなので、証明書の生成や登録、hostsの書き換え、キャッシュの内容などをすべてアプリ側で実装することとしました。
フレームワーク・ライブラリ
仕事ではPHPとかGoとかScalaとかを書いていますが、命とお金と諸々の次ぐらいにC#が好きなので ASP.NET Core の Minimal APIを使ってみることにしました。
(結局はミドルウェア1つで完結したせいであんまり使ってない)
ほかにもWindowsサービス化などでもフル活用しています。
通常の強震モニタはHTTPですが、長周期地震動モニタはHTTPSです。なので証明書を作成する必要がありました。
こちらはBouncyCastleを使用して証明書を作成し登録することで対応しました。
ポイント
オリジンへのリクエスト
普通のサーバーだとリクエスト元とプロキシサーバーが別だったりするのでなんとかるのですが、これはローカルサーバーのプロキシなのでちょっと工夫が必要でした。
まずDNSのレコードが引けませんから、GoogleのDNSのAPIを使用しIPアドレスを取得、HttpClientへは生のIPアドレスを取得しつつ明示的にHostヘッダーを設定しリクエストを送信しました。
オリジンがSNIとか使ってるともっと工夫が必要になります。。。
ちなみに、オリジンの証明書の検証は現状していません。ご注意ください!
キャッシュ
今回は IMemoryCache
を使用しました。が、完成当初メモリリークがすごく半日起動で1GB消費したり散々でした・・・。
.NET には昔から続く問題として、LargeObjectHeap(LOH)の断片化という問題があります。
プラットフォームによっても異なるためWindowsの話をしますが、具体的にはオブジェクト単体のサイズが85kbを超えると専用の場所にインスタンスが配置されるのですが、オブジェクトの開放など色々あってデータが配置できない空間というのが発生してしまい、メモリ使用量が増えていってしまうという問題です。
今回の実装では80kb以上のレスポンスはキャッシュしないようにすることで対処を行いました。
利用方法
インストール
証明書のインストール・hostsファイルの書き換えを行うため起動には管理者権限が必要です
起動し、上下カーソルキーで 1. サービスのインストール
を選択しEnterキーを押すことでサービスがインストールされ、インストールしたPCでの強震モニタへのアクセスがプロキシによって統合されます。
なお、インストール後は実行ファイルのフォルダを変更しないでください。変更したい場合はアンインストールを行ってから変更してください。
アンインストール
起動し、上下カーソルキーで 2. サービスのアンインストール
を選択しEnterキーを押すことでアンインストールすることができます。
このままでは証明書がインストールされっぱなしになるので、もう一度起動し 3. 証明書の削除
を選択しEnterキーを押してください。
これでアンインストールは完了です。
トラブルシューティング
ソフトの終了時にhostsファイルを戻す動作を行いますが、異常終了した場合などは強震モニタへアクセスできなくなることがあります。
その場合は再度アプリを起動するか、管理者権限でhostsファイルを開き、強震モニタのドメイン名の設定行を削除してください。
さいごに
リポジトリはこちらです: https://github.com/ingen084/KyoshinMonitorProxy
ごめんなさい、忙しくてほぼプロトタイプのまま公開する運びになってしまいました…。
やる気のある方、PRお待ちしております。。。。
会社の方のアドベントカレンダーにも参加する予定なのでお楽しみに!