[このブログは、元に属し、転載については、ソースを明記してください:gdoujkzz]
株が売られ過ぎので、しばしばピーク期間における場合、分散ロックの最終用途に応じてRedisの、本明細書アウトと共有に基づいて達成される関連する最近の研究。
準備:centos7、Redisの、Nginxは、とJMeterのテストツール。
従来の単一のアーキテクチャ
従来のプロセスでは、我々は次のように次の簡単なコードのインベントリ操作は書きました:
以下は、在庫のインタフェース動作(削減)を作成し、私はこのアプローチのパフォーマンス、多くの同志たちは株価が売られ過ぎの表示されないとき、高い並行性を確保するために、このようなAプラスロックを書き込むことができることを信じていAspNetCore.WebAPIに基づいています問題は、そのようなアプローチは売られ過ぎの結果発生しません最後の状況は私たちの記事で、我々が議論したいの範囲を超えているのですか?これは従来のエンタープライズアプリケーション、モノマー構造であれば、以下に示すように、需要を満たすことができます。
使用してシステムを。 使用してSystem.Collections.Genericを。 使用してSystem.Linqのを。 使用してSystem.Threading.Tasksを。 使用してMicrosoft.AspNetCore.Mvcを。 使用してStackExchange.Redisを。 名前空間WebApplication1.Controllers { [ルート(" API / INV " )] [ApiController] パブリック クラスInvController:ControllerBase { プライベート 静的 読み取り専用 オブジェクト LockObject = 新しい オブジェクト(); プライベート 静的な 読み取り専用ConfigurationOptionsオプション= 新しいConfigurationOptions() { エンドポイント = {{ " 192.168.232.132 "、6379 }}、 パスワード = " 123456 " }。 【HTTPGET] 公共のActionResult < ストリング > (GET) { 文字列 MSG = NULL ; ロック(LockObject) { int型 invQty = GetInvQty()。 もし(invQty> 0 ) { InvQty = invQty - 1 ; SetInvQty(invQty); MSG = $ " 控除は成功し、現在の在庫:invQty {} " ; } 他 { MSG = " 推論が失敗し、在庫不足" ; } } Console.WriteLineを(MSG) ; リターンMSG; } プライベート INT GetInvQty() { VAR数量= 0 ; 使用(VAR CONN = ConnectionMultiplexer.Connect(オプション)) { VAR DB = conn.GetDatabase()。 数量 = Convert.ToInt32(db.StringGet(" InvQty " )); } 戻り数量。 } プライベート ボイド SetInvQty(INTの数量) { 使用(VAR CONN = ConnectionMultiplexer.Connect(オプション)) { VAR DB = conn.GetDatabase()を。 db.StringSet(" InvQty "、数量)。 } } } }
ますます複雑なビジネスでは、モノマーアーキテクチャのこの形式は、当社の通常の業務のニーズを満たすために失敗した、多くの企業が、このアーキテクチャモデル次へと進化しました。
分散アーキテクチャ