Webhooksとポーリング
この記事では、ウェブフックとポーリングを比較し、それぞれのアプローチの利点と欠点を分析し、どのような場合にどちらを使用すべきかを議論します。
Webアプリケーションを構築する際には、複数のサービスを使用することがよくあります。ほとんどの場合、それらは異なる複数のWebサービスが協力して動作するシステムで構成されています。このような複数のサービスを持つWebアプリケーションにおいて、データをどのように伝達するかは、すべての開発者が考慮する必要がある問題です。
この問題を解決するために、2つのアプローチが主流となっています:ウェブフックとポーリングです。各方法は、あるサービスから別のサービスにデータを取得し配信するための独自の方法を提供します。どちらを選ぶかは、アプリケーションの効率性、リアルタイム性能、および全体的なユーザーエクスペリエンスに大きな影響を与える可能性があります。この記事では、ウェブフックとポーリングを比較し、それぞれのアプローチの利点と欠点を分析し、どのような場合にどちらを使用すべきかを議論します。
ポーリングとは?
ポーリング(一般的にAPIポーリングとも呼ばれる)は、クライアントが一定の間隔で(たとえば、x秒ごとに)特定のデータを要求し、サーバーがリクエストされたデータを返すプロセスのことです。
これは、定期的に「新しいデータがありますか?」と尋ねるようなものです。ポーリングはHTTPリクエストを介して実装することができ、クライアントがサーバーにGETリクエストを送り、サーバーが要求されたデータを返します。
JohnがDoc.AIというAIドキュメント管理製品と、ユーザーアイデンティティ管理のためにLogtoを使用していると想像してみてください。
FrankはJohnの製品にサインアップし、自分の個人アカウントを作成したユーザーです。ある日、Frankは彼の友人Davidが作成したワークスペースに参加します。その時点で、JohnはFrankに追加の機密リソースへのアクセスを許可する前に、MFA(多要素認証)をオンにするようにメールで依頼したいと考えています。
Johnの製品バックエンドは、FrankがDavidのワークスペースに参加した時点を把握するために、関連するAPIを常にポーリングする必要があります。
ウェブフックとは?
ウェブフック(「HTTPコールバック」とも呼ばれる)は、イベントが発生したときにサーバーがクライアントにデータを送信するリアルタイムデータ通信の仕組みです。クライアントがデータを要求するのではなく、ウェブフックは更新があるたびにクライアントにデータをプッシュします。
これは、アプリケーション用のインボックスのようなものです。たとえば、新しいユーザーがサインアップしたり、支払いが行われたりするなどの特定のイベントが発生するたびに、ウェブフックはそのイベントを通知するメッセージをインボックスにドロップします。
前述のDoc.AIの例を使用してポーリングを説明したのと同様に、FrankがDavidのワークスペースに参加したかどうかを知るためにウェブフックを使用している場合、シーケンス図は次のようになります:
重要な違い
- リクエストの起源 ポーリングはクライアントによって開始されます(この例では、Doc.AIがクライアントでLogtoがサーバー)し、ウェブフックはイベントによってトリガーされ、サーバーによって開始されます。
- リソース消費 ポーリングは定期的にリクエストを送信するため、計算リソースを無駄にし、効率が低くなります。一方、ウェブフックはサーバーにより「オンデマンド」で開始されます。ポーリングと比較して、クライアントとサーバーの両方のリソース消費ははるかに少ないです。
- タイミング ポーリングはクライアントが開始するため、クライアントがデータ取得のタイミングを制御できます。しかし、ウェブフックはサーバーが開始するため、クライアントはデータを受信して処理するだけです。しかし、両者のメカニズムの違いにより、ウェブフックはリアルタイムのデータ同期を実現できますが、ポーリングではそれができません。
どちらを選ぶべきか?
ポーリングとウェブフックのメカニズムに基づいて、一般的な実践は、データが頻繁に更新され、リアルタイムの要件が厳しくない場合のみポーリングを選択することです。その他のケースでは、ウェブフックがより良い選択となるでしょう。
ただし、ウェブフックを使用する場合は、開発者は以下の懸念を考慮する必要があります:
- システムが取得したデータに高度に依存している場合、ウェブフックが失敗してデータが同期できない場合にデータを取得するためのバックアッププランを検討する必要があります。それには、ポーリングやウェブフックに再送メカニズムを持たせることなどが含まれますが、これに限られません。
- クライアント側のエンドポイントでウェブフックを受信する際に、APIシークレットやコンテンツ署名の検証などを実施し、ハッカーが偽装したウェブフックでクライアントを攻撃することを防ぐ必要があります。
- ウェブフックは重複したリクエストを送信する場合があるため、この場合はデータの重複や不整合を防ぐための適切な処理が必要です。
Logtoは非常に人気の高いユーザー識別ソリューションとして、豊富なウェブフックシーンと卓越したセキュリティを提供しています。Logtoをあなたのプロダクトのアイデンティティシステムとして使用すると、さまざまなアプリケーションシーンに簡単に統合できます。