Kafka から Pub/Sub への移行

このドキュメントは、ユーザーが管理する Apache Kafka から Pub/Sub への移行を考えている担当者が、機能、料金、ユースケースを確認し、検討することを支援するものです。以降の各セクションでは、一般的な Kafka のユースケースを示し、Pub/Sub で同じ機能を実現するための実践的な指針を提供します。

Pub/Sub の概要

Pub/Sub は、非同期のメッセージング サービスです。Pub/Sub は、イベントを生成するサービスと、イベントを処理するサービスを分離します。Pub/Sub は、メッセージ指向のミドルウェア、またはストリーミング分析用のイベントの取り込みと配信のパイプラインとして使用できます。いずれの場合も、パブリッシャー アプリケーションがメッセージを作成してトピックへ送信します。サブスクライバー アプリケーションでは、トピックに対するサブスクリプションが作成されてメッセージが受信されます。サブスクリプションとは、特定のトピックに関するメッセージの受信に関心があることを示す名前付きエンティティです。

Pub/Sub は、すべての Google Cloud リージョンで動作します。Pub/Sub は、パブリッシャー トラフィックを、リソースのロケーション制限ポリシーの定めに従ってデータ ストレージが許可されている最も近い Google Cloud データセンターに転送します。

Pub/Sub は、データフロークラウド ストレージCloud Run などのさまざまな Google Cloud サービスと統合できます。こうしたサービスは、Pub/Sub にメッセージをパブリッシュできるデータソースとして機能するように構成することや、Pub/Sub からメッセージを受信できるデータシンクとして機能するように構成できます。

Kafka の概要

Apache Kafka はオープンソースの分散型イベント ストリーミング プラットフォームで、これを使用すると、アプリケーションはイベント ストリームのパブリッシュ、受信登録、保存、処理を行えます。Kafka サーバーは、クライアント アプリケーションがやり取りするマシンのクラスタとして実行され、イベントの読み取り、書き込み、処理を行います。Kafka は、アプリケーションの分離、メッセージの送受信、アクティビティのトラッキング、ログデータの集計、ストリームの処理に使用できます。

Kafka クラスタ内で、クラスタ内の一部のノードがブローカーとして指定されます。ブローカーはプロデューサーからメッセージを受信して、ディスクに保存します。保存されたメッセージはトピックごとに編成され、クラスタ内の複数のブローカーに分割されます。トピックにパブリッシュされた新しいイベントは、トピックのパーティションの末尾に追加されます。次に、コンシューマは、ディスクから読み取られてコンシューマに送信されたメッセージをブローカーから取得できます。

Kafka と Pub/Sub の違いについて

次の図は、Kafka と Pub/Sub のスケーリング方法の違いを示しています。

パーティションを使用する Kafka と、パーティションを使用しない Pub/Sub のスケーリング方法。

上の図では、各 M がメッセージを表しています。Kafka ブローカーは、メッセージの水平行によって表される、順序付けされた複数のメッセージ パーティションを管理します。コンシューマは、パーティションをホストするマシンに基づいて、容量のある特定のパーティションからメッセージを読み取ります。Pub/Sub にはパーティションはなく、コンシューマは需要に応じて自動スケーリングするトピックから読み取ります。予想されるコンシューマ負荷の処理に必要とされるパーティションの数で各 Kafka トピックを構成します。Pub/Sub は、必要に応じて自動でスケーリングします。

機能の比較

次の表は、Apache Kafka の機能と Pub/Sub の機能を比較したものです。

Apache Kafka Pub/Sub
メッセージの順序指定 ○(パーティション内) ○(トピック内)
メッセージの重複除去 ○(Dataflow を使用)
プッシュ サブスクリプション × はい
デッドレター キュー
(処理不能メッセージ キュー)
バージョン 2.0 以降
履歴 ×
メッセージ ストレージ 利用可能なマシン ストレージによる制限のみ 31 日
トピックは、確認済みメッセージを含む、パブリッシュされたメッセージを最大 31 日間保持できます。これは、トピックの `message_retention_duration` プロパティによって構成できます
メッセージの再生
Locality MirrorMaker を使用してローカル クラスタを複製可能 構成可能なメッセージ ストレージ ロケーションを使用したグローバル分散サービス
ロギングとモニタリング セルフマネージド Cloud LoggingCloud Monitoring により自動化
ストリーム処理 ○(KSQL を使用) ○(Dataflow を使用)

Pub/Sub メッセージのストレージとリプレイについて

デフォルトでは、Pub/Sub は未確認のメッセージを最大 7 日間保持しますが、サブスクリプションの一番古いメッセージ(確認済みまたは未確認)の時期に応じて、確認済みメッセージも最大 7 日間保持するように Pub/Sub サブスクリプションを構成できます。確認済みメッセージを保持することで、タイムスタンプに基づいてこれらのメッセージの一部または全部をリプレイできます。タイムスタンプに基づいてメッセージをリプレイすると、タイムスタンプより後に受信したすべてのメッセージが未確認とマークされます。その場合、未確認メッセージは再配信されます。

サブスクリプションを事前に構成しなくても、オンデマンドで個別のサブスクリプションのスナップショットを作成できます。たとえば、新しいサブスクライバー コードをデプロイする際に、予期しない確認応答や誤った確認応答からの回復が必要になる可能性があるため、スナップショットを作成できます。

デッドレター トピックを使用した組み込みフェイルセーフ

Pub/Sub は、Kafka 2.0 のエラー処理と、Kafka Connect のデッドレター トピックの処理と同様の機能を備えています。メッセージが正常に配信されたことを Pub/Sub に通知するには、Pub/Sub トピックのサブスクライバーが、受信して処理するメッセージに対して確認応答します。サブスクライバーがメッセージをしばらく処理できない場合、Pub/Sub は、デッドレター トピックにこれらのメッセージを自動転送し、後でアクセスできるように保存できます。デッドレター トピックにメッセージを送信する前に Pub/Sub がメッセージを配信する回数は、構成できます

Dataflow を使用した Pub/Sub メッセージの重複除去

Pub/Sub は、パブリッシュされたメッセージを、すべてのサブスクリプションに対して 1 回以上配信します。通常、複数回の配信に対応するには、メッセージの処理時にサブスクライバーがべき等である必要があります。既存のサブスクライバーがべき等にオペレーションを実施できない場合は、Dataflow にメッセージの重複除去を組み込む方法もあります。サブスクライバーのメッセージの重複率が高い場合は、メッセージが正しく確認応答されていないか、確認応答の期限が早すぎる可能性があります。

Pub/Sub でのメッセージの順序指定

Kafka サブスクライバー アプリケーションがメッセージの順序を当てにしている場合、順序指定キーを使用すると、Pub/Sub でこの要件に対応できます。現在は、特定のリージョンにパブリッシュされたメッセージの順序が保証されます。メッセージの順序指定を利用するには、パブリッシャーとサブスクライバーがロケーション エンドポイントを使用して正しいリージョンにメッセージを転送するようにします。

自己ホスト型とマネージド サービスの責任範囲について

次の表では、Kafka を使用した自己ホスト型の機能と、Pub/Sub を使用した Google が管理する機能を比較します。

Apache Kafka Pub/Sub
対象 Kafka を他のロケーションに手動でデプロイする 高可用性と低レイテンシを目的としてすべての Google Cloud リージョンにデプロイ済み
障害復旧 独自のバックアップとレプリケーションを設計して維持する Google で管理
インフラストラクチャ管理 仮想マシン(VM)またはマシンを手動でデプロイして運用する。一貫したバージョニングとパッチを維持する必要がある。 Google で管理
容量の計画 ストレージとコンピューティングのニーズを事前に計画する Google で管理
サポート なし 24 時間対応の待機スタッフとサポート

Pub/Sub メッセージのサイズ上限と回避策

Kafka と Pub/Sub はどちらも、小さなメッセージを大量に処理する場合に良好に動作します。Kafka ではメッセージ サイズにハードリミットが課されず、許可されるメッセージ サイズを構成できますが、Pub/Sub ではメッセージが 10 MB に制限されています。次の図に示すように、最初にオブジェクトを Cloud Storage に保存すると、より大きなペイロードを間接的に送信できます。

パブリッシャーはオブジェクトを Cloud Storage に保存します。

上記の画像は、パブリッシャーが Cloud Storage にオブジェクトを保存するときに、保存されたオブジェクトへの URL を含むメッセージをパブリッシュすることを示しています。サブスクライバーは、URL を含むメッセージを受信すると、Cloud Storage からファイルをダウンロードし、通常どおり処理を続けます。

Kafka と Pub/Sub の費用の比較

Pub/Sub での費用の見積もりと管理の方法は、Kafka とは異なります。オンプレミスまたはクラウド上の Kafka クラスタの費用には、マシン、ディスク、ネットワーク、受信メッセージと送信メッセージの費用のほか、これらのシステムおよび関連するインフラストラクチャの管理と維持にかかるオーバーヘッド費用が含まれます。Kafka クラスタの管理では多くの場合、マシンを手動でアップグレードしてパッチを適用する必要があり、クラスタ容量の計画が必要になります。また、障害復旧の実装には、広範な計画とテストが必要です。さまざまな総費用を予測して集計し、実際の総所有コスト(TCO)を決定する必要があります。

Pub/Sub の価格には、パブリッシャーとサブスクライバーからのデータ転送と、確認応答されていないメッセージを一時的に保存するための費用が含まれます。消費したリソースに対して正確に料金を支払い、アプリケーションの要件と予算に応じて容量を自動的にスケーリングします。

信頼性の設計

Pub/Sub は、すべての Google Cloud リージョンで実行されるグローバル マネージド サービスです。Pub/Sub トピックはグローバルです。つまり、これらのトピックは、Google Cloud のすべてのロケーションで表示し、アクセスできます。ただし、メッセージはパブリッシャーに最も近く、リソース ロケーション ポリシーで許可されている単一の Google Cloud リージョンに保存されます。したがって、1 つのトピックが Google Cloud 全体の複数のリージョンに保存されることがあります。Pub/Sub は、ゾーンの停止に対する耐障害性を備えています。リージョンの停止中は、サービスが復元されるまで、そのリージョンに保存されているメッセージにアクセスできない場合があります。可用性の要件によっては、リージョンで障害が発生した場合にロケーション サービス エンドポイントを使用してフェイルオーバー ポリシーを実装できます。

セキュリティと認証

Apache Kafka は、クライアント証明書ベースの認証、Kerberos、LDAP、ユーザー名とパスワードなど、複数の認証メカニズムをサポートしています。認可については、Kafka はアクセス制御リスト(ACL)を使用して、どのプロデューサーとコンシューマーがどのトピックにアクセスできるかを決定します。

Pub/Sub は、Google Cloud ユーザー アカウントとサービス アカウントの認証をサポートしています。Pub/Sub トピックとサブスクリプションに対する詳細なアクセス制御は、Google Cloud の Identity and Access Management(IAM)によって管理されます。ユーザー アカウントを使用する場合、Pub/Sub オペレーションはレート制限されます。大容量トランザクションを実行する必要がある場合は、サービス アカウントを使用して Pub/Sub を操作できます。

Pub/Sub への移行の計画

Google Cloud への移行は、ワークロードの評価基盤の構築から始めます。

Pub/Sub Kafka コネクタを使用した段階的な移行

Pub/Sub Kafka コネクタを使用すると、Kafka インフラストラクチャを段階的に Pub/Sub に移行できます。

特定のトピックのすべてのメッセージを Kafka から Pub/Sub に転送するように Pub/Sub コネクタを構成できます。その後、個々のサブスクライバー アプリケーションを更新して、Pub/Sub からそれらのトピックのメッセージを受信しながら、パブリッシャー アプリケーションは引き続き Kafka にメッセージをパブリッシュできます。この段階的なアプローチでは、エラーとダウンタイムのリスクを最小限に抑えるよう、サブスクライバー アプリケーションの更新、テスト、モニタリングを繰り返し行います。

このセクションでは、このプロセスを 2 つのフェーズで可視化するのに役立つ 2 つの図を示します。次の図は、移行フェーズ中の構成を示しています。

移行の第 1 段階。

上の図では、現在のサブスクライバーが引き続き Kafka からメッセージを受信しており、Kafka ではなく Pub/Sub からメッセージを受信するようにサブスクライバーを 1 つずつ更新します。

Pub/Sub からメッセージを受信するように特定のトピックのすべてのサブスクライバーを更新したら、そのトピックのパブリッシャー アプリケーションを更新して Pub/Sub にメッセージをパブリッシュできます。その後、メッセージ フローをエンドツーエンドでテストしてモニタリングし、設定を確認できます。

次の図は、すべてのサブスクライバーが Pub/Sub からメッセージを受信した後の構成を示しています。

移行の第 2 段階。

時間の経過とともに、すべてのパブリッシャーが Pub/Sub に直接公開されるように更新され、移行が完了します。多くのチームが、このアプローチを使用してアプリケーションを並行して更新しています。Kafka は、正常に移行するために必要な期間だけ Pub/Sub と共存できます。

Pub/Sub のモニタリング

Kafka から Pub/Sub への移行中および移行後は、アプリケーションをモニタリングすることが重要です。Pub/Sub は Cloud Monitoring を使用して指標をエクスポートします。これにより、アプリケーションのパフォーマンス、稼働時間、全体的な状態を可視化できます。たとえば、未配信メッセージの数をモニタリングすることで、サブスクライバーがメッセージのフローに対応し続けることができます。未配信のメッセージをモニタリングするには、最も古い未確認のメッセージのタイムスタンプが特定のしきい値を超えた場合のアラートを作成します。送信リクエスト数の指標をモニタリングするとレスポンス コードを調べることで、Pub/Sub サービス自体の正常性をモニタリングできます。

次のステップ