背景現在、一部のインターネット企業は、コアビジネスを実行するためにメッセージ キューを使用しています。コアビジネスであるため、データの最終的な一貫性には敏感です。途中でデータが失われると、ユーザーからのクレームにつながり、年末の業績は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つの違いを見てみましょう
>>: クラウドコンピューティングはどのように進化するのでしょうか?
corgitech.com 、ブラックフライデー VPS スペシャル、VMware 仮想化ベース、W...
ここで皆さんと共有できて嬉しいです。今日は、SEO を使用して人気の映画やテレビ番組からのトラフィッ...
クラウド コンピューティングは、通信やインターネットなどのテクノロジに基づいており、インフラストラク...
序文今年もOpenStackの半年ごとのリリース日がやってきました。これまでに21バージョンがリリー...
インターネット技術の急速な発展、ビジネスモデルの変化、消費の高度化、人件費の上昇などの影響を受け、多...
デジタル変革の波を受けて、企業や組織のデジタル構築の需要が急速に高まっています。ますます多くの企業や...
近年、新しい消費者ブランドが集団的に台頭し、 KOLマーケティング戦略の面では、製品プロモーション、...
赤はウェブデザインで人気のある選択肢であり、朱色、深紅など、さまざまな赤があります。これらのさまざま...
デザイナーの分析能力はデザイン技術そのものよりはるかに優れていると私は以前言いました。では、何を分析...
ウェブサイトのプロモーションの目的は、単にユーザーを誘導して閲覧してもらうという単純なプロセスではあ...
SEO は本当に退屈なので、多くの初心者にとっては耐えられないものになります。現在外部リンクを投稿し...
有名で現在最も人気のある VPS プロバイダー vultr.com が、新たに無料の DNS サービ...
SEMは重要ですか?ウェブサイトのプロモーションを行う際、SEO についてよく話します。実際、SEO...
みなさんこんにちは。長い間記事を書いていませんでした。今日は5月も終わり、時間が経つのは早いですね。...
[編集者注] この記事の著者は@李建忠JZです。著者は、実は中国と海外のインターネットの歴史における...