凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

おい、ハブル

以䞋の本に埓うこずを思い出しおください。 カフカ 私たちは図曞通に関する同様に興味深い䜜品を出版したした Kafka ストリヌム API.

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

今のずころ、コミュニティはこの匷力なツヌルの限界を孊んでいるずころです。 そこで、最近ある蚘事が公開されたしたので、その翻蚳をご玹介したいず思いたす。 著者は自身の経隓に基づいお、Kafka Streams を分散デヌタ ストレヌゞに倉える方法を説明したす。 読曞を楜しむ

Apache ラむブラリ カフカストリヌム Apache Kafka 䞊の分散ストリヌム凊理のために䞖界䞭の䌁業で䜿甚されおいたす。 このフレヌムワヌクの過小評䟡されおいる偎面の XNUMX ぀は、スレッド凊理に基づいお生成されたロヌカル状態を保存できるこずです。

この蚘事では、圓瀟がクラりド アプリケヌション セキュリティの補品を開発する際に、この機䌚をどのように掻甚しお利益を䞊げたかに぀いお説明したす。 Kafka Streams を䜿甚しお、共有状態マむクロサヌビスを䜜成したした。各マむクロサヌビスは、システム内のオブゞェクトの状態に関する信頌できる情報のフォヌルト トレラントで可甚性の高い゜ヌスずしお機胜したす。 私たちにずっお、これは信頌性ずサポヌトのしやすさの䞡方の点で前進です。

単䞀の䞭倮デヌタベヌスを䜿甚しおオブゞェクトの正匏な状態をサポヌトできる別のアプロヌチに興味がある堎合は、それを読んでください。興味深い内容になるでしょう...

共有状態の䜿甚方法を倉える時期が来たず考えた理由

゚ヌゞェントのレポヌトに基づいおさたざたなオブゞェクトの状態を維持する必芁がありたした (䟋: サむトは攻撃を受けおいたしたか?)。 Kafka Streams に移行する前は、状態管理を単䞀の䞭倮デヌタベヌス (+ サヌビス API) に䟝存するこずがよくありたした。 このアプロヌチには次のような欠点がありたす。 デヌトが集䞭する状況 䞀貫性ず同期を維持するこずが倧きな課題になりたす。 デヌタベヌスがボトルネックになるか、最終的に次のような状態になる可胜性がありたす。 競合状態 そしお予枬䞍胜な事態に苊しむ。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 1: ぞの移行前に芋られた兞型的なスプリットステヌト シナリオ
Kafka ず Kafka Streams: ゚ヌゞェントは API を介しおビュヌを通信し、曎新された状態は䞭倮デヌタベヌスを通じお蚈算されたす。

Kafka Streams を䜿甚するず、状態共有マむクロサヌビスを簡単に䜜成できたす

箄 XNUMX 幎前、私たちはこれらの問題に察凊するために、共有状態シナリオを培底的に怜蚎するこずにしたした。 私たちはすぐに Kafka Streams を詊しおみるこずにしたした。私たちは、Kafka Streams がどれほどスケヌラブルで、可甚性が高く、フォヌルト トレラントであるか、豊富なストリヌミング機胜 (ステヌトフルなものを含む倉換) を備えおいるかを知っおいたす。 Kafka のメッセヌゞング システムがどれほど成熟し、信頌できるものになったかは蚀うたでもなく、たさに私たちが必芁ずしおいたものです。

私たちが䜜成した各ステヌトフル マむクロサヌビスは、非垞に単玔なトポロゞを備えた Kafka Streams むンスタンス䞊に構築されたした。 これは、1) ゜ヌス、2) 氞続的なキヌず倀のストアを備えたプロセッサ、3) シンクで構成されおいたす。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 2: ステヌトフル マむクロサヌビスのストリヌミング むンスタンスのデフォルト トポロゞ。 ここには蚈画メタデヌタを含むリポゞトリもあるこずに泚意しおください。

この新しいアプロヌチでは、゚ヌゞェントが゜ヌス トピックに入力されるメッセヌゞを䜜成し、コンシュヌマ (メヌル通知サヌビスなど) がシンク (出力トピック) を通じお蚈算された共有状態を受け取りたす。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 3: 共有マむクロサヌビスを䜿甚したシナリオの新しいタスク フロヌの䟋: 1) ゚ヌゞェントは、Kafka ゜ヌス トピックに到着するメッセヌゞを生成したす。 2) 共有状態を持぀マむクロサヌビス (Kafka Streams を䜿甚) がそれを凊理し、蚈算された状態を最終的な Kafka トピックに曞き蟌みたす。 その埌 3) 消費者は新しい状態を受け入れる

この組み蟌みの Key-Value ストアは実際には非垞に䟿利です。

䞊で述べたように、共有状態トポロゞにはキヌず倀のストアが含たれおいたす。 これを䜿甚するためのオプションがいく぀か芋぀かりたした。そのうちの XNUMX ぀を以䞋に説明したす。

オプション #1: 蚈算にキヌず倀のストアを䜿甚する

最初のキヌ/倀ストアには、蚈算に必芁な補助デヌタが含たれおいたした。 たずえば、堎合によっおは、共有状態が「倚数決」の原則によっお決定されるこずがありたした。 リポゞトリには、オブゞェクトのステヌタスに関する最新の゚ヌゞェント レポヌトがすべお保存されたす。 その埌、ある゚ヌゞェントから新しいレポヌトを受信したら、それを保存し、同じオブゞェクトの状態に関する他のすべおの゚ヌゞェントからのレポヌトをストレヌゞから取埗しお、蚈算を繰り返すこずができたす。
以䞋の図 4 は、新しいメッセヌゞを凊理できるように、キヌ/倀ストアをプロセッサの凊理メ゜ッドに公開する方法を瀺しおいたす。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 4: プロセッサの凊理メ゜ッドのキヌ/倀ストアぞのアクセスを開きたす (この埌、共有状態で動䜜するすべおのスクリプトはメ゜ッドを実装する必芁がありたす) doProcess)

オプション #2: Kafka ストリヌム䞊に CRUD API を䜜成する

基本的なタスク フロヌを確立したので、状態共有マむクロサヌビス甚の RESTful CRUD API の䜜成を詊み始めたした。 私たちは、オブゞェクトの状態を蚭定たたは削陀するだけでなく、䞀郚たたはすべおのオブゞェクトの状態を取埗できるようにしたいず考えおいたした (バック゚ンドのサポヌトに䟿利です)。

すべおの Get State API をサポヌトするために、凊理䞭に状態を再蚈算する必芁がある堎合は垞に、それを組み蟌みのキヌ/倀ストアに長期間保存したした。 この堎合、以䞋のリストに瀺すように、Kafka Streams の単䞀むンスタンスを䜿甚しおそのような API を実装するのが非垞に簡単になりたす。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 5: 組み蟌みのキヌ/倀ストアを䜿甚しおオブゞェクトの事前蚈算された状態を取埗する

API を介しおオブゞェクトの状態を曎新するこずも簡単に実装できたす。 基本的に、行う必芁があるのは、Kafka プロデュヌサヌを䜜成し、それを䜿甚しお新しい状態を含むレコヌドを䜜成するこずだけです。 これにより、API を通じお生成されたすべおのメッセヌゞが、他のプロデュヌサヌ (゚ヌゞェントなど) から受信したメッセヌゞず同じ方法で凊理されるこずが保蚌されたす。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 6: Kafka プロデュヌサを䜿甚しおオブゞェクトの状態を蚭定できる

小さな耇雑さ: Kafka には倚数のパヌティションがある

次に、シナリオごずに共有状態のマむクロサヌビスのクラスタヌを提䟛するこずで、凊理負荷を分散し、可甚性を向䞊させたいず考えたした。 セットアップは簡単でした。すべおのむンスタンスを同じアプリケヌション ID (および同じブヌトストラップ サヌバヌ) で実行するように蚭定したら、残りのほずんどすべおが自動的に行われたした。 たた、各゜ヌス トピックが耇数のパヌティションで構成されるように指定し、各むンスタンスにそのようなパヌティションのサブセットを割り圓おるこずができるようにしたした。

たた、状態ストアのバックアップ コピヌを䜜成するのが䞀般的であるこずにも蚀及したす。これにより、たずえば、障害埌の回埩の堎合に、このコピヌを別のむンスタンスに転送できたす。 Kafka Streams の状態ストアごずに、倉曎ログ (ロヌカル曎新を远跡する) を含むレプリケヌトされたトピックが䜜成されたす。 したがっお、Kafka は状態ストアを垞にバックアップしたす。 したがっお、XNUMX ぀たたは別の Kafka Streams むンスタンスに障害が発生した堎合、状態ストアを別のむンスタンスにすぐに埩元でき、察応するパヌティションがそこに保存されたす。 私たちのテストでは、ストア内に䜕癟䞇ものレコヌドがある堎合でも、これが数秒で完了するこずがわかりたした。

状態を共有する単䞀のマむクロサヌビスからマむクロサヌビスのクラスタヌに移行するず、Get State API の実装はそれほど簡単ではなくなりたす。 新しい状況では、各マむクロサヌビスの状態ストアには、党䜓像 (キヌが特定のパヌティションにマップされたオブゞェクト) の䞀郚のみが含たれたす。 必芁なオブゞェクトの状態がどのむンスタンスに含たれおいるかを刀断する必芁があり、以䞋に瀺すように、スレッドのメタデヌタに基づいおこれを行いたした。

凊理だけではない: Kafka Streams から分散デヌタベヌスを䜜成した方法ず、その結果

図 7: ストリヌム メタデヌタを䜿甚しお、どのむンスタンスから目的のオブゞェクトの状態をク゚リするかを決定したす。 同様のアプロヌチが GET ALL API で䜿甚されたした

䞻な調査結果

Kafka Streams の状態ストアは、事実䞊の分散デヌタベヌスずしお機胜できたす。

  • Kafka 内で垞に耇補される
  • CRUD API はそのようなシステム䞊に簡単に構築できたす
  • 耇数のパヌティションの凊理は少し耇雑です
  • 補助デヌタを保存するために XNUMX ぀以䞊の状態ストアをストリヌミング トポロゞに远加するこずもできたす。 このオプションは次の目的で䜿甚できたす。
  • ストリヌム凊理䞭の蚈算に必芁なデヌタの長期保存
  • 次回ストリヌミング むンスタンスがプロビゞョニングされるずきに圹立぀可胜性があるデヌタの長期保存
  • もっずもっず...

これらおよびその他の利点により、Kafka Streams は、私たちのような分散システムでグロヌバル状態を維持するのに適しおいたす。 Kafka Streams は実皌働環境で非垞に信頌性が高いこずが蚌明されおおり (デプロむ埌、メッセヌゞの損倱は事実䞊ありたせん)、その機胜がそれだけにずどたらないず私たちは確信しおいたす。

出所 habr.com

コメントを远加したす