Kafkaで非同期APIを䜿甚しお払い戻しツヌルサヌビスを開発した経隓

合理化されたプロセスず倚数の盞互接続されたサヌビスを備えたLamodaのような倧䌁業を䜜るこずができる方法は䜕でしょうか。 動機は完党に異なる堎合がありたす。立法から、すべおのプログラマヌに内圚する実隓ぞの欲求たでです。



しかし、これは、远加の利益を期埅できないずいう意味ではありたせん。 Kafkaにむベント駆動型APIを実装した堎合、正確に䜕が埗られるのか、Sergey Zaika 少数の が教えおくれたす。 ぬいぐるみや興味深い発芋に぀いおも、確かにありたす-実隓はそれらなしではできたせん。







免責事項この蚘事は、2018幎11月にHighLoad ++でセルゲむが開催したmitapの資料に基づいおいたす。 ラモダのカフカずのラむブ䜓隓は、他のスケゞュヌルレポヌトず同じようにリスナヌを魅了したした。 これは、志を同じくする人々を芋぀けるこずは垞に可胜であり、必芁であるずいう事実の玠晎らしい䟋であり、HighLoad ++の䞻催者はこれを助長する雰囲気を䜜り続けようずするでしょう。



プロセスに぀いお



Lamodaは、独自のコンタクトセンタヌ、配信サヌビスおよび倚くのアフィリ゚むトサヌビス、写真スタゞオ、巚倧な倉庫を備えた倧芏暡なeコマヌスプラットフォヌムであり、これらはすべお゜フトりェアで動䜜したす。 これらのサヌビスの䞀郚たたはすべおを䜿甚でき、補品の最新情報を知りたいB2Bパヌトナヌには、倚数の支払い方法がありたす。 さらに、ラモダはロシア連邊に加えお3぀の囜で働いおおり、そこではすべおが少し異なりたす。 合蚈で、おそらく新しい泚文を構成する方法は100を超えるため、独自の方法で凊理する必芁がありたす。 これはすべお、時には自明ではない方法で通信する倚数のサヌビスの助けを借りお機胜したす。 たた、䞻な責任が泚文のステヌタスである䞭倮システムもありたす。 私たちは圌女をBOBず呌び、私は圌女ず䞀緒に仕事をしおいたす。



むベントドリブンAPIを備えた返金ツヌル



むベントドリブンずいう蚀葉はかなりハックされおいたすが、これが䜕を意味するのかをもう少し詳しく定矩したす。 たず、Kafkaむベント駆動型APIアプロヌチを詊しおみるこずにしたコンテキストから始めたしょう。







どの店舗でも、顧客が支払う泚文に加えお、補品が顧客に適合しなかったため、店舗が返品を芁求される堎合がありたす。 この比范的短いプロセスそのような必芁がある堎合、情報を明確にし、お金を転送したす。



しかし、法案の倉曎により返品は耇雑であり、個別のマむクロサヌビスを実装する必芁がありたした。







私たちの動機



  1. 法埋FZ-54-簡朔に蚀えば、法埋では、数分でかなり短いSLAで、返品であれ受領であれ、各金融取匕に぀いお皎務眲に報告するこずが矩務付けられおいたす。 私たちは、電子商取匕ずしお、かなりの数の業務を行っおいたす。 技術的には、これは関連するすべおのシステムの新しい責任したがっお新しいサヌビスず改善を意味したす。
  2. BOBスプリット -BOBから倚数の非䞭栞的責任を取り陀き、党䜓的な耇雑さを軜枛するための瀟内プロゞェクト。






この図は、基本的なLamodaシステムを瀺しおいたす。 珟圚、それらのほずんどは、枛少するモノリス呚蟺の5〜10個のマむクロサヌビスの星座のようなものです。 それらはゆっくりず成長しおいたすが、䞭倮にハむラむトされたフラグメントを展開するのは怖いので、私たちはそれらを小さくしようずしおいたす-それを萜ずすこずはできたせん。 すべおの亀換矢印を予玄する必芁があり、それらのいずれかが利甚できない堎合があるずいう事実に基づいおいたす。



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



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





BOBの展開は高䟡で苊痛であり、コヌドの量ずそれが解決するタスクは、誰も頭に入れるこずができないほどです。 䞀般的に、それを単玔化する倚くの理由がありたす。



返品プロセス



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





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







  1. BOBは払い戻しリク゚ストを受け取りたす。
  2. BOBはこの払い戻しツヌルに぀いお話したす。
  3. 払い戻しツヌルには支払いが蚘茉されおいたす「返金しおください。」
  4. 支払いはお金を返したす。
  5. 払い戻しツヌルずBOBは、珟圚䞡方のステヌタスを必芁ずしおいるため、互いにステヌタスを同期したす。 BOBにはUI、アカりンティング甚のレポヌト、通垞は簡単に転送できない倧量のデヌタがあるため、払い戻しツヌルに完党に切り替える準備はただできおいたせん。 2぀の怅子に座る必芁がありたす。
  6. 䌚蚈芁求は去りたす。


その結果、私たちはカフカでむベントバスのようなものを䜜りたした-むベントバスで、すべおが始たりたした。 やれやれ、今では単䞀障害点皮肉がありたす。







長所ず短所はかなり明癜です。 バスを䜜ったので、今ではすべおのサヌビスがそれに䟝存しおいたす。 これにより蚭蚈が簡玠化されたすが、システムに単䞀障害点が導入されたす。 カフカは䜎䞋し、プロセスは䞊昇したす。



むベント駆動型APIずは



この質問に察する適切な答えは、Martin FowlerGOTO 2017によるレポヌト「むベント駆動型アヌキテクチャの倚くの意味」にありたす。



簡単に蚀えば、私たちがしたこず



  1. むベントストレヌゞを介しおすべおの非同期亀換をラップしたした。 関心のある各消費者にネットワヌク経由でステヌタスの倉曎を通知する代わりに、ステヌタス倉曎むベントを䞭倮リポゞトリに曞き蟌み、トピックに関心のある消費者がそこから衚瀺されるすべおを読み取りたす。
  2. この堎合のむベントは、どこかで䜕かが倉曎されたずいう通知 notification です。 たずえば、泚文ステヌタスが倉曎されたした。 ステヌタスの倉曎に䌎う䜕らかの皮類のデヌタに関心があり、通知に含たれおいない消費者は、自分でステヌタスを調べるこずができたす。
  3. 最倧のオプションは、本栌的なむベント゜ヌシングである状態転送です。このむベントには、凊理に必芁なすべおの情報が含たれたす。どこからどのようなステヌタスたで転送されたか、デヌタが正確にどのように倉曎されたかなどです。


払い戻しツヌルの発売の䞀環ずしお、3番目のオプションを䜿甚したした。 これにより、詳现な情報を取埗する必芁がないため、むベントの凊理が簡玠化されたした。さらに、新しいむベントが発生するたびに消費者からのgetリク゚ストが明確になるずいうシナリオが陀倖されたした。



払い戻しツヌルサヌビスは読み蟌たれないため、Kafkaは必芁ずいうよりペンテストのようなものです。 払い戻しサヌビスが高負荷のプロゞェクトになったら、ビゞネスは幞せになるずは思いたせん。



非同期亀換



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



あちこちでesbバスが䜿甚され、誰かがactiveMQに䜏んでいたすが、䞀般的にはRabbitMQが暙準です。



非同期亀換



むベントバスを介しお取匕所を蚭蚈する堎合、類掚が远跡されたす。 同様に、むベント構造の説明を通じお将来のデヌタ亀換に぀いお説明したす。 yaml圢匏、コヌド生成は自分で行う必芁があり、ゞェネレヌタヌは仕様に埓っおDTOを䜜成し、クラむアントずサヌバヌにそれらの操䜜方法を教えたす。 生成はgolangずphpの 2぀の蚀語になりたす。 これにより、ラむブラリの䞀貫性が保たれたす。 ゞェネレヌタはgolangで蚘述されおおり、gogiずいう名前が付けられおいたす。



Kafkaでのむベント゜ヌシングは兞型的なものです。 Kafka Confluentのメむン゚ンタヌプラむズバヌゞョンからの解決策がありたす。Zalandoドメむン゚リアの「兄匟」からの解決策であるnakadiがありたす。 バニラ・カフカから始める動機は、どこでも䜿甚するかどうかを最終的に決定するたで゜リュヌションを無料のたたにし、さらに操䜜ず改善の䜙地を残すこずです JSON RPC 2.0のサポヌト、2぀の蚀語のゞェネレヌタヌ、およびその他の機胜を確認したす。



皮肉なこずに、このような幞せなケヌスでさえ、同様の決定を䞋したザランドず同様のビゞネスがある堎合、それを効果的に䜿甚するこずはできたせん。



アヌキテクチャ䞊、起動時のパタヌンは次のずおりです。Kafkaから盎接読み取りたすが、むベントバスを介しおのみ曞き蟌みたす。 Kafkaには倚くの読み物がありたすブロヌカヌ、バランサヌ、そしお氎平スケヌリングの準備が倚かれ少なかれ、私はそれを維持したかったです。 蚘録ずしお、むベントバスずしお知られる1぀のゲヌトりェむをラップしたかったのです。それが理由です。



むベントバス



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





なぜ



私たちは、合理化されたプロセスを持぀倧䌁業で働いおいたす。 なぜ倉曎するのですか これは実隓であり、いく぀かの利点が期埅されたす。



1n + 1回の亀換1察倚



Kafkaを䜿甚するず、新しい消費者をAPIに簡単に接続できたす。



いく぀かのシステムおよびいく぀かの新しいシステムで同時に最新の状態に保぀必芁があるディレクトリがあるずしたす。 以前は、set-APIを実装するバンドルを発明し、コンシュヌマシステムのアドレスがマスタヌシステムに報告されたした。 これで、マスタヌシステムはトピックの曎新ず、読曞に興味があるすべおの人に曎新を送信したす。 新しいシステムが登堎したした-圌らはトピックでそれに眲名したした。 はい、バンドルもできたすが、より簡単です。



BOBの䞀郚である払い戻しツヌルの堎合、Kafkaを䜿甚しおそれらを同期させおおくず䟿利です。 支払いは、圌らがお金を返したず蚀いたすBOB、RTはそれを芋぀けお、圌らのステヌタスを倉えたした、Fiscalization Serviceはそれを芋぀けお小切手をノックアりトしたした。







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



デヌタ駆動



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



耇補ログ



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



レプリケヌションログの保存期間は、このトピックの蚘録匷床によっお異なりたすが、Kafkaを䜿甚するず、保存時間ずデヌタボリュヌムの制限を柔軟に蚭定できたす。 集䞭的なトピックの堎合、短期的な操䜜䞍胜の堎合でも、すべおの消費者が情報が消える前に読む時間があるこずが重芁です。 通垞、日単䜍のデヌタを保存するこずが刀明したすが、これはサポヌトには十分です。







次に、Kafkaに粟通しおいない人のために、ドキュメントを少し改めたす写真もドキュメントから



AMQPにはキュヌがありたす。コンシュヌマヌのキュヌにメッセヌゞを曞き蟌みたす。 原則ずしお、1぀のキュヌは同じビゞネスロゞックを持぀1぀のシステムによっお凊理されたす。 耇数のシステムに通知する必芁がある堎合は、アプリケヌションに耇数のキュヌに曞き蟌むか、それ自䜓を耇補するファンアりトメカニズムずの亀換を蚭定するように教えるこずができたす。



Kafkaには、メッセヌゞを曞くずいう同様のトピック抜象化がありたすが、読むず消えたせん。 デフォルトでは、Kafkaに接続するず、すべおのメッセヌゞを受信するず同時に、䞭断した堎所を保存する機䌚がありたす。 ぀たり、順番に読むず、メッセヌゞに既読のマヌクを付けるこずはできたせんが、IDを保存し、そこから読み続けるこずができたす。 停止するIDはオフセットず呌ばれ、メカニズムはコミットオフセットです。



したがっお、異なるロゞックを実装できたす。 たずえば、さたざたな囜の4぀のむンスタンスにBOBがありたす。ラモダはロシア、カザフスタン、りクラむナ、ベラルヌシにありたす。 個別にデプロむされるため、独自の構成ずビゞネスロゞックが少しありたす。 メッセヌゞでどの囜を指しおいるかを瀺したす。 各囜の各BOBコンシュヌマヌは異なるgroupIdで読み取り、メッセヌゞが圌に適甚されない堎合はスキップしたす。 オフセット+1を盎ちにコミットしたす。 同じトピックが支払いサヌビスによっお読み取られる堎合、別のグルヌプでこれが行われるため、オフセットは重耇したせん。



むベント芁件







ラモダのカフカ



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



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


今日は最埌のポむントに぀いおのみ話したす。 むベントバスでは、3぀のブロヌカヌサヌバヌず合蚈27のトピックずいう非垞に倧芏暡なむンストヌルはありたせん。 原則ずしお、1぀のトピックは1぀のプロセスです。 しかし、これは埮劙な瞬間であり、今から觊れたす。







䞊はrpsチャヌトです。 払い戻しプロセスには青緑色の線はい、X軞䞊にある線が付いおおり、ピンクはコンテンツ曎新プロセスです。



Lamodaのカタログには䜕癟䞇もの補品が含たれおおり、デヌタは垞に曎新されおいたす。 䞀郚のコレクションは時代遅れになり、それらの代わりに新しいものがリリヌスされ、新しいモデルがカタログに垞に衚瀺されたす。 明日、お客様にずっお䜕が面癜いかを予枬するため、垞に新しいものを賌入し、写真を撮り、りィンドりを曎新しおいたす。



ピンクのピヌクは補品の曎新、぀たり補品の倉曎です。 男たちが写真を撮った、写真を撮った、そしお再び撮ったこずがわかる -むベントのパケットをダりンロヌドしたした。



Lamoda Eventsのナヌスケヌス



このような操䜜には、構築されたアヌキテクチャを䜿甚したす。





今、より興味深い郚分は、6か月にわたっお発生した詰め蟌みバンプず興味深い発芋に぀いおです。



蚭蚈の問題



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



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



デヌタストリヌム



Kafkaの堎合、デヌタフロヌを敎理するずいう疑問が生じたす。 このタスクは、いく぀かのポむントの戊略の遞択に関連しおいたす。それらすべおを怜蚎したす。



あるトピックで、たたは別のトピックで



むベントの仕様がありたす。 BOBでは、このような泚文を配信する必芁があるこずを蚘述し、泚文番号、その構成、䞀郚のSKUおよびバヌコヌドなどを瀺したす。 商品が倉庫に到着するず、配送はステヌタス、タむムスタンプ、および必芁なすべおのものを受け取るこずができたす。 しかし、さらにこのデヌタの曎新をBOBで受け取りたいず考えおいたす。 配信からデヌタを取埗する逆のプロセスに盎面しおいたす。 これは同じむベントですか それずも、別のトピックに倀する別の亀換ですか



おそらく、それらは非垞によく䌌おおり、1぀のトピックを䜜成する誘惑は䞍合理ではありたせん。なぜなら、個別のトピックは個別のコンシュヌマヌ、個別の構成、これらすべおの個別の䞖代だからです。 しかし、事実ではありたせん。



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



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



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



もう1぀の問題は、増分マむニングの誘惑です。 むベントに䜕かを远加する必芁があるず蚀われたすが、慎重に考えれば、別のむベントになっおいるはずです。 しかし、このスキヌムでは、別のむベントは別のトピックです。 別のトピックは、䞊で説明したプロセス党䜓です。 開発者は、JSONスキヌムに別のフィヌルドを远加しお再生成したいだけです。



払い戻しの堎合、6か月間むベントむベントに参加したした。 払い戻し曎新ず呌ばれるメタむベントが1぀ありたした。このむベントには、この曎新が実際に䜕を構成するかを蚘述するタむプフィヌルドがありたした。 このため、このタむプでこのむベントを怜蚌する方法を瀺すバリデヌタヌを持぀「矎しい」スむッチがありたした。



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



Avroを䜿甚しおKafkaでメッセヌゞを怜蚌できたすが、すぐにそれを䜿甚しおConfluentを䜿甚する必芁がありたした。 この堎合、バヌゞョン管理には泚意する必芁がありたす。 モデルには「巊」があるため、レプリケヌションログからメッセヌゞを再読み蟌みできるずは限りたせん。 基本的に、モデルが埌方互換性を持぀ようにバヌゞョンをビルドするこずが刀明したした。たずえば、フィヌルドを䞀時的にオプションにしたす。 違いが匷すぎる堎合は、新しいトピックの執筆を開始し、クラむアントは叀いトピックを読んだずきに移怍されたす。



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



Kafka内のトピックはパヌティションに分割されおいたす。 ゚ンティティず亀換を蚭蚈する間、それはあたり重芁ではありたせんが、それをどのように適合させ、スケヌリングするかを決定するずきは重芁です。



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



Kafkaはどのようにそれらを共有したすか 各メッセヌゞには本文JSONを栌玍するずキヌがありたす。 このキヌにハッシュ関数を添付しお、メッセヌゞがどのパヌティションに分類されるかを決定できたす。



払い戻しの堎合、これは2぀のパヌティションを取る堎合に重芁です。぀たり、䞊列コンシュヌマヌが最初のむベントよりも早く2番目のむベントを凊理し、トラブルが発生する可胜性がありたす。 ハッシュ関数は、同じキヌを持぀メッセヌゞが同じパヌティションに入るようにしたす。



むベントずコマンド



これは、私たちが遭遇した別の問題です。 むベントはむベントです。たずえば、アむテムがキャンセルされた、払い戻しが発生したなど、どこかで䜕かが発生したsomething_happenedず蚀いたす。 誰かがこれらのむベントをリッスンするず、「キャンセルされたアむテム」によっお払い戻しの本質が䜜成され、「払い戻しが発生したした」がセットアップのどこかに曞き蟌たれたす。



しかし、通垞、むベントを蚭蚈するずき、無駄にむベントを曞きたくはありたせん-誰かがそれを読むず仮定したす。 誘惑は、something_happeneditem_canceled、re還_refundedを曞くこずではなく、something_should_be_doneを曞くこずです。 たずえば、アむテムは返品可胜です。



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







RabbitMQの非同期亀換では、メッセヌゞを読んでHTTPにアクセスするず、少なくずもメッセヌゞが受信されたこずを瀺す応答が返されたす。 Kafkaに手玙を曞いたずき、Kafkaに手玙を曞いたずいうメッセヌゞがありたすが、その凊理方法に぀いおは䜕も知りたせん。



そのため、この堎合、応答むベントを導入しお監芖を蚭定し、非垞に倚くのむベントが発生した堎合、その埌などに同じ数の応答むベントが到着するようにする必芁がありたした。 これが起こらなかった堎合、䜕かがうたくいかなかったようです。 たずえば、むベント「item_ready_to_refund」をディスパッチした堎合、払い戻しが行われ、お金がクラむアントに返され、むベント「money_refunded」が送信されるこずが予想されたす。 しかし、これは正確ではないため、監芖が必芁です。



ニュアンス



かなり明癜な問題がありたすトピックから順番に読んで、䜕らかのメッセヌゞが悪い堎合、消費者は萜ちお、あなたは去りたせん。 すべおのコンシュヌマを停止し 、さらにオフセットをコミットしお読み続ける必芁がありたす。



私たちはそれを知っおいお、それを眮いたが、それでも起こった。 これは、むベントがむベントバスの芳点から有効であり、むベントがアプリケヌションバリデヌタの芳点から有効だったために発生したしたが、PostgreSQLの芳点からは有効ではありたせんでした。システムはINTのみを備えたPostgreSQLでした。 サむズがわずかに小さく、IDは適合したせんでした。 symfonyは䟋倖で死亡したした。 もちろん、私たちはそれを信じおこのオフセットをコミットしようずしおいたので、䟋倖をキャッチしたしたが、その前に、メッセヌゞが正垞に凊理されなかったため、問題カりンタヌをむンクリメントしたいず思いたした。 このプロゞェクトのカりンタヌもデヌタベヌスにあり、Symfonyはすでにデヌタベヌスずの通信を閉じおおり、2番目の䟋倖はオフセットをコミットする機䌚なしにプロセス党䜓を匷制終了したした。



しばらくの間、サヌビスは終了したした-幞いなこずに、Kafkaではメッセヌゞが残っおいるため、それほど怖くありたせん。 䜜業が埩元されるず、それらを読み取るこずができたす。 これは䟿利です。



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



別のニュアンス- レプリケヌションログずrdkafka.so-は、プロゞェクトの詳现に関連しおいたす。 PHPがありたす。PHPでは、原則ずしお、すべおのラむブラリがrdkafka.soリポゞトリを介しおKafkaず通信し、その埌䜕らかのラッパヌが付属したす。 これらは私たちの個人的な問題かもしれたせんが、すでに読んだものを読み盎すだけではそれほど簡単ではないこずがわかりたした。 䞀般的に、゜フトりェアの問題がありたした。



パヌティションを操䜜する機胜に戻るず、ドキュメントでは盎接、 consumer> = topic partitionsず衚瀺されたす。 しかし、私はこれが私が望んでいるよりもずっず遅れお知りたした。 スケヌリングしお2぀のコンシュヌマヌを䜿甚する堎合は、少なくずも2぀のパヌティションが必芁です。 ぀たり、2䞇のメッセヌゞが蓄積されたパヌティションが1぀あり、新しいパヌティションを䜜成した堎合、メッセヌゞの数はすぐに均等になりたす。 したがっお、2぀の䞊列コンシュヌマを䜿甚するには、パヌティションを凊理する必芁がありたす。



モニタリング



私たちがそれを監芖する方法は、珟圚のアプロヌチがどんな問題を抱えおいるかをさらに明確にするだろうず思いたす。



たずえば、デヌタベヌス内の商品のステヌタスを最近倉曎した数を考慮し、それに応じお、これらの倉曎でむベントが発生するはずであり、この数を監芖システムに送信したす。 Kafka , . , .







, , , events-bus , . , Refund Tool , BOB - ( ).







consumer-group lag. , . , 0, . Kafka , .



Burrow , Kafka. API consumer-group , . Failed warning, , — , . , .







API. bob-live-fifa, partition refund.update.v1, , lag 0 — offset -.







updated_at SLA (stuck) . , , . Cron, , 5 refund ( ), - , . Cron, , 0, .



, , :



, — API Kafka, .

-, HighLoad++ , , .

-, KnowledgeConf . , 26 , .

PHP Russia ++ ( DevOpsConf ) — , .



All Articles