探索使用API Gateway为Kafka带来的好处

Yuan Bao

March 31, 2023

Technology

Kafkaの概要

Kafkaは、もともとLinkedInによってZookeeperの協調を利用した分散メッセージングシステムとして開発され、複数のパーティションとレプリカを備えていました。その後、Apache Software Foundationに寄贈されました。その優れたスループット、永続性、水平スケーリング能力のおかげで、Kafkaは業界で広く採用されている分散ストリーム処理プラットフォームとなりました。

Kafkaには主に3つのユースケースがあります:

  • メッセージングシステム: これが最も一般的なユースケースで、バックエンドのマイクロサービス間のメッセージ通信に使用されます。Kafkaはシステムの分離、トラフィックシェーピング、非同期通信を可能にします。
  • ストレージシステム: Kafkaはメッセージをディスクに保存し、マルチレプリカ機能を備えているため、データ永続化システムとして使用するのに適しています。これにより、データ損失のリスクが大幅に低減されます。
  • ストリーム処理プラットフォーム: Kafkaは、ウィンドウ処理、結合、変換などの操作を含むストリーム処理のための包括的なライブラリを提供します。

Kafkaの技術アーキテクチャ

標準的なKafkaクラスターは、複数のProducer、Consumer、Broker、およびZookeeperクラスターで構成されています。ZookeeperはKafkaクラスターのコア制御コンポーネントであり、クラスターメタデータの管理やコントローラーの選出を担当します。ProducerはメッセージをBrokerに送信し、Brokerはメッセージをディスクに保存します。ConsumerはBrokerからメッセージを購読し、消費します。

コアコンセプト

Kafkaトピックとパーティション

Kafkaでは、メッセージはトピックによって分類されます。Producerは通常、メッセージを送信する際にトピックを指定し、Consumerは通常、トピックを購読してメッセージを消費します。

トピックは通常、複数のパーティションで構成され、各パーティションには異なるメッセージが含まれます。メッセージがKafkaに送信されると、パーティションルールに基づいて適切なパーティションに保存されます。適切なパーティションルールを設定することで、メッセージを異なるパーティションに均等に分散させることができます。

ProducerとConsumer

Producerはメッセージを送信する側を指し、メッセージを作成してKafkaブローカーに送信する役割を担います。

Consumerはメッセージを受信する側を指し、Kafkaクラスターのブローカーに接続し、特定のトピックを購読してメッセージを消費します。

Kafkaブローカー

Brokerは、Kafkaの独立したノードまたはインスタンスと見なすことができます。Kafkaクラスターは1つ以上のBrokerで構成されます。

kafka cluster

KafkaにAPIゲートウェイが必要な理由

ほとんどの場合、バックエンドのマイクロサービス間でKafkaをメッセージシステムとして使用する際、開発者はプロジェクトで使用される言語に応じて異なるKafka SDKを選択し、ProducerまたはConsumerクライアントを開発する必要があります。

しかし、このアプローチにはいくつかのシナリオで制限があります。例えば、クライアントが直接Kafkaに接続する必要がある場合などです。このような場合、呼び出し側とKafkaの間にAPIゲートウェイを追加することで、サービスの分離が可能になります。これにより、呼び出し側はKafkaや特定の通信プロトコルを気にする必要がなくなり、呼び出しコストが削減されます。さらに、APIゲートウェイはKafkaが公開するAPIに対してセキュリティサポートやトラフィック制御機能を提供し、Kafkaサービスの安定性を確保します。

Kafkaへの直接接続

Kafkaをメッセージキューミドルウェアとして使用する際、直接接続すると以下のような制限やリスクが生じます:

  1. 異なるConsumerはKafkaの通信プロトコルに適応する必要があります。
  2. Kafkaは公開されたAPIのセキュリティやトラフィック制御などの問題に対するソリューションを提供していません。レートリミットポリシーがない場合、一部のProducerやConsumerが過剰な計算リソースや帯域幅を消費する可能性があります。
  3. ConsumerとProducerの両方がKafkaクラスターのトポロジーを認識する必要があり、Kafkaクラスターの変更によって影響を受ける可能性があります。

APIゲートウェイによるKafkaの使いやすさの向上

通信プロトコルの変換

APIゲートウェイを使用してKafkaをプロキシする場合、クライアントはHTTPプロトコルを使用してAPIゲートウェイと通信し、APIゲートウェイはKafkaのプロトコルを使用してKafkaと通信します。APIゲートウェイはクライアントのメッセージをKafkaのプロトコルに変換するため、クライアントが異なるKafkaメッセージプロトコルに適応する必要がなくなります。これにより、開発コストが大幅に削減され、使いやすさが向上します。

レートリミット

リソースが限られている場合、Kafkaノードのサービス容量も制限されます。この制限を超えると、サービスがクラッシュし、連鎖反応を引き起こす可能性があります。レートリミットはこれを防ぐことができます。従来のKafkaアーキテクチャでは、クライアントはSDKを介してKafkaと通信します。しかし、クライアントやリクエストの数が多い場合、Kafkaノードのマシン負荷に影響を与え、Kafkaの機能の安定性に影響を及ぼす可能性があります。アーキテクチャにAPIゲートウェイを追加することで、APIゲートウェイが得意とするさまざまな次元のレートリミット機能をKafkaクラスターに簡単に追加できます。これらの機能には以下が含まれます:

  • 固定時間ウィンドウアルゴリズムを使用して、指定された時間枠内に単一のクライアントがサービスに対して行えるリクエストの総数を制限します。
  • 単一のクライアントが単一のサービスに対して行える同時リクエスト数を制限します。
  • リーキーバケットアルゴリズムを使用して、単一のクライアントのサービスに対するリクエストレートを制限します。

これらのレートリミット機能を実装することで、Kafkaノードを効果的に保護し、その安定性を確保できます。

認証サポート

認証もAPIゲートウェイの強力な機能です。従来のKafkaアーキテクチャでは、ほとんどのKafkaポートは内部ネットワーク内でアクセスされます。パブリックネットワークからのアクセスが必要な場合、セキュリティを確保するために複雑な設定が必要です。APIゲートウェイの認証機能を使用してKafkaをプロキシすることで、Kafkaが公開するポートを保護しつつ、クライアントのアクセスを選択的に許可または拒否できます。

監視機能

現在、Kafka向けの監視製品は多数あります。例えば、Kafka EagleKafka MonitorKafka Managerなどです。それぞれに長所と短所があります。汎用的な監視機能を実現するのは難しく、カスタマイズコストも比較的高いです。さらに、内部監視システムとの統合も困難です。Kafkaの監視システムを一から構築するのもコストがかかります。Kafkaの監視情報は多くの側面をカバーしており、Kafka自体が提供する監視メトリクスはJava Management Extension(JMX)を通じて複雑な処理が必要です。

アーキテクチャにAPIゲートウェイを追加することで、クライアントとAPIゲートウェイの通信はHTTPプロトコルに基づくため、HTTPプロトコルに基づく監視ソフトウェアのエコシステムが非常に豊富です。これにより、非常に低コストでKafkaサービスに対する包括的な可観測性を提供できます。

Kafkaのローリングアップグレード

Kafkaサービスはブローカーアドレスを通じて公開され、ProducerとConsumerはKafkaクラスターに接続するために設定情報にこれらのアドレスを提供する必要があります。アドレスリストは通常、host1:port1host2:port2の形式で、1つ以上のアドレスをカンマで区切って含めることができます。

しかし、この設定方法には制限があります:Kafkaブローカーアドレスが固定され、サービスが安定している必要があります。Kafkaクライアントはすべてのブローカーアドレスが利用可能であると仮定し、ランダムに1つを選択して使用します。これにより、ローリングアップグレード中に問題が発生する可能性があります。クライアントはどのブローカーを使用すべきかを認識せず、ブローカーアドレスを変更するにはすべてのProducerとConsumerクライアントに変更を加える必要があります。

Kafka用のAPIゲートウェイを使用すると、ブローカーアドレスをゲートウェイ層で設定でき、クライアントはKafkaブローカーの具体的な詳細に注目する必要がなくなります。ブローカーアドレスが変更されても、クライアントは影響を受けません。これにより、クライアントに影響を与えることなく、Kafkaのローリングアップグレードを簡単に実行できます。

まとめ

このように、KafkaにAPIゲートウェイを追加することで、APIゲートウェイの豊富な機能を活用して、Kafkaサービスに対してレートリミット、認証、監視、ローリングアップグレードの機能を簡単に提供できます。

Apache APISIXを使用したKafkaの拡張

Apache APISIXは、Apache Software Foundationの下で開発された高性能なリアルタイムAPIゲートウェイです。ロードバランシング、動的なアップストリーム、カナリアリリース、サーキットブレーカー、認証可観測性など、高度なトラフィック管理機能を提供します。APIゲートウェイとして、APISIXは企業がAPIやマイクロサービストラフィックを迅速かつ安全に処理するのを支援し、Kubernetes Ingressやサービスメッシュで広く使用されています。Kafkaサービスの前にAPISIX層を追加することで、企業はプラットフォームの豊富なプラグインシステムを活用して、メッセージプロキシ、ログ配信、レートリミット、監視などの機能を有効にできます。APISIXを使用することで、クライアントからサーバーへの南北トラフィックと、企業のマイクロサービス間の東西トラフィックの両方を効果的に処理できます。

APISIX and Kafka

Kafkaメッセージのプロキシ

APISIXはKafkaメッセージのプロキシ機能を提供します。クライアントは直接APISIXと通信し、APISIXはクライアントとKafkaの間のメッセージプロトコル変換を処理します。

APISIXでKafkaプロキシ機能を有効にするには、以下のようにルートを追加するだけです:

curl -X PUT 'http://127.0.0.1:9180/apisix/admin/routes/Kafka' \
    -H 'X-API-KEY: <api-key>' \
    -H 'Content-Type: application/json' \
    -d '{
    "uri": "/Kafka",
    "plugins": {
        "Kafka-proxy": {
            "sasl": {
                "username": "user",
                "password": "pwd"
            }
        },
        "limit-count": {
            "count": 2,
            "time_window": 60,
            "rejected_code": 503,
            "key_type": "var",
            "key": "remote_addr"
        }
    },
    "upstream": {
        "nodes": {
            "Kafka-server1:9092": 1,
            "Kafka-server2:9092": 1,
            "Kafka-server3:9092": 1
        },
        "type": "none",
        "scheme": "Kafka"
    }
}'

このリクエストは、APISIXにURI /Kafkaを持つルートを作成し、3つのKafkaブローカーノードをアップストリームサービスとして関連付けます。kafka-proxyプラグインを使用して、KafkaリクエストにSASL/PLAIN認証を追加します。APISIXの設定はホットアップデートをサポートしているため、Kafkaブローカーを変更してもAPIゲートウェイの再起動やクライアントへの影響はありません。

さらに、このルートに対してlimit-countプラグインを有効にして、レートリミットのサポートを提供します。プラグインの設定では、60秒の間隔で2つのリクエストのみを許可し、それ以上のリクエストはAPISIXによって503ステータスコードで拒否されます。

ログプッシュ

APISIXのkafka-loggerプラグインを使用すると、ログをJSONオブジェクトとしてApache Kafkaクラスターにプッシュできます。

以下は設定例です:

curl http://127.0.0.1:9180/apisix/admin/routes/1 \
-H 'X-API-KEY: edd1c9f034335f136f87ad84b625c8f1' -X PUT -d '
{
    "plugins": {
       "kafka-logger": {
            "brokers" : [
              {
                "host" :"127.0.0.1",
                "port" : 9092
              },
              {
                "host" :"127.0.0.1",
                "port" : 9093
              }
            ],
           "kafka_topic" : "test2",
           "key" : "key1"
       }
    },
    "upstream": {
       "nodes": {
           "127.0.0.1:1980": 1
       },
       "type": "roundrobin"
    },
    "uri": "/hello"
}'

APISIXはKafkaメッセージのプロキシ機能だけでなく、トレーシング、メトリクス、ロギング機能もさまざまなプラグインを通じて提供し、可観測性のすべての側面をカバーします。APISIXで簡単なプラグイン設定を行うことで、Prometheus、Skywalkingなどの他の可観測性サービスとの統合が可能になり、Kafkaクラスターの監視機能が強化されます。

まとめ

この記事では、KafkaにAPIゲートウェイを実装する利点を強調し、Apache APISIXをケーススタディとして、Kafkaに対してレートリミット、認証、監視、ローリングアップグレードなどの機能を提供する方法を紹介しました。

Tags: