スパイクシステムを構築する方法 - クラシックインタビューの質問?

回避するために、適切な事業

  1. ユーザーの一部に一定のルールによると、直接のリターンはつかむませんでした。例えば、一部のユーザーは、悪意のあるユーザー、ゴミユーザとして同定されており、ゾンビユーザーは、単にユーザーが完成グラブを持って伝えます
  2. 異なるクライアントを分散させるオープン時間活動が入口。10秒に例えば分散液中の流量は1秒

ハードコア圧縮技術

  1. ポリシーを制限します。例えば、ストレステストでは、我々は限界までQPSシステムを測定し、その後、過剰が直接、完成奪われてきたが返され、あなたが動的に調整することができますnginxのののluaスクリプトをRedisのQPSデータを見て確認することができます
  2. 非同期クリッピング。プレカット赤い封筒の数にRedisのは、赤い封筒に成功したユーザの待ち時間をつかむ、そしてゆっくりとそのバックグラウンドサービス・プロセスという、メッセージキュー、二クリッピングフローにメッセージを送信し、すぐに戻ってください
  3. サービスロジック。例えば、ビジネス・ロジックは、更新行ロックホールド時間の数を減らすことを避けるために、カットを入れて、インベントリ操作を減らし、データベースへの注文のレコードを作成するには、トランザクション制御を使用して操作する前にインベントリ操作を作成することです
  4. マシン構成。もちろん、可能な限り高い程度のサーバマシンの構成は、より良い、より激しいデータベース構成、高い同時実行のグラブは、赤い封筒は、主に高いCPUとIO負荷ネットワークは、マシンのCPUとネットワークIOパフォーマンスを選択する傾向があります

アーキテクチャと実装の詳細

  • フロントエンドモジュール(静的ページ、CDN、クライアント側のキャッシュ)
  • キューイングモジュール(Redisの、非同期キューの注文)
  • サービスモジュール(トランザクション処理、ビジネスロジック、並行性の問題を回避するため)
  • ブラシモジュールを防止する(コード、頻繁にユーザーのアクセスを制限します)

モジュールパース

フロントエンドモジュール

  1. 静的ページは、テンプレートをバックグラウンドレンダリングは、事前にページにスパイクCDNながら、オーバーヘッドレンダリングのサーバーを削減、AJAX非同期要求を持つHTMLファイルを使用する方法の方法を変更しました
  2. クライアントキャッシュ、キャッシュ・コントロールは、ユーザーエクスペリエンスを向上させる、ページにいくつかの時間をキャッシュするようにクライアントを設定するには
  3. 静的リソースの最適化、CSS / JS /画像圧縮、ユーザーエクスペリエンスを強化

キューイングモジュール

  1. Redisのは、ここでのRedisを活用して、買いプレカット株式上のオブジェクト、その後、すぐに成功したユーザーはお待ちください飛びつい戻る次のステージへのインターセプトを要求するごく一部の流れの中で最も
  2. あまりにも多くの商品がスパイクを伴った場合は、まだ比較的大きい次のステージに流れ込み、あなたは、メッセージキュー、メッセージキューに直接Redisのフィルタ後の要求を使用する必要があるので、第二のピークカットトラフィックのメッセージキュー

サービスモジュール

  1. メッセージキュー消費者は、ビジネスロジックは、データベースのトランザクション制御命令を使用することで、在庫削減動作、及び注文は、インベントリ操作を減らすインベントリ回避更新行ロックホールド時間を短縮する操作の前に配置され

ブラシモジュールの防止

  1. ブラシ、IPへの悪質なユーザーのためのスクリプトを作成し、Redisの貿易でのユーザーIDの制限を保存
  2. 平均的なユーザーが狂っクリックするために、一度クリックして数秒ごとにJSコントロールボタンを使用して購入します
  3. 計算バックグラウンドで数学、検証コードを生成するグラフィックスを使用し、BufferedImageの写真を達成するために、ScriptEngineManager計算式

例外処理

  1. サービスが中断されているため、クラッシュしたスパイク活動のスパイクの間に、場合には、唯一、すぐに再スパイク活動に別の時間を見つけるために、アプリケーションまたはサービスがクラッシュ回復しようと、良い方法はありません
  2. 単一の障害に起因するユーザーのリードの下で一定の制限に注文を配置するプロセスは、あなたがトランザクションをロールバックする必要がある場合は、すぐにユーザーに失敗理由を教えて

概要

原則

ビジネス最適化のアイデア:迂回ビジネスへの適切な
技術の最適化のアイデア:上流データベースインターセプター要求しようとすると、データベースへのリクエストの数が多いと、パフォーマンスが劇的に低下しまうので、
建築の原則を:右、シンプル、進化は(上記の初版の最終バージョンがあると言うことができます)このようなアーキテクチャデータベース-キューを使用していない、直接キャッシュを使用

難しさ

  1. 念入りオーバー対処するためのビジネスと技術的な側面からどのように高い同時大量一歩
  2. 異常な状況に対処し、コード内の危機管理計画を準備する方法

ピット

  1. Redisのクラスタキューのメッセージを利用することにより、上記の解決策は、非常に高い同時実行が、操作やメンテナンスコストの高さを運びます。Redisのとメッセージキューは、クラスタの安定性を確保するために使用されなければならないような、それは運用・保守コストが高すぎるつながります。プロの運転・保守チームを維持する必要があるので。
  2. 同時に複数の注文を同じユーザーを避けるため、あなたは書き込みのビジネスロジックに必要か、Ordersテーブルに一意のインデックスのユーザーIDとアイテムIDを追加し、回避売られ過ぎの問題、追加する必要性> SQL更新の数に0条件

最適化

  1. 図7は、LVSさらに改善並行性をバランス4層のロードバランシング層nginxの負荷と一緒に使用されます
  2. 最適化の上にアプリケーションアーキテクチャ、Redisので展開、メッセージキュー、データベース、選択した仮想マシンのハードドライブの帯域幅は、高速読み書きする傾向があります
  3. ウォームアップ先に、CDNのすべてのノード上の静的リソースの同期の最新アップデート、あなたはRedisの中で事前に売却する必要があると負荷の製品情報
  4. 分散アクセスの使用を制限する圧力を低減し、同時接続数が制限速度nginxのに配置Redisの
发布了142 篇原创文章 · 获赞 31 · 访问量 2万+

おすすめ

転載: blog.csdn.net/qq_38905818/article/details/103803676