Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

合理化されたプロセスず盞互接続された倚数のサヌビスを備えた Lamoda のような倧䌁業に、アプロヌチの倧幅な倉曎を匷いるものは䜕でしょうか? 動機は、立法的なものから、すべおのプログラマヌに内圚する実隓ぞの欲求たで、たったく異なる堎合がありたす。

しかし、これは远加のメリットを期埅できないずいう意味ではありたせん。 Sergey Zaika が、Kafka にむベント駆動型 API を実装するず具䜓的に䜕が埗られるのかを教えおくれたす (少数掟。 たた、倧物や興味深い発芋に぀いおの話題も必ずありたす。実隓はそれらなしでは成り立ちたせん。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

免責事項: この蚘事は、Sergey が 2018 幎 XNUMX 月に HighLoad++ で開催したミヌトアップの資料に基づいおいたす。 Lamoda 氏による Kafka ずの共同䜜業のラむブ䜓隓は、スケゞュヌル䞊の他のレポヌトず同様にリスナヌを魅了したした。 これは、同じ考えを持぀人々を垞に芋぀けるこずができ、たたそうすべきであるずいう事実の奜䟋であるず私たちは考えおいたす。HighLoad++ の䞻催者は、これを促進する雰囲気を䜜り出すよう匕き続き努力しおいきたす。

プロセスに぀いお

Lamoda は、独自のコンタクト センタヌ、配送サヌビス (および倚くの関連䌚瀟)、写真スタゞオ、巚倧な倉庫を備えた倧芏暡な電子商取匕プラットフォヌムであり、これらすべおが独自の゜フトりェアで実行されたす。 支払い方法は数十あり、B2B パヌトナヌはこれらのサヌビスの䞀郚たたはすべおを䜿甚し、自瀟の補品に関する最新情報を知りたいず考えおいたす。 さらに、Lamoda はロシア連邊以倖の XNUMX か囜で事業を展開しおいたすが、そこではすべおが少し異なりたす。 新しい泚文を構成するには、合蚈でおそらく XNUMX を超える方法があり、独自の方法で凊理する必芁がありたす。 これらすべおは、時には非明確な方法で通信する数十のサヌビスの助けを借りお機胜したす。 泚文ステヌタスを䞻な責任ずする䞭倮システムもありたす。 私たちは圌女をBOBず呌び、私は圌女ず䞀緒に働いおいたす。

むベント駆動型APIを䜿甚した返金ツヌル

むベント駆動ずいう蚀葉は非垞に陳腐なものですが、これが䜕を意味するのかに぀いおは、もう少し詳しく定矩したす。 Kafka でむベント駆動型 API アプロヌチを詊すこずにした背景から始めたす。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

どのお店でも、お客様がお金を払っお泚文するだけでなく、商品が合わなかったなどの理由でお店偎から返金を求められるこずもありたす。 これは比范的短いプロセスです。必芁に応じお情報を明らかにし、送金したす。

しかし、法埋の倉曎によりリタヌンはより耇雑になり、そのために別のマむクロサヌビスを実装する必芁がありたした。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

私たちの動機:

  1. 法埋 FZ-54 - ぀たり、法埋は、申告であろうず領収曞であろうず、あらゆる金銭取匕に぀いお、数分ずいうかなり短い SLA 以内に皎務眲に報告するこずを矩務付けおいたす。 私たちは電子商取匕䌁業ずしお、非垞に倚くの業務を行っおいたす。 技術的には、これは新しい責任 (したがっお新しいサヌビス) ず、関連するすべおのシステムの改善を意味したす。
  2. ボブ分割 ã¯ã€BOB を倚くの非䞭栞的な責任から解攟し、党䜓の耇雑さを軜枛するための瀟内プロゞェクトです。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

この図は、䞻芁な Lamoda システムを瀺しおいたす。 今、それらのほずんどはそれ以䞊です 瞮小するモノリスの呚りに 5  10 個のマむクロサヌビスを配眮。 それらはゆっくりず成長しおいたすが、䞭倮で遞択したフラグメントを展開するのは怖いため、より小さくしようずしおいたす。これを萜䞋させるこずはできたせん。 すべおの取匕所 (矢印) を予玄し、そのうちのいずれかが利甚できなくなる可胜性があるずいう事実を考慮する必芁がありたす。

BOB には、支払いシステム、配送システム、通知システムなど、非垞に倚くの取匕所もありたす。

技術的には BOB は次のずおりです。

  • コヌドが玄 150 行 + テストが玄 100 行。
  • php7.2 + Zend 1 & Symfony コンポヌネント 3;
  • 100 を超える API ず最倧 50 のアりトバりンド統合。
  • 独自のビゞネス ロゞックを持぀ 4 か囜。

BOB の導入には費甚ず劎力がかかり、解決されるコヌドず問題の量は誰も頭の䞭にすべおを入れられないほどです。 䞀般に、簡略化する理由はたくさんありたす。

返品手続き

最初は、BOB ず Payment ずいう XNUMX ぀のシステムがプロセスに関䞎したす。 さらに XNUMX ぀が衚瀺されたす。

  • 財政化サヌビス: 財政化および倖郚サヌビスずの通信に関する問題に察凊したす。
  • 返金ツヌル。BOB を膚らたせないよう、単に新しい亀換が含たれおいたす。

プロセスは次のようになりたす。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

  1. BOB は返金のリク゚ストを受け取りたす。
  2. BOB がこの返金ツヌルに぀いお語りたす。
  3. 返金ツヌルは支払いに「お金を返しおください」ず指瀺したす。
  4. 支払いはお金を返したす。
  5. Refund Tool ず BOB はステヌタスを盞互に同期したす。これは、珟時点では䞡方ずも必芁であるためです。 BOB には UI、䌚蚈甚のレポヌト、および䞀般にそれほど簡単には転送できない倧量のデヌタがあるため、ただ返金ツヌルに完党に切り替える準備ができおいたせん。 ぀の怅子に座らなければなりたせん。
  6. 財政化の芁請はなくなる。

その結果、Kafka 䞊で䞀皮のむベント バス、぀たりすべおが始たるむベント バスを䜜成したした。 䞇歳、これで単䞀障害点ができたした (皮肉)。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

長所ず短所は非垞に明癜です。 私たちはバスを䜜ったので、今ではすべおのサヌビスがバスに䟝存しおいるこずになりたす。 これにより蚭蚈は簡玠化されたすが、システムに単䞀障害点が生じたす。 Kafka がクラッシュし、プロセスが停止したす。

むベント駆動型APIずは

この質問に察する良い答えは、Martin Fowler によるレポヌト (GOTO 2017) にありたす。 「むベント駆動型アヌキテクチャのさたざたな意味」.

私たちがやったこずを簡単に説明するず、

  1. すべおの非同期亀換を次のようにたずめたす。 むベントストレヌゞ。 ステヌタスの倉化に぀いお関心のあるすべおの消費者にネットワヌク経由で通知する代わりに、ステヌタスの倉化に関するむベントを集䞭ストレヌゞに曞き蟌み、トピックに興味のある消費者はそこに衚瀺されるすべおを読み取りたす。
  2. この堎合のむベントは通知です (通知どこかで䜕かが倉わったずいうこずです。 たずえば、泚文ステヌタスが倉曎されたした。 通知に含たれおいないステヌタス倉化に䌎うデヌタに興味のある消費者は、自らそのステヌタスを知るこずができる。
  3. 最倧のオプションは本栌的なむベント ゜ヌシングです。 状態転送どのむベントには、凊理に必芁なすべおの情報 (むベントがどこから来たのか、どのような状態になったのか、デヌタがどのように正確に倉曎されたのかなど) が含たれおいたす。唯䞀の問題は、実珟可胜性ず保存できる情報の量です。

返金ツヌルの立ち䞊げの䞀環ずしお、私たちは XNUMX 番目のオプションを䜿甚したした。 これにより、詳现な情報を抜出する必芁がなくなったため、むベント凊理が簡玠化され、さらに、新しいむベントが発生するたびにコンシュヌマヌからの明確な取埗リク゚ストが倧量に生成されるずいうシナリオが排陀されたした。

返金ツヌルサヌビス 読み蟌たれおいないしたがっお、カフカには必芁ずいうよりもペンの味がありたす。 返金サヌビスが負荷の高いプロゞェクトになったら、ビゞネスは満足しないず思いたす。

珟状のたたの非同期亀換

非同期亀換の堎合、PHP 郚門は通垞 RabbitMQ を䜿甚したす。 リク゚ストのデヌタを収集しおキュヌに入れ、同じサヌビスのコンシュヌマヌがそれを読み取っお送信したした (たたは送信したせんでした)。 API 自䜓に぀いおは、Lamoda は Swagger を積極的に䜿甚しおいたす。 API を蚭蚈し、Swagger で蚘述し、クラむアントずサヌバヌのコヌドを生成したす。 たた、わずかに匷化された JSON RPC 2.0 も䜿甚したす。

ESB バスが䜿甚されおいる堎所もあれば、activeMQ 䞊にある堎所もありたすが、䞀般的には、 RabbitMQ - 暙準.

非同期亀換の予定

むベントバスを介した亀換を蚭蚈する堎合、類䌌点をたどるこずができたす。 同様に、むベント構造の蚘述を通じお将来のデヌタ亀換に぀いおも説明したす。 yaml 圢匏では、コヌド生成を自分たちで行う必芁があり、ゞェネレヌタヌは仕様に埓っお DTO を䜜成し、クラむアントずサヌバヌにそれらを操䜜するよう教えたす。 䞖代は XNUMX ぀の蚀語に移行したす - golangずphp。 これはラむブラリの䞀貫性を保぀のに圹立ちたす。 このゞェネレヌタヌは golang で曞かれおいるため、gogi ずいう名前が付けられたした。

Kafka でのむベント゜ヌシングは兞型的なものです。 Kafka Confluent のメむン ゚ンタヌプラむズ バヌゞョンからの゜リュヌションがありたす。 ナカディ、ドメむン兄匟 Zalando からの゜リュヌションです。 私たちの バニラ Kafka を始める動機 - これは、最終的にどこでも䜿甚するかどうかを決定するたで゜リュヌションを無料のたたにし、操䜜や改善の䜙地を残しおおくこずを意味したす。 JSON RPC 2.0、XNUMX぀の蚀語甚のゞェネレヌタヌ、そしお他に䜕か芋おみたしょう。

皮肉なこずに、このようなめでたいケヌスでも、ほが同様の゜リュヌションを䜜成した Zalando ずいうほが同様のビゞネスが存圚するず、それを有効に掻甚できないのです。

起動時のアヌキテクチャ パタヌンは次のずおりです。Kafka から盎接読み取りたすが、曞き蟌みはむベント バス経由でのみ行われたす。 Kafka には、ブロヌカヌ、バランサヌなど、すぐに読み取れるものがたくさんありたす。たた、倚かれ少なかれ氎平スケヌリングの準備ができおいたす。私はこれを保持しおおきたかったのです。 私たちは XNUMX ぀のゲヌトりェむ、別名むベントバスを通じお録音を完了したいず考えおいたした。その理由は次のずおりです。

むベントバス

あるいはむベントバスずか。 これは単なるステヌトレス http ゲヌトりェむであり、いく぀かの重芁な圹割を担いたす。

  • 怜蚌の䜜成 â€” むベントが仕様を満たしおいるこずを確認したす。
  • むベントマスタヌシステム぀たり、これは、どのむベントずどの構造が有効であるず芋なされるかずいう質問に答える、䌚瀟の䞻芁か぀唯䞀のシステムです。 怜蚌には、デヌタ型ず列挙型を䜿甚しおコンテンツを厳密に指定するだけです。
  • ハッシュ関数 シャヌディングの堎合 - Kafka メッセヌゞ構造はキヌず倀であり、キヌのハッシュを䜿甚しおキヌを配眮する堎所が蚈算されたす。

なぜ

私たちは合理化されたプロセスを備えた倧䌁業で働いおいたす。 なぜ䜕かを倉えるのでしょうか これは実隓です、そしおいく぀かの利点が埗られるず期埅しおいたす。

1:n+1 亀換 (XNUMX 察倚)

Kafka を䜿甚するず、新しいコンシュヌマヌを API に接続するのが非垞に簡単になりたす。

耇数のシステム (およびいく぀かの新しいシステム) で同時に最新の状態に保぀必芁があるディレクトリがあるずしたす。 以前は、set-API を実装したバンドルを発明し、マスタヌ システムにコンシュヌマヌ アドレスを通知したした。 これで、マスタヌ システムがトピックに曎新情報を送信し、興味のある人は党員それを読むようになりたす。 新しいシステムが登堎したした - 私たちはそれをトピックに登録したした。 はい、バンドルも可胜ですが、よりシンプルです。

BOB の䞀郚である返金ツヌルの堎合、Kafka を通じお同期を維持するず䟿利です。 支払いには、お金が返されたず蚘茉されおいたす。BOB ず RT がこれを知り、ステヌタスを倉曎し、財政化サヌビスがこれを知り、小切手を発行したした。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

泚文/返品に関するニュヌスをクラむアントに通知する統合通知サヌビスを䜜成する蚈画がありたす。 珟圚、この責任はシステム間で分散されおいたす。 Kafka から関連情報を取埗しおそれに応答する (そしお他のシステムでこれらの通知を無効にする) ように通知サヌビスを教えるだけで十分です。 新たに盎接亀換する必芁はありたせん。

デヌタ駆動型

どのような「血のにじむような䌁業」であっおも、たたバックログがどれほど倧きくおも、システム間の情報は透明になりたす。 Lamoda には、システムからデヌタを収集し、ビゞネスずむンテリゞェント システムの䞡方で再利甚可胜な圢匏に倉換するデヌタ分析郚門がありたす。 Kafka を䜿甚するず、倧量のデヌタをすばやく提䟛し、その情報の流れを最新の状態に保぀こずができたす。

レプリケヌションログ

RabbitMQ のように、メッセヌゞは読み取られた埌に消えたせん。 むベントに凊理に十分な情報が含たれおいる堎合、オブゞェクトに察する最近の倉曎の履歎が埗られ、必芁に応じおこれらの倉曎を適甚するこずができたす。

レプリケヌション ログの保存期間は、このトピックぞの曞き蟌みの匷床によっお異なりたす。Kafka を䜿甚するず、保存時間ずデヌタ ボリュヌムの制限を柔軟に蚭定できたす。 集䞭的なトピックの堎合、たずえ短期間操䜜䞍胜になった堎合でも、情報が消える前にすべおの消費者が情報を読む時間を確保できるこずが重芁です。 通垞は以䞋のデヌタを保存するこずが可胜です æ—¥ã®å˜äœ, サポヌトずしおは十分です。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

次に、Kafka に詳しくない人のためにドキュメントを少し再説明したす (写真もドキュメントからのものです)

AMQP にはキュヌがありたす。コンシュヌマヌ向けにメッセヌゞをキュヌに曞き蟌みたす。 通垞、XNUMX ぀のキュヌは、同じビゞネス ロゞックを備えた XNUMX ぀のシステムによっお凊理されたす。 耇数のシステムに通知する必芁がある堎合は、アプリケヌションに耇数のキュヌに曞き蟌むように指瀺したり、キュヌ自䜓のクロヌンを䜜成するファンアりト メカニズムを䜿甚しお亀換を構成したりするこずができたす。

Kafka にも同様の抜象化がありたす トピック、メッセヌゞを曞きたすが、読んでも消えたせん。 デフォルトでは、Kafka に接続するず、すべおのメッセヌゞを受信し、䞭断したずころから保存するオプションが衚瀺されたす。 ぀たり、順番に読んでいきたす。メッセヌゞを既読ずしおマヌクするこずはできたせんが、ID を保存しお、そこから読み続けるこずができたす。 決定した ID はオフセットず呌ばれ、そのメカニズムはコミット オフセットです。

したがっお、異なるロゞックを実装するこずができたす。 たずえば、さたざたな囜の 4 ぀のむンスタンスに BOB がありたす。Lamoda はロシア、カザフスタン、りクラむナ、ベラルヌシにありたす。 これらは別々にデプロむされるため、構成ず独自のビゞネス ロゞックが若干異なりたす。 メッセヌゞには、それがどの囜を指すのかを瀺したす。 各囜の各 BOB 消費者は異なる groupId を䜿甚しお読み取り、メッセヌゞが自分に圓おはたらない堎合はスキップしたす。 すぐにオフセット +1 をコミットしたす。 同じトピックが圓瀟の支払いサヌビスによっお読み取られる堎合、別のグルヌプで読み取られるため、オフセットは亀差したせん。

むベント芁件:

  • デヌタの完党性。 むベントを凊理できるように十分なデヌタが必芁です。

  • 誠実さ むベントに䞀貫性があり、むベントを凊理できるかどうかの怜蚌を Events-bus に委任したす。
  • 順序は重芁です。 埩垰の堎合、私たちは歎史に察凊するこずを䜙儀なくされたす。 通知の堎合、順序は重芁ではありたせん。通知が同皮の堎合、どの順序が最初に到着したかに関係なく、電子メヌルは同じになりたす。 返金の堎合には明確なプロセスがあり、泚文を倉曎した堎合は䟋倖が発生し、返金は䜜成たたは凊理されず、最終的には異なるステヌタスになりたす。
  • 䞀貫性。 私たちはストアを持っおおり、珟圚は API の代わりにむベントを䜜成しおいたす。 新しいむベントや既存のむベントの倉曎に関する情報を迅速か぀安䟡にサヌビスに送信する方法が必芁です。 これは、別の git リポゞトリずコヌド ゞェネレヌタヌの共通仕様を通じお実珟されたす。 したがっお、異なるサヌビスのクラむアントずサヌバヌが調敎されたす。

ラモヌダのカフカ

XNUMX ぀の Kafka むンストヌルがありたす。

  1. ログ;
  2. 研究開発;
  3. むベントバス。

今日は最埌の点に぀いおのみ話したす。 events-bus では、それほど倧芏暡なむンストヌルはありたせん - 3 ぀のブロヌカヌ (サヌバヌ) ず 27 のトピックだけです。 原則ずしお、XNUMX ぀のトピックが XNUMX ぀のプロセスになりたす。 しかし、これは埮劙な点なので、これから觊れおいきたす。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

䞊はRPSグラフです。 返金プロセスは青緑色の線 (はい、X 軞䞊の線) でマヌクされおおり、ピンク色の線はコンテンツ曎新プロセスです。

Lamoda のカタログには䜕癟䞇もの補品が含たれおおり、デヌタは垞に曎新されたす。 䞀郚のコレクションは時代遅れになり、それに代わる新しいコレクションがリリヌスされ、カタログには垞に新しいモデルが登堎したす。 私たちは、お客様が明日䜕を興味を持぀かを予枬しようずしおいるため、垞に新しいものを賌入し、写真を撮り、陳列ケヌスを曎新しおいたす。

ピンク色のピヌクは補品のアップデヌト、぀たり補品の倉曎です。 みんなが写真を撮り、写真を撮り、そしおたた写真を撮っおいるこずがわかりたす。 — むベントのパックをロヌドしたした。

Lamoda むベントの䜿甚䟋

構築されたアヌキテクチャを次の操䜜に䜿甚したす。

  • 返品状況の远跡: 関連するすべおのシステムからの行動喚起ずステヌタス远跡。 支払い、ステヌタス、䌚蚈凊理、通知。 ここで私たちはアプロヌチをテストし、ツヌルを䜜成し、すべおのバグを収集し、ドキュメントを䜜成し、その䜿甚方法を同僚に䌝えたした。
  • 補品カヌドの曎新: 構成、メタデヌタ、特性。 XNUMX ぀のシステムが読み取り (衚瀺) を行い、耇数のシステムが曞き蟌みを行いたす。
  • 電子メヌル、プッシュ、SMS泚文が集たりたした、泚文が到着したした、返品が受け付けられたした、など、たくさんありたす。
  • 圚庫・倉庫リニュヌアル â€” アむテムの定量的な曎新、数倀だけ: 倉庫ぞの到着、返品。 商品の予玄に関連するすべおのシステムが最新のデヌタで動䜜する必芁がありたす。 珟圚、株䟡曎新システムは非垞に耇雑ですが、Kafka によっお簡玠化されたす。
  • デヌタ解析 (研究開発郚門)、ML ツヌル、分析、統蚈。 私たちは情報の透明性を望んでいたす。Kafka はこれに適しおいたす。

ここで、過去 XNUMX か月間に起こった倧きな倉化ず興味深い発芋に぀いおのさらに興味深い郚分を説明したす。

蚭蚈䞊の問題

新しいこずをしたいずしたす。たずえば、配信プロセス党䜓を Kafka に転送したす。 珟圚、プロセスの䞀郚は BOB の泚文凊理に実装されおいたす。 配送サヌビスぞの泚文の転送、䞭間倉庫ぞの移動などの背埌にはステヌタス モデルがありたす。 モノリス党䜓 (堎合によっおは XNUMX ぀) に加えお、配信専甚の API が倚数ありたす。 圌らは配達に぀いおもっず詳しく知っおいたす。

これらは䌌た領域のように芋えたすが、BOB の泚文凊理ず出荷システムではステヌタスが異なりたす。 たずえば、䞀郚の宅配䟿サヌビスは䞭間ステヌタスを送信せず、「配達枈み」たたは「玛倱」ずいう最終ステヌタスのみを送信したす。 逆に、商品の移動に぀いお詳现に報告する人もいたす。 誰もが独自の怜蚌ルヌルを持っおいたす。電子メヌルが有効である、぀たり凊理されるずいう人もいたす。 他の人にずっおは、それは無効ですが、連絡先の電話番号があるため泚文は匕き続き凊理され、誰かがそのような泚文はたったく凊理されないず蚀うでしょう。

デヌタストリヌム

Kafka の堎合、デヌタ フロヌを敎理するずいう問題が生じたす。 このタスクでは、いく぀かのポむントに基づいお戊略を遞択する必芁がありたす。すべおを芋おみたしょう。

XNUMX ぀のトピック内でしょうか、それずも別のトピック内でしょうか?

むベント仕様曞がございたす。 BOB では、これこれの泚文を配送する必芁があるこずを蚘述し、泚文番号、その構成、いく぀かの SKU ずバヌコヌドなどを瀺したす。 商品が倉庫に到着するず、配送業者はステヌタス、タむムスタンプ、その他必芁なものすべおを受け取るこずができたす。 ただし、このデヌタの曎新を BOB で受信したいず考えおいたす。 配信からデヌタを受信する逆のプロセスがありたす。 これも同じむベントですか それずも、これは独自のトピックに倀する別のやり取りなのでしょうか?

ほずんどの堎合、それらは非垞に䌌おおり、トピックを XNUMX ぀䜜成したいずいう誘惑に根拠がないわけではありたせん。トピックが別であるずいうこずは、コンシュヌマが別、構成が別、これらすべおの䞖代が別であるこずを意味するからです。 しかし、事実ではありたせん。

新しいフィヌルドか新しいむベントか

しかし、同じむベントを䜿甚するず、別の問題が発生したす。 たずえば、すべおの配信システムが BOB が生成できる皮類の DTO を生成できるわけではありたせん。 ID を送信したすが、ID は必芁ないため保存されたせん。たた、むベント バス プロセスを開始する芳点からは、このフィヌルドは必須です。

このフィヌルドが必須であるずいうむベント バスのルヌルを導入するず、BOB たたは開始むベント ハンドラヌに远加の怜蚌ルヌルを蚭定する必芁がありたす。 怜蚌はサヌビス党䜓に広がり始めたすが、これはあたり䟿利ではありたせん。

もう XNUMX ぀の問題は、段階的な開発ぞの誘惑です。 むベントに䜕かを加える必芁があるず蚀われおいたすが、考えおみれば、それは別のむベントであるべきだったのかもしれたせん。 しかし、私たちのスキヌムでは、別のむベントは別のトピックです。 䞊で説明したプロセス党䜓に぀いおは、別のトピックで説明したす。 開発者は、単に別のフィヌルドを JSON スキヌマに远加しお再生成したくなるでしょう。

返金の堎合は半幎埌のむベント開催に至りたした。 払い戻し曎新ず呌ばれる XNUMX ぀のメタむベントがあり、この曎新が実際に䜕であるかを説明するタむプ フィヌルドがありたした。 このため、このタむプでこのむベントを怜蚌する方法を教えおくれるバリデヌタヌを備えた「玠晎らしい」スむッチがありたした。

むベントのバヌゞョン管理

Kafka でメッセヌゞを怜蚌するには、次を䜿甚できたす アブロ、しかし、すぐにそれに暪たわり、Confluentを䜿甚する必芁がありたした。 私たちの堎合、バヌゞョン管理には泚意する必芁がありたす。 モデルが「終了」しおいるため、レプリケヌション ログからメッセヌゞを再読み取りできるずは限りたせん。 基本的に、モデルが䞋䜍互換性を持぀ようにバヌゞョンを構築するこずがわかりたす。たずえば、フィヌルドを䞀時的にオプションにしたす。 違いが匷すぎる堎合は、新しいトピックで曞き始め、クラむアントが叀いトピックを読み終わったら転送したす。

パヌティションの読み取り順序の保蚌

Kafka 内のトピックはパヌティションに分割されたす。 これは、゚ンティティや取匕所を蚭蚈しおいる間はそれほど重芁ではありたせんが、それを䜿甚および拡匵する方法を決定する際には重芁です。

通垞の堎合、Kafka で XNUMX ぀のトピックを䜜成したす。 デフォルトでは XNUMX ぀のパヌティションが䜿甚され、このトピックのすべおのメッセヌゞはそこに送られたす。 したがっお、消費者はこれらのメッセヌゞを順番に読みたす。 ここで、XNUMX 人の異なるコンシュヌマがメッセヌゞを読めるようにシステムを拡匵する必芁があるずしたす。 たずえば、SMS を送信しおいる堎合、远加のパヌティションを䜜成するように Kafka に指瀺できたす。そうするず、Kafka はメッセヌゞを XNUMX ぀の郚分 (半分はここ、もう半分はここ) に分割し始めたす。

カフカはそれらをどのように分割したすか? 各メッセヌゞには本文 (JSON を保存したす) ずキヌがありたす。 このキヌにハッシュ関数を付加するず、メッセヌゞがどのパヌティションに送信されるかが決たりたす。

払い戻しの堎合、これは重芁です。XNUMX ぀のパヌティションを取る堎合、䞊列コンシュヌマヌが最初のむベントよりも前に XNUMX 番目のむベントを凊理する可胜性があり、問題が発生したす。 ハッシュ関数により、同じキヌを持぀メッセヌゞが同じパヌティションに到達するこずが保蚌されたす。

むベントずコマンドの比范

これも私たちが遭遇した問題です。 むベントずは特定のむベントです。たずえば、商品がキャンセルされた、返金が発生したなど、どこかで䜕かが起こった (something_happened) こずを蚀いたす。 誰かがこれらのむベントをリッスンするず、「商品がキャンセルされたした」に埓っお返金゚ンティティが䜜成され、セットアップのどこかに「返金が発生したした」ず曞き蟌たれたす。

しかし通垞、むベントを䌁画するずきは、無駄にむベントを曞きたくはありたせん。誰かが読んでくれるずいう事実を頌りにしたす。 䜕かが起こったアむテムがキャンセルされた、返金が返金されたのではなく、䜕かをすべきだずいうこずを曞きたいずいう匷い誘惑がありたす。 たずえば、商品は返品の準備ができおいたす。

䞀方で、むベントがどのように䜿甚されるかを瀺唆しおいたす。 䞀方で、通垞のむベント名ずはあたり䌌おいたせん。 さらに、ここから do_something コマンドたではそれほど遠くありたせん。 ただし、誰かがこのむベントを読んでいるずいう保蚌はありたせん。 そしおそれを読めば、成功したこずになりたす。 そしお、それをうたく読み取れた堎合、あなたは䜕かを行い、その䜕かが成功したこずになりたす。 むベントが do_something になった瞬間にフィヌドバックが必芁になり、それが問題になりたす。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

RabbitMQ の非同期亀換では、メッセヌゞを読んで http にアクセスするず、少なくずもメッセヌゞが受信されたずいう応答が埗られたす。 Kafka に曞き蟌むず、Kafka に曞いたメッセヌゞが存圚したすが、それがどのように凊理されたかに぀いおは䜕もわかりたせん。

したがっお、私たちの堎合は、応答むベントを導入し、非垞に倚くのむベントが送信された堎合に、その埌に同じ数の応答むベントが到着するように監芖を蚭定する必芁がありたした。 これが起こらない堎合は、䜕か問題が発生したようです。 たずえば、「item_ready_to_refund」むベントを送信した堎合、払い戻しが䜜成され、お金がクラむアントに返され、「money_refunded」むベントが送信されるこずが期埅されたす。 しかし、これは確実ではないため、監芖が必芁です。

ニュアンス

かなり明癜な問題がありたす。トピックから順番に読んでいお、悪いメッセヌゞがある堎合、コンシュヌマヌは萜ちおしたい、先に進むこずができなくなりたす。 必芁です すべおの消費者を止めおください、さらにオフセットをコミットしお読み取りを続けたす。

私たちはそれを知っおいお、期埅しおいたしたが、それでもそれは起こりたした。 そしお、これは、むベントがむベントバスの芳点からは有効であり、アプリケヌションバリデヌタの芳点からは有効でしたが、PostgreSQLの芳点からは無効であったために起こりたした。 UNSIGNED INT を備えた MySQL ず、新たに䜜成されたシステムでは INT のみを備えた PostgreSQL がありたした。 圌のサむズは少し小さくお、IDが合いたせんでした。 Symfony は䟋倖を陀いお死亡したした。 もちろん、䟋倖に䟝存しおいたため䟋倖をキャッチし、このオフセットをコミットしようずしおいたしたが、メッセヌゞの凊理が倱敗したため、その前に問題カりンタヌをむンクリメントする必芁がありたした。 このプロゞェクトのカりンタヌもデヌタベヌス内にあり、Symfony はすでにデヌタベヌスずの通信を閉じおおり、XNUMX 番目の䟋倖によりオフセットをコミットする機䌚もなくプロセス党䜓が匷制終了されたした。

サヌビスはしばらく停止しおいたしたが、幞いなこずに、Kafka ではメッセヌゞが残っおいるため、これはそれほど悪いこずではありたせんでした。 䜜業が再開されたら、読み終えるこずができたす。 快適ですよ。

Kafka には、ツヌルを通じお任意のオフセットを蚭定する機胜がありたす。 ただし、これを行うには、すべおのコンシュヌマヌを停止する必芁がありたす。この堎合、コンシュヌマヌが存圚しない別のリリヌスを準備し、再デプロむしたす。 その埌、Kafka でツヌルを䜿甚しおオフセットをシフトするず、メッセヌゞが送信されたす。

別のニュアンス - レプリケヌション ログず rdkafka.so の比范 - 私たちのプロゞェクトの詳现に関連しおいたす。 私たちは PHP を䜿甚したす。PHP では、原則ずしお、すべおのラむブラリは rdkafka.so リポゞトリを通じお Kafka ず通信し、その埌、ある皮のラッパヌが存圚したす。 おそらくこれらは私たち個人の困難ですが、すでに読んだ本の䞀郚を単に再読するこずはそれほど簡単ではないこずがわかりたした。 䞀般的に、゜フトりェアに問題がありたした。

パヌティションの操䜜の詳现に戻るず、それはドキュメントに蚘茉されおいたす。 コンシュヌマ >= トピック パヌティション。 しかし、私がこのこずを知ったのは、思っおいたよりもずっず埌でした。 スケヌリングしお 20 ぀のコンシュヌマを持たせる堎合は、少なくずも XNUMX ぀のパヌティションが必芁です。 ぀たり、XNUMX 件のメッセヌゞが蓄積された XNUMX ぀のパヌティションがあり、新しいパヌティションを䜜成した堎合、メッセヌゞの数はすぐには均等になりたせん。 したがっお、XNUMX ぀の䞊列コンシュヌマヌを持぀には、パヌティションを凊理する必芁がありたす。

監芖

それを監芖する方法によっお、既存のアプロヌチにどのような問題があるのか​​がさらに明確になるず思いたす。

たずえば、最近ステヌタスが倉曎されたデヌタベヌス内の補品の数を蚈算し、それに応じおこれらの倉曎に基づいおむベントが発生するはずであり、この数倀を監芖システムに送信したす。 次に、Kafka から XNUMX 番目の数倀、実際に蚘録されたむベントの数を取埗したす。 明らかに、これら XNUMX ぀の数倀の差は垞にれロでなければなりたせん。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

さらに、プロデュヌサヌがどのように動䜜しおいるか、むベントバスがメッセヌゞを受信したかどうか、およびコンシュヌマがどのように動䜜しおいるかを監芖する必芁がありたす。 たずえば、以䞋のチャヌトでは、Refund Tool は奜調ですが、BOB には明らかにいく぀かの問題がありたす (青いピヌク)。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

消費者グルヌプの遅れに぀いおはすでに述べたした。 倧たかに蚀うず、これは未読メッセヌゞの数です。 䞀般に、消費者は玠早く䜜業するため、遅延は通垞 0 ですが、堎合によっおは短期間のピヌクが発生するこずがありたす。 Kafka はこれをそのたた実行できたすが、䞀定の間隔を蚭定する必芁がありたす。

プロゞェクトがありたす バロヌこれにより、Kafka に぀いおさらに詳しい情報が埗られたす。 これは、コンシュヌマ グルヌプ API を䜿甚しお、このグルヌプの状況を瀺すだけです。 「OK」ず「倱敗」に加えお、譊告も衚瀺され、消費者が制䜜のペヌスに察応できおいない、぀たり曞かれた内容を校正する時間がないこずがわかりたす。 このシステムは非垞にスマヌトで䜿いやすいです。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

API の応答は次のようになりたす。 これはグルヌプ bob-live-fifa、パヌティションrefund.update.v1、ステヌタスOK、ラグ0 - 最埌の最終オフセットなどです。

Kafka 䞊の非同期 API を䜿甚した返金ツヌル サヌビスの開発経隓

監芖 updated_at SLA (スタック) すでに述べたした。 たずえば、商品が返品可胜なステヌタスに倉曎されたした。 Cron をむンストヌルするず、5 分以内にこのオブゞェクトが返金されなかった堎合 (支払いシステムを通じおすぐに返金されたす)、間違いなく䜕か問題が発生したため、これは間違いなくサポヌト察象であるず通知されたす。 したがっお、単玔に Cron を䜿甚しおそのようなものを読み取り、それらが 0 より倧きい堎合にアラヌトを送信したす。

芁玄するず、むベントを䜿甚するず次のような堎合に䟿利です。:

  • 情報はいく぀かのシステムで必芁ずされたす。
  • 凊理の結果は重芁ではありたせん。
  • むベントがほずんどないか、小さなむベントがありたす。

この蚘事には Kafka の非同期 API ずいう非垞に具䜓的なトピックがあるように芋えたすが、これに関連しお䞀床に倚くのこずをお勧めしたいず思いたす。
たず、次 HighLoad ++ XNUMX月たで埅぀必芁がありたす。XNUMX月にはサンクトペテルブルクバヌゞョンがあり、XNUMX月にはノボシビルスクでの高負荷に぀いお話したす。
第二に、このレポヌトの著者であるセルゲむ・ザむカ氏は、ナレッゞマネゞメントに関する新しい䌚議のプログラム委員䌚のメンバヌです。 ナレッゞカンファレンス。 このカンファレンスは 26 月 XNUMX 日に開催される XNUMX 日限りのむベントですが、そのプログラムは非垞に内容が濃いものです。
そしおXNUMX月になりたす PHP ロシア О RIT++ (DevOpsConf を含む) - そこでトピックを提案したり、自分の経隓に぀いお話したり、詰め蟌たれたコヌンに぀いお文句を蚀ったりするこずもできたす。

出所 habr.com

コメントを远加したす