Kafka はメッセージ損失の問題をどのように解決しますか?

Kafka はメッセージ損失の問題をどのように解決しますか?

[[415220]]

この記事はWeChatの公開アカウント「Micro Technology」から転載したもので、著者はMicro Technologyです。この記事を転載する場合は、Micro Technology の公開アカウントにご連絡ください。

みなさんこんにちは、トムです〜

誰もが Kafka メッセージング フレームワークに精通しており、多くの人が仕事でそれに触れたことがあるはずです。その中心的なアイデアは、高性能 MQ サービスを通じて生産システムと消費システムを接続し、強力なスケーラビリティを備えたシステム間の分離を実現することです。

リンクの 1 つが壊れていたらどうなるのかと疑問に思うかもしれません。

この状況はメッセージ損失と呼ばれ、システム間でデータの不整合が発生します。

では、この問題をどう解決すればよいのでしょうか?これを、プロダクション側、MQ サーバー側、コンシューマー側の 3 つの側面から対処する必要があります。

1. 生産

生成側の責任は、生成されたメッセージが MQ サーバーに到達できるようにすることです。ここでは、操作が成功したかどうかを判断するための応答が必要です。

  1. Future<RecordMetadata> 送信(ProducerRecord<K, V> レコード、コールバック コールバック)

たとえば、上記のコードでは、コールバック関数を使用して、メッセージが正常に送信されたかどうかを判断します。失敗した場合は補償する必要があります。

さらに、送信の柔軟性を向上させるために、Kafkaはさまざまなビジネスが選択できるさまざまなパラメータを提供します。

1.1 パラメータ確認

このパラメータは、メッセージが正常に送信されたと判断される前にメッセージを受信したパーティション レプリカの数を示します。

acks=0の場合、メッセージが送信されれば成功とみなされ、プロデューサーはサーバーノードの応答を待たない。

acks=1、プロデューサーはリーダーパーティションからの応答を受信したときに送信が成功したとみなすことを示します。

acks=-1 の場合、プロデューサーは ISR 内のすべてのレプリカがメッセージを受信した場合にのみ成功と見なします。この構成は最も安全ですが、同期されるノードが増えるためスループットが低下します。

1.2 パラメータの再試行

運用側での再試行回数を示します。再試行回数が尽きてもメッセージが失敗した場合、メッセージはローカル ディスクに一時的に保存され、サービスが復旧した後に再送信されます。推奨値: retries=3

1.3 パラメータ retry.backoff.m

メッセージ送信のタイムアウトまたは失敗後の再試行間隔。一般的に推奨されるセットアップ時間は 300 ミリ秒です。

ここでは、特別な状況に特別な注意を払う必要があります。 MQ サービスが正常に応答しない場合でも、必ずしもメッセージの送信が失敗したことを意味するわけではありません。応答がネットワーク ジッターと一致し、応答がタイムアウトする可能性もあります。

制作側でこれらすべてを実行すると、メッセージが正常に送信されることが保証されますが、メッセージが複数回送信される可能性があり、メッセージが重複することになります。解決策については後で話し合います。

2. MQサーバー

メッセージの保存媒体として、MQ サーバーでもメッセージが失われる可能性があります。たとえば、パーティションが突然クラッシュした場合、このパーティション内のデータが失われないようにするにはどうすればよいでしょうか?この問題をバックアップを通じて解決するために、レプリカの概念を紹介します。

どのようなパラメータを設定できますか?

2.1 パラメータ replication.factor

パーティション レプリカの数 (replication.factor > 1) を示します。リーダー レプリカに障害が発生すると、フォロワー レプリカがリーダーとして選出され、サービスの提供を継続します。

2.2 パラメータ min.insync.replicas

ISR のレプリカの最小数を示します。通常、min.insync.replicas > 1 が設定され、置換を実行してメッセージが失われないようにするために、使用可能なフォロワー レプリカが存在するようになります。

2.3 パラメータ unclean.leader.election.enable

非 ISR セット内のレプリカをリーダ​​ー レプリカとして選出できるかどうか。

true に設定され、フォロワー レプリカの同期メッセージの進行が大幅に遅れている場合、この時点でリーダーとして選出されると、メッセージが失われます。注意してご使用ください。

3. 消費者側

消費者が行う必要があるのは、メッセージを完全に消費して処理することです。しかし、移転を提出する手順があります。

ビジネス処理には長い時間がかかることを考慮して、別のスレッドを開始してメッセージをプルし、ローカル メモリ キューに格納してから、スレッド プールを設定してビジネス ロジックを並列処理する学生もいます。この設計にはリスクが伴います。ローカル メッセージが完全に処理されずにサーバーがクラッシュすると、メッセージは失われます。

正しいアプローチ: メッセージをプル --- ビジネス処理 --- 消費変位を送信

コミット変位に関しては、Kafkaは集中的なパラメータ設定を提供する。

パラメータ enable.auto.commit

消費変位が自動的に送信されるかどうかを示します。

メッセージがプルされたがビジネス ロジックが処理されていない場合、消費変位が送信されたがコンシューマー側がダウンしている場合、コンシューマー側が回復するか、他のコンシューマーがシャードを引き継いでメッセージをプルできなくなり、メッセージが失われます。したがって、通常は enable.auto.commit=false を設定し、消費変位を手動でコミットします。

  1. リスト<文字列>メッセージ = consumer.poll();
  2. processMsg(メッセージ);
  3. コンシューマー.commitOffset();

この解決策は別の問題を引き起こします。この写真を見てみましょう:

メッセージ4~8を取得して業務処理を行った後、消費変位を送信するとシステムがクラッシュしました。最終送信変位は MQ サーバーに保存されませんでした。次にメッセージがプルされたとき、メッセージは依然としてメッセージ 4 から開始されますが、メッセージのこの部分は処理されているため、重複した消費が発生します。

重複消費を解決し、データの不整合を回避する方法

まず、MQ サーバー上の重複メッセージを解決する必要があります。 Kafka バージョン 0.11.0 以降では、各メッセージには一意のメッセージ ID が付きます。 MQ サービスは、スペース・フォー・タイムを使用して重複メッセージを自動的にフィルタリングし、インターフェースの冪等性を保証します。

しかし、これではメッセージの重複の問題を根本的に解決することはできません。 MQ サービスに重複したメッセージが格納されていない場合でも、コンシューマー側はプル方式を使用します。メッセージが繰り返しプルされると、重複した消費にもつながります。このシナリオの問題をどのように解決するのでしょうか?

解決策 1: 一度だけプルします (コンシューマーがメッセージをプルした後、メッセージを処理する前にオフセットを送信します)。しかし、システムがクラッシュし、業務処理が正常に完了しなかった場合、これらのメッセージは再度取得されなくなり、データの不整合が発生します。このソリューションはほとんど使用されません。

解決策 2: 重複メッセージのプルを許可しますが、コンシューマー側で冪等性制御自体を実行します。一度だけ消費されることが保証されています。

べき等性のある技術的ソリューションは数多くあります。処理識別子を保存するには、データ テーブルまたは Redis キャッシュを使用できます。メッセージがプルされるたびに、処理前に処理ステータスが検証され、その後、メッセージを処理するか破棄するかが決定されます。

<<:  サプライチェーンフィンテックはSaaSソフトウェアですか、それともサービスですか?

>>:  Hightouch は、ウェアハウスと SaaS アプリケーション間でデータを同期するために「リバース ETL」をどのように使用しますか?

推薦する

SEO 診断の直帰率は SEO ランキングにどの程度影響しますか?

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っていますSEO は...

WeChatプロモーションと新規顧客獲得のための運用アイデアと実践スキル!

ユーザー運用の3つの重要なタスクは、「新規ユーザーの誘致」、「維持」、「活性化の促進」です。この記事...

中国企業のクールカスタマーマーケティング:企業がコストゼロで数千万の露出を獲得できるよう支援

2018年最もホットなプロジェクト:テレマーケティングロボットがあなたの参加を待っています導入:これ...

Bilibiliはライブストリーミング販売に注力していますが、誰が儲かっているのでしょうか?

1. Bilibiliのライブストリーミング電子商取引への参入は誤報か?昨年12月初旬、ビリビリはひ...

ビリビリはどのようにして二次元世界に「誘拐」されたのか?

最近、ビリビリ動画配信サービス(以下、Bステーション)が公式に主催する「南京夏祭り」が批判され話題と...

EasyStackとChina Power Interconnectionが戦略的に協力し、産業用インターネットクラウドプラットフォームの実装を推進

最近、EasyStack と中国電子工業インターネット株式会社 (CEC インターネット) は、中国...

MinIO と Grafana Mimir を使用してインジケーターの永続ストレージを実装する

Grafana Mimir は、Grafana Labs によって開発された AGPLv3 ライセン...

グリーンラディッシュのアルゴリズムがブラックハットSEOの不正行為を取り締まる

Green Radish アルゴリズムは、2013 年 2 月 19 日に Baidu によってリリ...

競合他社のウェブサイトを包括的かつ詳細に分析する方法

競合他社のウェブサイトを包括的かつ慎重に分析する方法 - ウェブサイト最適化担当者が持つべきスキルの...

パーフェクトダイアリーエンタープライズWeChatプライベートドメインマーケティング

1. 事件名パーフェクトダイアリーエンタープライズWeChatプライベートドメインマーケティング2....

zappiehost: 60% オフ、ニュージーランド VPS\南アフリカ VPS、1Gbps 帯域幅、月額 2.4 ドルから、自動バックアップ

Zappiehostは2009年に設立された会社で、英国に登録され、OVHデータセンターでVPSサー...

Google+1 を介した最適化における不正行為の害についての簡単な説明

Google+1 は検索としては比較的新しいものです。しかし、ある意味では検索に大きな影響を与え始め...

ホストオンはどうですか?フランスのデータセンターVPSの簡単なレビュー

ホストオンはどうですか? hosteons France vps はどうですか? Hosteons ...

RSA イノベーション サンドボックス インベントリ | AppOmni - SaaS データ漏洩の継続的な監視とアラート保護

2020年2月24日から28日まで、サイバーセキュリティ業界の主要イベントであるRSAカンファレンス...

エッジクラウドはまだ手の届かないところにある

エッジクラウドはスマートシティで最も話題になっている技術の 1 つであるにもかかわらず、今年は大きな...