背景現在、一部のインターネット企業は、コアビジネスを実行するためにメッセージ キューを使用しています。コアビジネスであるため、データの最終的な一貫性には敏感です。途中でデータが失われると、ユーザーからのクレームにつながり、年末の業績は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つの違いを見てみましょう
>>: クラウドコンピューティングはどのように進化するのでしょうか?
私は13年間のオンライン経験を持つ古いネットユーザーです。趣味でウェブマスターとして5、6年間働いて...
サンディエゴ、データセンターはかなり良いですし、VPSもSSDを搭載していればかなり良いです! Re...
Baidu ウェイトとは何ですか? Baidu ウェイトとは何ですか? これは、ここ数日ネットユーザ...
業界特化型ビジネス クラウド ソフトウェアの大手プロバイダーである Infor は、データとインテリ...
[[352356]] DevOps、モバイル通信、クラウドコンピューティングの発展と進歩により、マシ...
現在、特に独立系ブログサイト向けの無料ウェブサイト構築プログラムが数多くあります。WP、zblogな...
メディア規制当局オブコムによると、アマゾンとマイクロソフトは英国のインターネット産業の70~80%を...
Baidu はついに外部リンク ツールのアップグレード版をリリースしました。このツールは自社サイトの...
仮想化はクラウド コンピューティングをサポートする重要なテクノロジです。クラウド コンピューティング...
ウェブサイトがユーザーを維持し、直帰を減らし、コンバージョンを向上させる方法は、常に注目の話題です。...
Alpharacks は、DDOS 保護、OpenVZ ベースの VPS、サーバー レンタルを提供す...
[[418362]] [51CTO.com クイック翻訳]ほとんどの人にとって、通常の PC に W...
新浪科技は5月8日正午、百度が本日、韓国のSMエンターテインメントと戦略的提携を締結したと正式に発表...
1. 百度の構造調整:事業分割によりLBS部門を設立Baidu の地図部門は最近、LBS (位置情報...
こんにちは、みんな。今日はエッジコンピューティングについて説明します。エッジ コンピューティングとは...