背景現在、一部のインターネット企業は、コアビジネスを実行するためにメッセージ キューを使用しています。コアビジネスであるため、データの最終的な一貫性には敏感です。途中でデータが失われると、ユーザーからのクレームにつながり、年末の業績は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つの違いを見てみましょう
>>: クラウドコンピューティングはどのように進化するのでしょうか?
今日のマーケティングの世界では、「昔は、Weibo の公式アカウントを持っていなかったらアウトだった...
近年の SEO の人気は誰の目にも明らかです。大規模な Web サイトはもちろんのこと、雨後の筍のよ...
ショートビデオ、セルフメディア、インフルエンサーのためのワンストップサービス人生において、どんな仕事...
Baidu と Google に関しては、ほとんどのウェブマスターは、あなたたちを愛するのは簡単では...
gigsgigscloudの香港データセンターのVPSは、元のCN2に基づいて、まもなく(来週)Ch...
どの海外VPSを選択すればよいですか?使いやすい海外VPSはどれですか?どの海外VPSをお勧めします...
翻訳者 |李睿校正 |孫淑娟 梁策企業や組織は毎年末に、事業規模の拡大やクラウドコストの削減など、翌...
ウェブサイトの一形態として、独立系ブログには独自の利点があります。操作が簡単、インタラクティブ性が強...
インターネットの女王:BATとSohuが世界のトップ10ウェブサイトにランクイン中国新聞社、5月30...
企業がビジネスをクラウド プラットフォームに移行することを計画する場合、クラウド コンピューティング...
v.psはどうですか? v.ps サンノゼはどうですか? v.psは、米国西海岸のサンノゼにVPSク...
現在、パブリック クラウドの市場シェアの大部分は、一握りの業界大手企業が占めています。他の大企業の中...
新快報記者ハン・ジェンが報告最近、設立からわずか3か月の家具EC会社Niuwo.comが倒産しそうに...
私は13年間のオンライン経験を持つ古いネットユーザーです。趣味でウェブマスターとして5、6年間働いて...
コストを最適化しながらクラウド コンピューティングのメリットを最大化するには、DevOps アプロー...