ミドルウェアとウェブフック
長くパッケージソフトウェアとしてのミドルウェアを開発してきて、ミドルウェアとウェブフックの組み合わせがとても良いと感じているので、雑にまとめていこうと思います。
まとめ
ミドルウェアとウェブフックの組み合わせはお勧め。
戦略
ミドルウェアに永続化情報を持たせない
- ミドルウェアから直接データベースを引く仕組みを持たせない
- ミドルウェアにプラグインの仕組みを持たせない
データベースを直接引く仕組みを持たせない
自分がミドルウェアを開発したときは、ミドルウェアがデータベースを引く仕組みを持っているというのが一般的でした。
ただこれ、どのデータベースに対応するのかという問題がでてきます。
PostgreSQL や MySQL や Oracle や SQL Server などなど、対応するデータベースが多いと、ミドルウェアの開発者は大変です。
RDB だけでなく LDAP や Redis といったデータベースも求められたりする場合があります。
それぞれに接続用のドライバーとコネクションプールが必要になりますし、
また RDB であれば SQL をどう持たせるのかという問題もあります。
なので、自分としては絶対に自社開発のミドルウェアにはデータベースを引かせる機能を持たせないと決めています。
やりたくなかったフロー
どう解決したのか
そこで導入したのがウェブフックです。ウェブフックは HTTP でデータを指定されたエンドポイントに送信する仕組みです。
つまり、ミドルウェアがウェブフックをアプリケーションに送信し、
アプリケーションがデータベースを引いて判断をするという仕組みを作って貰うようにしました。
そもそもアプリケーションは必ずデータベースを引くので、
であれば、アプリケーションが引けば良いと考えました。
ウェブフックはアプリケーション側にもメリットがあります。
- ただの HTTP のため処理を書くのが簡単
- リアルタイムな通知になるため、ポーリング不要で気軽にトリガーとして利用できる
プラグインの仕組みを持たせない
よくミドルウェアでは、プラグインを追加できるという仕組みが多いです。
ただ、プラグインを追加できるということは、ミドルウェアの開発者がプラグインの仕様を決めなければならないということです。
また、プラグインの影響でミドルウェアの動作に影響が出てしまうという問題もあり、プラグインの仕組みは持たせないようにしています。
どう解決したのか
これもウェブフックの仕組みを利用することにしました。プラグインほど柔軟ではありませんがウェブフックの 戻り値 を利用して挙動を変更する仕組みを追加しました。
戻り値によりミドルウェアの挙動を変えられるようにしています。
ミドルウェアにおけるウェブフックの方針
ウェブフックはただの HTTP なので、実装自体はシンプルに見えますが、実際実装していくとめんどくさいことが多いです。
ミドルウェアにおけるウェブフックの方針を紹介します。
ウェブフックのセキュリティ
ウェブフックは主に SaaS で利用されることもあり、セキュリティはとても重要です。
ただ、ミドルウェアの場合は、ウェブフックの送信側と受信側の両方が同じ運用者になるため、そこまで頑張る必要がない場合が多いです。
そもそもミドルウェアとアプリケーションの通信をプライベート IP 化したりすれば、HTTPS ですらなくても良かったりもするでしょう。
ベーシック認証と mTLS に対応しておけば、充分と考えています。
ウェブフックでセキュリティに悩んだら mTLS を使うと良いと思っています。
ウェブフックの Proxy
HTTP クライアントライブラリの HTTP Proxy 機能を使う必要があると思います。特にエンタープライズで利用する場合は、Proxy が必須になることが多いです。
ウェブフックの順番
ウェブフックの順番が保証されていると嬉しい場合がたまにあります。
例えば 接続開始 と 接続終了 のウェブフックはできるだけ接続開始が先に届いてほしいですし、接続開始のウェブフックの処理が終わったタイミングで接続終了のウェブフックを送信してきて欲しいはずです。
そのため、ミドルウェア側でキューを実現し、この仕組みを実現しています。
ウェブフックのリトライ
ウェブフックで問題になるのが、リトライです。
どのくらいの間隔でリトライすべきか、どのくらいの回数リトライすべきかというのは難しい問題です。
自社製品ではリトライをミドルウェア側では 行わない という判断をしています。
そのため、自社製品ではリトライは行わず、ウェブフックエラーログを出力するという戦略をとっています。
エラーログを書き出すことでそのログを利用して、再度ウェブフックを送るといった仕組みを作ったりすることができます。
資料
SaaS よりのウェブフックに関しては以下のサイトがとても良くまとまっています。特にセキュリティに関してはとても参考になります。
Discussion