練習スパイクは、赤い封筒シーン一般的な解決策をつかみます
序文
スパイクシーンを伴うだろう、それが商品を購入されているかどうかを、生活の中でほとんどどこでもシーンスパイク、または春祭りのチケットはユビキタス赤い封筒をつかむ。インタビューでは、設計業務のスパイクは、面接や候補Jinjinのためのホットな話題となっていますロックの道。
次に、我々は、実装のスパイクシーンのために赤い封筒をつかむ共有する、一般的な実装は、赤い封筒、ビジネス、ボトルネックや最適化が含まれます。
分析
シーン
そこランダム赤い封筒、赤、封筒や他のクォータなどのアプリケーションシナリオの赤い封筒の多くは、さらに、このような販売促進サービス奪うショッピング手当などの他の赤の品種と一緒に、ある。しかし、技術的な観点から、関係なく、変更を演じているどのように多くのゲームの、コアが類似していますの:
- 安定性:封筒を正常に配布することができることを確認するために、トラフィックの大きなバーストに行きます。
- 正確な:状況が発生していない上でデータが適切に分配されなければなりません。
ビジネス
現金をつかむと、術後の赤い封筒をつかむために類似したコードの複数のコピーを書くために赤い封筒赤い封筒のショッピング手当をつかむしないように十分抽象的になるように設計、多くの変形を生成する必要が赤い封筒が原因さまざまなビジネスであってよいグラブが異なることで、メッセージとして使用することができますサービス自体をモジュール。
テクノロジー
赤い封筒のコアビジネスをつかむ重要なポイントは、それほどに高い同時実行、リソースの競合とに対処するためにある、複雑ではありません。
-
高い同時実行:非同期は、などを制限し、横方向の負荷分散を拡張しました。
-
読み取りと書き込み少ない:キャッシュを。
-
リソースの競合:他のアトミック操作は、キャッシュを制御することができ、またはデータベース・レベルのスクリプトLuaの名前を付けて保存は、インベントリ操作を使用していました。
スキームI - 事前割り当て
該当シーン
レッド数が比較的合理的である、非常に少数のは、余剰在庫の発生状況を、状況の大きさは、ユーザーではありません。
- 長所:非常に高い同時実行キャッシュに対処するために、シンプルで使いやすいです
- 不十分:赤い封筒の多数の頻繁な発行は、多くの人々が受信した場合より、追記型、大量のレコードを割り当てるにつながる無効なデータがたくさんあるでしょう。
簡単な説明
、合計金額と赤い封筒の数に基づいて、赤い封筒を発行する時に事前に割り当てられ確立割り当てアルゴリズムに従って、事前に赤い封筒割り当てレコードのすべてを作成した。ただ、更新するコレクションの赤記録時間を割り当てます。
その他の適切なシステムは、(すべてのユーザーグループ、ラベル、赤、問題は基本的な仕上がりを受信されます)赤い封筒を発行した回数がグループの数よりもはるかに大きい場合、赤い封筒には、適切なユーザー・グループ(赤い封筒の受信者の数を制御することはできません、赤い封筒のケースではありません赤数千として10人のグループでのお支払いなど、より多くの無効なデータ、)。
実装の詳細
プロセス
-
赤い封筒の前に開くために急いでは、ユーザーIDの記録を受け取るために、良い記録を受け取るために事前に割り当てられた赤い封筒は負です。
-
ラッシュを開いた後、唯一のオープン入り口には赤い封筒を受け取ります
-
コア動作は、レコードを更新するために割り当てられた赤い封筒を受け取ることです。
-- 此处划重点 ( ̄▽ ̄)" UPDATE IGNORE record SET user_id = {userId}, gmt_receive = UNIX_TIMESTAMP() WHERE red_envelop_id = 1 AND user_id < 0 LIMIT 1; -- red_envelop_id + user_id 有唯一约束 复制代码
赤い封筒には、レコードをリリース
ID | 総量 | 数量 | ... |
---|---|---|---|
1 | 100 | 3 | ... |
赤い封筒割り当てレコード
ユニーク:
红包ID
+领取用户ID
ID | 赤い封筒ID | お金 | ユーザIDを受け取ります | 時間を受け取ります | ... |
---|---|---|---|---|---|
1 | 1 | 10 | -1 | 0 | ... |
2 | 1 | 60 | -2 | 0 | ... |
3 | 1 | 30 | -3 | 0 | ... |
リマーク
UPDATE IGNORE ... LIMIT 1
:同時要求データ正しさの赤いパケットを受信を確保し、リソースの競合の問題を解決するには。red_envelop_id
+user_id
:同じユーザーに対して同じことを確実にするために、インデックスと一意性制約を作成すると、唯一の赤い封筒を受け取ることができます。- 事前に割り当てられた
user_id
負の値を:のでred_envelop_id
+は、user_id
ユニークな制約があります。 - 基本的なMySQLの先に進むことができますキャッシュケースの導入だけではなく、シンプルで低コストを実現するには、この方法では、小規模な活動一般的にトラフィックの場合。
に掲載されたこの記事 のPu Ruiqingのブログは 、転載、非商業的な使用が再現できますが、元の作者保持する必要があり プルトニウムRuiqing およびリンク: blog.piaoruiqing.comを 。協議や協力の許可側面は、Eメールをご連絡ください: Gmailの@ piaoruiqing。 COM 。
オプションII - リアルタイムの割り当て
該当シーン
受信者の数は、グループ赤封筒(残り払い戻し頻繁に)ように、頻繁に払い戻しを推定することはできません
実装の詳細
プロセス
- キャッシュにロードされた赤い封筒情報を開くためにラッシュの前に、ロード時間は、最初の長いのいくつかのことができます
- (支払いが完了している場合、直接失敗を返す)キャッシュ割り当て封筒アトミックな更新、キャッシュから読み込む(ロードではない):赤い封筒をつかみます
- キャッシュの更新後のデータベース(データ妥当性チェック)に書き込ま
赤い封筒には、レコードをリリース
ID | 総量 | 数量 | 残量 | 残り数 | ... |
---|---|---|---|---|---|
1 | 100 | 3 | 100 | 3 | ... |
赤い封筒割り当てレコード
ユニーク:
红包ID
+领取用户ID
ID | 赤い封筒ID | お金 | ユーザIDを受け取ります | 時間を受け取ります | ... |
---|---|---|---|---|---|
... | ... | ... | ... | ... |
リマーク
- 少し長くのための最初のキャッシュロード時間:赤い封筒はただ、発行DBが不適切なキャッシュをロードするには、この時間を開始したトラフィックの大きなバーストがあるかもしれません。
- キャッシュ・データベースは、強力かつ一貫性を保証することはできません:データベースの保守によってデータの正しさを、のような:キャッシュは赤い封筒の金額を控除したが、異常はデータベースを更新しながら、キャッシュミスが再ロードされるまで、キャッシュは、ロールバックする必要はありませんが発生しました。(そのキャッシュが長すぎる、数秒の時間ではないかもしれません)
- 原子性を確保するためのLuaスクリプトを使用することを検討してキャッシュを更新します。
- リアルタイムの割り当ては、ほとんどのシーンのために赤い無効なレコードを生成しませんが、事前に割り当てられたよりも複雑で達成します。
詳細と最適化
-
クライアントクリック周波数制御はある程度の流れを減らすことができます。
-
赤色光の後、すべての要求を傍受のバッファ層、ダイレクトリターン失敗に引き出さ。
-
制限層ゲートウェイ。
エピローグ
高い同時実行、読み取りと小さなを書いて、リソースの競合によって特徴づけられるスパイクシナリオは、各ポイントは、キューの使用がそのビジネスシナリオに基づいて、データベースのパフォーマンスのボトルネックを解決するため、このような頻繁な問題を解決するために読んで、キャッシングの使用など、適切なソリューションを選択する必要があります。
ビジネスのための赤い封筒をつかむ、事前割り当ておよびリアルタイム配分はソリューション、長所と短所効果的で、具体的にどのような選択肢は、ビジネスニーズに依存します。
国民の関心番号(コード詩的)へようこそ:
に掲載されたこの記事 のPu Ruiqingのブログは 、転載、非商業的な使用が再現できますが、元の作者保持する必要があり プルトニウムRuiqing およびリンク: blog.piaoruiqing.comを 。協議や協力の許可側面は、Eメールをご連絡ください: Gmailの@ piaoruiqing。 COM 。