原理と実装のスパイク

スパイクは何ですか

 

スパイクのシーンは、通常12306ウェブサイト上で投票をつかむ電気事業のウェブサイトや休日の出会いに活動の数を開催しました。時間内にいくつかの希少な電気の供給業者のウェブサイトやスペシャルでは、ゼネラル・エレクトリック社のWebサイトが原因でこれらの商品の特殊な性質のため、指定された時間での限定販売となり、多くの顧客を引き付ける買いに来て、意志同時に同意した時点で、ページはラッシュスパイク。

スパイク・システムは、シーンの特徴

  • 多数のユーザーが、同時にスパイクを購入すると同時に、サイト瞬時トラフィック急増を行わ。
  • スパイクは、通常、アクセス要求の在庫数、成功をスパイクするための唯一の少数のユーザーの数よりもはるかに大きいです。
  • スパイクビジネスプロセスは、一般的には、受注在庫削減の下で、比較的簡単です。

ビジネス分析スパイク

  1. 電子商取引の通常の流れ

    (1)製品のクエリ;(2)注文を作成、在庫の(3)控除;(4)は、順序を更新し、(5)支払;(6)売り手は出荷します

  2. 特徴的なスパイク事業

    (1)低価格、(2)著しい促進;(3)瞬間完売、短い(5)倍、高い瞬時並行性;(4)は、一般的タイミング棚です。

 

スパイクアーキテクチャ設計

制限:少数のユーザのみが、バックエンドサービスへの流れのほんの一部を許可するので、ほとんどの交通規制の、成功をスパイクすることを考えます。

多数のユーザーの瞬間流入のためのスパイクシステムが持っているので、高い瞬時ピークを購入するラッシュが存在します開始:クリッピング。ピークフローシステムは、高流量は瞬時にも非常に重要なデザインのアイデアスパイクシステムで時間をかけてスムーズな流れになりますので、どのように、非常に重要な理由を圧倒しています。従来のバッファを使用して実施される方法は、クリッピングとミドルウェア技術をメッセージングています。

非同期処理:スパイク・システムは高度に並行システム、大幅にシステムの同時実行を向上させることができ、非同期処理モードの使用で、実際には、クリッピングの非同期処理の実装です。

メモリキャッシュ:システムの最大のボトルネックは、一般的にスパイクされているデータベースのデータベースのディスクの読み取りと書き込みがIO、低パフォーマンスに属しているため、我々はキャッシュメモリにいくつかのデータやビジネスロジックを置くことができれば、効率が大幅に改善され、読み取りおよび書き込み。

拡大する可能性があります。私たちはより多くのユーザーとより高い同時実行をサポートしたい場合はもちろん、最高のシステムは、トラフィックが来れば、うまくマシンを展開する、弾性的に拡張するために設計されています。多数のマシンが淘宝網、Jingdongはダブル11回の活動として高い取引に対処するとき、それは増加します。

インフラストラクチャソリューション

一般的なスパイクシステムアーキテクチャ

書き込み絵は、ここで説明しました

 

技術的な課題は、スパイク

単に商品のスパイク活動を立ち上げたウェブサイトは、活動に参加するために1万人を引き付けるために期待されていると仮定し、また、同時要求の最大数は、システムのニーズが直面する技術的課題は、スパイクを持っている、10000であることを言いました

  1. 既存のビジネスのウェブサイトへの影響

    スパイク活動は、このイベントは、短い時間を持って、単に追加のマーケティングキャンペーンのウェブサイトである機能を大量に同時アクセス、一緒には、必然的に既存のビジネスとレガシー・アプリケーションの配備サイトに影響を与える場合には、わずかなミスがサイト全体を引き起こす可能性があります麻痺。

    解决方案:将秒杀系统独立部署,甚至使用独立域名,使其与网站完全隔离。

     

  2. アプリケーション、高い同時実行の下で、データベースの負荷

    ユーザーは常にデータベース、アプリケーションサーバとデータベースサーバへの接続、アプリケーションサーバは、負荷圧力の原因となります、Webアプリケーションの一般的なアーキテクチャに基づいてこれらの要求ならばスパイクは、見逃すことはありませんというのアクセスを確保するために、ブラウザのページを更新することにより、開始前にスパイク。

    解决方案:重新设计秒杀商品页面,不使用网站原来的商品详细页面,页面内容静态化,用户请求不需要经过应用服务。

     

  3. ネットワークとサーバーの帯域幅が急激に増加

    その商品のページサイズ200K(主に貿易画像サイズ)を仮定すると、あなたは、ネットワークとサーバの帯域幅2G(200K×10000)、サイト以上の新しいスパイク活動が通常の帯域幅を使用するので、ネットワーク帯域幅を必要とします。

    解决方案:因为秒杀新增的网络带宽,必须和运营商重新购买或者租借。为了减轻网站服务器的压力,需要将秒杀商品页面缓存在CDN,同样需要和CDN服务商临时租借新增的出口带宽。

     

  4. 直接受注

    ゲームのルールは、この時点のみ閲覧製品情報ではなく、注文前に次の商品購入の注文を開始するためにスパイクをスパイクすることです。単一のページには、このURLを取得する場合、あなたは以下の単一スパイクアップするまで開始できない、普通のURLです。

    解决方案:为了避免用户直接访问下单页面URL,需要将改URL动态化,即使秒杀系统的开发者也无法在秒杀开始前访问下单页面的URL。办法是在下单页面URL加入由服务器端生成的随机数作为参数,在秒杀开始的时候才能得到。

     

  5. スパイク商品購入ページのボタンを制御する方法が点灯

    スパイクが始まったときに、これは灰色である前に、購入ボタンは、点灯します。ページが動的に生成されている場合は、当然のことながら、サーバー構成の出力ページ応答を、コントロールボタンが点灯または灰色されていますが、サーバーの負荷圧力側を低減するために、CDNのより良い利用、およびその他のパフォーマンスの最適化リバースプロキシ手段、ページは静的なページ、キャッシュCDN、リバースプロキシサーバー、あるいはユーザのブラウザ上でできるように設計されています。スパイク開始は、ユーザーがページをリフレッシュすると、要求は、アプリケーション・サーバに到達しません。

    解决方案:使用JavaScript脚本控制,在秒杀商品静态页面中加入一个JavaScript文件引用,该JavaScript文件中包含 秒杀开始标志为否;当秒杀开始的时候生成一个新的JavaScript文件(文件名保持不变,只是内容不一样),更新秒杀开始标志为是,加入下单页面的URL及随机数参数(这个随机数只会产生一个,即所有人看到的URL都是同一个,服务器端可以用redis这种分布式缓存服务器来保存随机数),并被用户浏览器加载,控制秒杀商品页面的展示。这个JavaScript文件的加载可以加上随机版本号(例如xx.js?v=32353823),这样就不会被浏览器、CDN和反向代理服务器缓存。
    
    这个JavaScript文件非常小,即使每次浏览器刷新都访问JavaScript文件服务器也不会对服务器集群和网络带宽造成太大压力。

     

  6. のみオーダーの最初の提出は、オーダー・サブシステムに送信されることを可能にする方法

    ユーザーは注文が提出されたかどうかを確認するために送信したときにのみ、一人のユーザに最終的に成功した商品スパイクので、それが必要です。すでに正常に送信順序を持っている場合は、JavaScriptファイルを更新する必要があり、更新開始フラグは何のスパイクではない、購入ボタンがグレー表示されます。実際には、最終ユーザー以来、成功裏に次のシングルのページに入ることを制御することができる単一のページサーバの負荷圧力を低下させるために、順序だけを提出することができ、ユーザーはほんの数単一ページを入力することができ、他のユーザーはページの最後をスパイクに直接行くことができます。

    解决方案:假设下单服务器集群有10台服务器,每台服务器只接受最多10个下单请求。在还没有人提交订单成功之前,如果一台服务器已经有十单了,而有的一单都没处理,可能出现的用户体验不佳的场景是用户第一次点击购买按钮进入已结束页面,再刷新一下页面,有可能被一单都没有处理的服务器处理,进入了填写订单的页面,可以考虑通过cookie的方式来应对,符合一致性原则。当然可以采用最少连接的负载均衡算法,出现上述情况的概率大大降低。

     

  7. どのように注文検査前へ

    ネイティブの単一サーバーのチェックは単一の要求の数を処理し:

            1)10以上の場合は、ユーザにページの端に直接戻されました。

            あなたは10の上にない場合は2)、ユーザーは、確認ページを入力し、注文フォームに必要事項を記入することができます。

 

         提出された注文のグローバル番号を確認します。

           1)商品の総数はスパイクを超えエンドユーザにページを返しました。

           2)スパイクは、サブオーダーシステムに提出項目の合計数を超えません。

    8.スパイクのタイミングは、典型的に添加されます

       この機能は、多くの方法で達成されます。しかし、今より良い方法がある:事前物中のセットは、時間に加えて、ユーザーがフォアグラウンドで商品を見ることができますが、ボタン「購入は今すぐ」をクリックすることはできません。しかし、検討する必要があることを有人可以绕过前端的限制,直接通过URL的方式发起购买フロントデスクでのバックエンドデータベース製品ページだけでなく、バグのページに、すべてのクロック同期を必要とします。バックエンドの制御では、セキュリティが高いです。

タイミングスパイク、そして我々は売り手が編集しない避けるべきではスパイクの前に商品に予期しない影響をもたらします。この特定の変更は、我々は評価が必要です。一般的な禁止の編集、追加の変更は、より多くのデータの改訂プロセスがかかる場合があります。

  1. レスインベントリ操作

    2つのオプションがあり、一方が拍下减库存 他の一方が付款减库存、現在では使用され“拍下减库存”た瞬間の事を捕獲方法、ユーザーエクスペリエンスが良くなります。

  2. 数販売在庫より:インベントリは、「売られ過ぎ」の問題をもたらすでしょう

    実地棚卸の場合に得られた同時更新インベントリの問題が不十分となっており、在庫が販売商品の販売につながる、減少下に残っているので、片スパイクの数を超えることが予想されます。プログラム:采用乐观锁

    update auction_auctions set
    
    quantity = #inQuantity#
    
    where auction_id = #itemId# and quantity = #dbQuantity#

    もう一つの方法が良いだろう、在庫控除への試みと呼ばれ、成功した株式の控除は、単一の論理のもとになります

    update auction_auctions set
    
    quantity = quantity-#count#
    
    where auction_id = #itemId# and quantity >= #count#

    とスパイクの契約

    通常、単一のスパイクの下かつ迅速に後で、それは購入記録の一部に基づいてスクリーニングすることができます。この方法は、十分なセキュリティチェックコードを必要とする特定のチェックコードではなく、亀裂によって達成することができ、使用される方法は、次のとおり秒杀专用验证码,电视公布验证码,秒杀答题

    デザインのアイデア

    上流のリクエストインターセプタシステム、下げ下流圧力:スパイクシステムは、同時実行の偉大な量によって特徴づけられるが、リクエストの数が実際のスパイクが傍受可能性が高いフロントエンドデータベースは読み取りと書き込みのロックの競合、さらにはデッドロックにつながることが原因ではないので、場合、稀に成功しています、最後の要求がタイムアウトしました。 
    キャッシングをフルに活用キャッシングが大幅に読み取りおよび書き込み速度を使用してシステムを向上させることができます。 
    メッセージキューは:メッセージキューは、ピーククリッピングすることができ、同時多数の要求をインターセプトし、これは、アクティブプルサービス処理要求メッセージのメッセージ・キューからのバックグラウンドトラフィック処理能力に応じて、非同期プロセスです。

    フロントエンドソリューション

    ブラウザ(JS):

    静的ページは:すべては最小限に抑えるために、すべての静的および動的要素のイベントページの静的な要素となることができます。CDNによるピークに抵抗します。 
    灰色のユーザーの後にボタンを提出し、再送信は禁止する:に再提出しない 
    ユーザーが制限:では、ユーザーのみが、このような取ることIPの流れ制限など一定の期間、要求を提出することができます

    バックエンドプログラム

    サーバ・コントローラ層(層ゲートウェイ)

    リミットUID(ユーザーID)、アクセス頻度:私たちは、ブラウザの要求へのアクセスをブロックされたが、いくつかのプラグインやその他の悪意のある攻撃、アクセスUIDの必要性とサーバ側制御層のためのアクセス頻度を制限する上で。

      nginxの要求の制限モジュール

      ngx_http_limit_conn_module 

限制连接数模块

通常用来限制同一IP地址的可并发连接数

指令说明:http://nginx.org/en/docs/http/ngx_http_limit_conn_module.html

需要注意的是$binary_remote_addr而不是$remote_addr,$remote_addr的长度为7到15个字节,它的会话信息的长度为32或64 bytes,$binary_remote_addr的长度为4字节,会话信息的长度为32字节,这样设置1M的一个zone时,用$binary_remote_addr方式,该zone将会存放32000个会话。

     ngx_http_limit_req_module

限制请求数模块

通常用来限制同一IP地址单位时间可完成的请求数,限制的方法是采用漏桶算法(Leaky Bucket),每秒处理固定请求数量,推迟过多请求,超过桶的阀值,请求直接终止返回503。

指令说明:http://nginx.org/en/docs/http/ngx_http_limit_req_module.html

   Tengine ngx_http_limit_req_moduleのnginxのベースブランチ

nginx类似,不过支持多个变量,并且支持多个limit_req_zone及forbid_action的设置。

指令说明:http://tengine.taobao.org/document_cn/http_limit_req_cn.html

   SenginxのNgx_http_limit_req_moduleのnginxベースのブランチ

指令说明:http://www.senginx.org/cn/index.php/%E5%9F%BA%E4%BA%8E%E6%9D%A1%E4%BB%B6%E7%9A%84%E9%99%90%E9%80%9F%E5%8A%9F%E8%83%BD

称之为基于条件的限速功能,在Tenginer的limit_req模块基础上,增加condition参数,在条件为真时执行限制动作。

   SenginxのNgx_http_ip_behaviorのnginxベースのブランチ

指令说明:http://www.senginx.org/cn/index.php/%E8%AE%BF%E9%97%AE%E8%A1%8C%E4%B8%BA%E8%AF%86%E5%88%AB%E6%A8%A1%E5%9D%97

称之为行为识别模块,访问行为识别模块的作用是对用户访问网站的行为进行监控

   nginxののベースのngx_http_robot_mitigation Senginx支店

指令说明:http://www.senginx.org/cn/index.php/Robot_Mitigation%E6%A8%A1%E5%9D%97

称之为HTTP机器人缓解,Robot Mitigation模块采用了一种基于“挑战”的验证方法,即向客户端发送特定的、浏览器能解析的应答,如果客户端是真实的浏览器,则会重新触发请求, 并带有一个特定的Cookie值,Robot Mitigation模块会依据此Cookie的信息来决定是否放行此请求。

       サービス層

上記インターセプトアクセス要求の一部のみ、ユーザの数は、各ユーザが依然として要求の非常に多数であるサービス層にのみつの要求があっても、大きなスパイクである場合。例えば、我々は同時に、電話、少なくとも100Wのサービス層同時要求の圧力をつかむために100Wのユーザーの100セットを持っています。

      1、キャッシュのRedisを初期化する主要なスパイク商品やインベントリ情報の必要性

      要求が不正である場合、図2に示すように、(例えば記録するかどうかなどの)要求の正当性をチェックし、迅速な対応は、エラーコードがあった、前方に直接戻されます

      図3に示すように、識別メモリの決意メモリ識別が真である場合、スパイクの端部が直接戻され、(真のスパイクはfalseに、スパイクではない端を終了しました)

      在庫量が少ない0 DECR未満である場合。4、DECRストック前減算演算、それが決定され、メモリフラグを入れ、(スパイクが終了した)trueに設定し、スパイクの端部とバックされます

      5は、それがスパイクを防止するためにスパイクが繰り返されるかどうかが決定される、スパイクが繰り返された場合、エラーコードを直接繰り返し返さスパイク

      クライアントは、スパイクまでスパイクを返すの成功または失敗するまで、自動的にメッセージキュー、ポーリングクエリを受信した場合、図6に示すように、クライアントのキューに対応するサービス処理が終了し、リターンにスパイクMQメッセージに送信されます

      図7は、対応するエンド業務処理:スパイクのビジネス側と実際の契約は、再び(例えばスパイク、インベントリの妥当性、等の終わりかどうかのような)を確認し、キーとしてのRedisに格納された商品のユーザIDは、商品スパイク成功のユーザを識別するために(使用される上記ステップ5)、注文はスパイク生成、在庫を減らすには、成功したリターンスパイク

           注:要求が実際のビジネスこのプロセスの終わりに達した場合でも、それはまた、このようなスパイクが終了できるだけスパイク失敗、で、在庫の不足、在庫本当の失敗を低減し、単一のスパイクを生成することができなかったというように、彼らが失敗した場合、それはスパイクの終わりを返します。

最適化:インタフェース皮革スパイク:クライアント要求をするかどうか、文字列の暗号化とバックエンドのチェックに来たときにスパイクユーザーが再度キャッシュされたユーザーIDは、下のユニークな暗号化文字列を生成し、クライアントに返さしたときにボタンをクリックすると、法律上、合法ではない場合は、直接の要求は違法戻ります。

           制限アクセス頻度にインターフェース:あなたが達成するために、カスタム注釈でインターセプタを使用することができ、あなたがそうすることができ、侵入を減らすための具体的な運用の分離は、非常に簡単に使用することもあります
 

データベース層


上流の傍受をオフに依頼する必要がある場合に、データベース層には、「能力の範囲内」のみのアクセス要求、データベース層のクマ最も脆弱な層、一般的なアプリケーションの設計です。そのため、サービス層における上記キューとバッファを導入することで、心のデータベース平和の下部になるように

実際の在庫削減、更新が在庫> 0追加されるべき目録、およびOrde​​rsテーブルをスパイクする必要性に加えて関節の固有のユーザーIDおよび製品IDをインデックスに、実際の在庫の注文の数よりも負のスパイク以上の出現を防止するため
 

公開された72元の記事 ウォン称賛7 ビュー10000 +

おすすめ

転載: blog.csdn.net/qq_39399966/article/details/105007927