背景現在、一部のインターネット企業は、コアビジネスを実行するためにメッセージ キューを使用しています。コアビジネスであるため、データの最終的な一貫性には敏感です。途中でデータが失われると、ユーザーからのクレームにつながり、年末の業績は325になります。以前、数人の友人とチャットしていました。これらの企業はすべて、メッセージ キューとして Kafka を使用しています。 Kafka を使用するとメッセージは失われますか?メッセージが失われた場合、どのように補償措置をとるのでしょうか?今回は一緒に解析していき、Goを使ってデータを失うことなくKafkaを操作する方法を紹介します。 この記事は、https://github.com/Shopify/sarama に基づいて Kafka を操作します。 Kafka アーキテクチャ入門Wikipedia による Kafka の紹介: Kafka は、Apache Software Foundation によって開発され、Scala と Java で記述されたオープンソースのストリーム処理プラットフォームです。このプロジェクトの目標は、リアルタイム データを処理するための、統合された高スループット、低レイテンシのプラットフォームを提供することです。その永続性レイヤーは本質的に「分散トランザクション ログ アーキテクチャを備えた大規模なパブリッシュ/サブスクライブ メッセージ キュー」であり、ストリーミング データを処理するためのエンタープライズ レベルのインフラストラクチャとして非常に価値があります。さらに、Kafka は Kafka Connect を介して外部システムに接続 (データ入出力用) することができ、Java ストリーム処理ライブラリである Kafka Streams も提供します。この設計はトランザクション ログに大きく影響されます。 Kafka の全体的なアーキテクチャは比較的シンプルで、主にプロデューサー、ブローカー、コンシューマーで構成されています。 スクリーンキャプチャ 2021-09-12 午前10時00分13秒 アーキテクチャ図に従って各モジュールを説明します。
他にもいくつか概念を紹介します:
Kafka がメッセージを失う 3 つのノードプロデューサープッシュメッセージノード まず、プロデューサーの一般的な執筆プロセスを見てみましょう。
スクリーンキャプチャ 2021-09-12 午前11時16分43秒 このプロセスを通じて、Kafka が最終的に ack を返してプッシュ メッセージの結果を確認することがわかります。ここで Kafka は次の 3 つのモードを提供します。
したがって、これら 3 つのモードに基づいて、プロデューサーがメッセージをプッシュするときに一定の損失の可能性があると推測できます。分析は次のとおりです。
したがって、実稼働環境では、メッセージの信頼性を確保するためにモード 2 またはモード 3 を選択できます。具体的な選択はビジネス シナリオに基づいて行う必要があります。スループットを重視する場合は、モード 2 を選択します。スループットを気にしない場合は、モード 3 を選択します。データが失われないように完全に保証したい場合は、最も信頼性の高いモード 3 を選択します。 Kafkaクラスタ自体の障害が原因であるデータを受信した後、Kafka クラスターはデータを永続的に保存し、最終的にデータはディスクに書き込まれます。ディスクへの書き込み時に、オペレーティング システムはまずデータをキャッシュに書き込むため、ディスクへの書き込み手順によってデータが失われる可能性もあります。オペレーティング システムがキャッシュ内のデータをディスクに書き込むタイミングは不確実です。したがって、この場合、Kafka マシンが突然クラッシュすると、データ損失も発生します。しかし、これが起こる可能性は非常に低いです。一般的には、社内の Kafka マシンがバックアップされます。この状況は非常に極端であり、無視することができます。 コンシューマー プル メッセージ ノードメッセージがプッシュされると、データがパーティションに追加され、オフセットが割り当てられます。このオフセットは、現在のコンシューマーによって消費される場所を表します。このパーティションを通じてメッセージの順序も保証されます。コンシューマーがメッセージをプルした後、自動送信または手動送信を設定できます。送信が成功すると、オフセットは次のようにシフトします。 スクリーンキャプチャ 2021-09-12 午後3時37分33秒 したがって、自動送信ではデータが失われ、手動送信ではデータが重複することになります。分析は次のとおりです。
データ損失と比較すると、重複した消費はビジネスの期待に沿ったものです。いくつかのべき等設計によってこの問題を回避できます。 実際の戦闘完全なコードはgithubにアップロードされています: https://github.com/asong2020/Golang_Dream/tree/master/code_demo/kafka_demo プッシュメッセージの損失問題を解決する これは主に次の 2 つの方法で解決されます。
そこで、次のコードを記述します (クライアント作成部分を抽出します)。
プルメッセージの損失問題を解決するこの解決策はかなり粗雑です。自動コミット モードを直接使用し、消費ごとにオフセットを手動でコミットします。しかし、重複消費の問題が発生します。ただし、べき等演算を使用すると簡単に解決できます。 コード例:
上記は主に ConsumerGroup 部分の作成に関するものです。注意深い読者は、ここで自動送信を使用していることに気付いたはずです。手動での送信はどうですか?これは、kafka ライブラリの特性が異なるためです。この自動送信は、送信するために MarkMessage() メソッドと組み合わせて使用する必要があります (質問のある友人はそれを練習したり、ソース コードを確認したりできます)。そうでない場合、消費ロジックを次のように記述する必要があるため、送信は失敗します。
または、手動で送信する方法を直接使用して問題を解決することもできます。これには 2 つの手順のみが必要です。 ステップ 1: 自動送信をオフにする:
ステップ 2: 消費ロジックに次のコードを追加します。手動送信モードでは、コミットする前にマークする必要もあります。
完全なコードは GitHub からダウンロードして検証できます。 要約するこの記事では、主に次の 2 つの知識ポイントについて説明します。 Kafka はメッセージ損失を引き起こす可能性がある データ損失を回避するために Go で Kafka を設定する方法 日常のビジネス開発では、多くの企業が分離のためにメッセージ キューを使用しています。そうなると注意を払わなければなりません。 Kafka をメッセージ キューとして使用しても、データが失われないことは保証されません。補償は手動で設定する必要があります。忘れないでください。そうしないと、別の P0 事故が発生します。 |
<<: ウェブサイトを構築する前に、クラウドサーバーと仮想ホストの4つの違いを見てみましょう
>>: クラウドコンピューティングはどのように進化するのでしょうか?
今日は日中何もすることがなかったので、Moonlight Blog の記事をいくつか読んで、自分がと...
システム内のビジネス データの量が数百億に達すると、通常、次のような問題が発生します。 1. データ...
クラウド移行の旅にまだ着手していない組織にとって、1 つ明らかなことは、傍観者でいる時間は終わったと...
エッジ コンピューティングは、データ処理をネットワークのエッジに移動することでクラウド コンピューテ...
「もっと事例が多ければもっと魅力的になるのに」と、ブロガーの友人が私のブログへのメッセージで、私のブ...
Bilibiliはずっとエコシステムをベースにしたプラットフォームを構築してきました。業界で一定の地...
最近、多くの SEO 担当者が、Light Year Forum が閉鎖されたという話題について議論...
現在、クラウド コンピューティングの導入は、ホスト型データ センター インフラストラクチャと同様の傾...
月収10万元の起業の夢を実現するミニプログラム起業支援プランコピーライティングとソフト記事執筆の道で...
初心者のウェブマスターはウェブサイトの最適化に取り組み始めたばかりで、間違いなく期待を抱いています。...
2013 年 1 月 15 日、アメリカの有名なソーシャル ネットワーキング プラットフォームである...
HostCat は Hostgator から 25% 割引のプロモーション情報を受け取りました。もち...
昨日の午後、QQグループでBaiduのアップデートに関する議論を見ました。Baiduの小さな調整は理...
QVODはかつて、オンラインビデオ業界の大きな「ナマズ」や「ダークホース」と見なされていました。しか...
Sogouは上場廃止、Sohu は手放し、Ogawa は撤退し、 Tencent が引き継いだ。すべ...