MQの冪等とソリューション

1.冪等

  プログラミング動作中に同じの最初のパフォーマンスの影響と影響されている任意の回数実行されるべき等の特性です。人気のデータまたはあなたに繰り返すように要求に応じて何度も話して、あなたは対応するデータがない変更、あなたは間違って行くことができないだろうことを確認する必要があり、データベース内で同様に楽観的ロック機構、更新SQLデータベースであれば、同時実行のシナリオで、パフォーマンスと信頼性のためのデータは、アップデートのバージョンでクエリを追加し、バージョン情報を更新します。

ここでは、例を与えるために、データベースの楽観的ロック機構から学ぶことができます

  • まず、テーブルのバージョンのバージョンフィールドを追加します
  • 更新操作する前に、データベースクエリにこのバージョンを行きます
  • 例えば、条件としてバージョンに更新ステートメントを実行します。
    UPDATE SETは、カウント=カウント-1、VERSION = VERSION VERSION = +をT_REPS 1. 1。
  • あなたは、この条件は施行しません、更新を実行する場合は、このフォームでデータを更新するために他の人がありますが、それは操作を実行しないであろう、と冪等にこの楽観的ロック機構を保護するために。

2.消費者側の冪等の保証

 

1、MQ-クライアントは、ターミナルサーバーMQ-サーバーにメッセージを送信します

図2に示すように、サーバMQサーバ・メッセージ・ランディング

3、送信者のMQ-クライアントにサーバーMQサーバーのACKバック

送信者がメッセージを再送信するタイムアウト後、3つすべてを失う、MQ-クライアントがサーバーMQ-サーバーをもたらすことができる場合は、重複したメッセージを受信します。

 

このとき、再送がMQクライアントが開始され、メッセージは、重量の電源として、各メッセージのためのステップ2を着陸重複メッセージを回避するために、システムは、内部MQ内-MSG-IDを生成する必要があり、MQサーバ処理され基礎のように、この機能は、内部メッセージIDです。

(1)グローバル一意

(2)MQ発生は、メッセージ送信者及びメッセージ受信者シールドを動作の独立性を含みます

 

このインナー-MSG-IDで、前半の再送信、および唯一の秋DB MQ-サーバーのメッセージを保証することができ、前半は冪等を実現しました

 

 

  大規模なトラフィックのピーク期間を生成するために、生産はおそらく、メッセージを繰り返し、この時間を終了します消費者側は、私たちが受けたにも関わらず、私たちのメッセージが複数回に消費されることはありませんことを意味冪等を、実現されます同じメッセージ。

冪等の業界の主流に、二つの作用があります。

1.重量のデータベースキーを使用して一意のID +指紋コード機構、

  

ユーザーの操作に応じて頻繁に瞬間に、この指紋コードは、固有の情報コードに他のサービスを追加するために私たちのルールやタイムスタンプの一部であってもよいし、基本的に私たちのビジネスで、必ずしも私たちのシステムで生成されたではありませんルールスプライシングは来るが、我々は一意性を保証し、このIDがデータベースに存在するか否かを判断するクエリを使用する必要があります。

利点は、モザイクで、シンプルで、クエリを繰り返すかどうかを判断します。

欠点は、単一のデータベース書き込みパフォーマンスのボトルネックがあるかどう際に高い同時実行、ということです

溶液:ルーティングアルゴリズムIDのサブライブラリーサブテーブルのIDによると、特定のデータベースが落ち、その後、第二来IDがこのデータベースに分類され、I単一ライブラリとしてこの時点で体重をチェック同じ。パフォーマンスを向上させる、ライブラリ及び単能性電力マルチデータベースなど、共有データフロー圧力に等を用いたルーティングアルゴリズム。

2.原子性を達成するためのRedis

 

Redisのは、2つの点を考慮するために、原子の必要性を達成するために使用しました

ライブラリがオフの場合、最初は、ライブラリオフデータは、その問題を解決する鍵は、データベースとキャッシュアトミックを行う方法であるかどうか?書き込みのRedisデータベースへの最後または最初の書き込みに、これは問題であることを確認し、書き込みへのデータベースとキャッシュの同期化、キャッシュ更新の除去に関連する問題

第二には、落下のためなので、彼らはタイミング同期の戦略を設定する方法、キャッシュに格納されている場合ではありませんか?ストレージいいえ、あなたは特定の同期がこのデータバス同期ツールのようなものを使用することができ、メッセージのコピーを確実にするために、デュアルキャッシュ戦略を使用することはできません。

 

それはデータを持っている場合は、1)たとえば、あなたはデータの書き込みデータベースを取得し、あなたが最初の主キーに基づいてチェックし、あなたが挿入されていない、大丈夫それを更新

(2)例えば、あなたはRedisのを書いているし、問題はない、とにかく、毎回セット、自然な冪等

(3)例えば、あなたはもう少し複雑なんではない上記の2つのシナリオは、ある、あなたは、あなたがここで消費し、生産者はそのようにグローバルにユニークなIDを追加し、データごとに、IDと同様の注文や物事を送信できるようにする必要があります到着した後に、この第1例に係るidは前に消費者の前に、チェックするために中に入るRedisの?あなたも消費しない場合は、対処した後、IDのRedisのを書きます。あなたも消費する場合は、対処していない、と同じメッセージができることを保証するために、プロセスを繰り返さないでください。

例えば、重複データが挿入を繰返さないとより多くの、私たちはオンラインシステムの前にこの問題を抱えていることを確認するためのユニークなキーベースのデータベースがあり、それがデータを取得する時間である消費者がカフカていないため、すべての再起動を繰り返してもよいですユニークキー制約があるので、我々は、挿入されてしまった後のオフセット、重複データを提出する際に十分な時間なので、重複したデータは、エラーが、データベース内の古いデータにはなりません挿入されます

  

  

おすすめ

転載: www.cnblogs.com/lukeweijava/p/11979027.html