.NetCore+Jexus代理+Redis模拟秒杀商品活动
開篇敘
?,順手點個推薦也不錯;
a.?秒殺流程
b. 封裝StackExchange.Redis的使用類
c. Ubuntu16.04上使用Jexus搭建代理完成分布式部署
d. NetCore寫實時監控隊列服務
秒殺架構設計圖︿( ̄︶ ̄)︿三幅
1. 一般業務性架構
?
2.?后端分布式架構
?
3.?整站分布式
?
項目工程結構描述
a. 該項目git開源地址:?https://github.com/shenniubuxing3/SeckillPro?,線上效果地址:?http://www.lovexins.com:3333/
b.?SeckillPro.Web:面向用戶的web站點,主要提供商品展示,秒殺搶購,搶購結果,訂單列表等功能;
c.?SeckillPro.Api:主要處理秒殺活動的請求,然后加入到秒殺隊列中,以及訂單狀態的查詢接口;
d.?SeckillPro.Server:處理秒殺隊列的服務;根據Redis模糊匹配key的方式,開啟多個商品秒殺的任務,并處理秒殺請求和改變訂單搶購狀態;
e.?SeckillPro.Com:集成公共的方法;這里面前有操作Redis的list,hash,string的封裝類;
SeckillPro.Web商品后臺管理
對于商品活動來說,商品維護是必不可少的,由于這里商品維護的信息比較少,并且這里只加入到了RedisDb中,所以就不直接上代碼了;一個列表,一個添加僅此而已;這里就不再貼代碼了,如果你感興趣可以去我的git上面看源碼:?https://github.com/shenniubuxing3/SeckillPro/blob/master/SeckillPro/SeckillPro.Web/Controllers/HomeController.cs?
SeckillPro.Web用戶端商品列表+秒殺請求+用戶訂單列表
商品列表和訂單列表沒有可以太多說的,一般訂單系統都有這兩個列表;關鍵點在于訂單秒殺流程中,咋們來簡單分析下面向客戶秒殺的流程需要注意的事項:
a. 限制秒殺開始時間和結束時間(測試未限制)
b. 未開始活動限制提交按鈕不可點(測試未限制)
c. 獲取真實剩余庫存限制秒殺提交(獲取redis中商品hash存儲的真實剩余量)
d. 把客戶的秒殺請求轉移到另外的api集群,以此提高面向客戶端的web站點并發承載率(測試項目中我直接指定4545端口的api測試)
這里就不再貼代碼了,如果你感興趣可以去我的git上面看看這部分源碼:?https://github.com/shenniubuxing3/SeckillPro/blob/master/SeckillPro/SeckillPro.Web/Controllers/HomeController.cs?
.NetCore寫處理秒殺活動隊列的服務
這個處理隊列服務處理流程:模糊匹配Redis中每種商品的隊列key-》開啟不同商品的處理隊列任務-》處理秒殺訂單-》更新庫存和秒殺訂單狀態;
a. 模糊匹配Redis中每種商品的隊列key:這里采用的是StackExchange.Redis中指定redis原生命令的方法來獲取匹配隊列key,設計的代碼如下:
/// <summary>
? ? ? ? /// 模糊匹配redis中的key
? ? ? ? /// </summary>
? ? ? ? /// <param name="paramArr"></param>
? ? ? ? /// <returns></returns>
? ? ? ? public async Task<List<string>> MatchKeys(params string[] paramArr)
? ? ? ? {
? ? ? ? ? ? var list = new List<string>();
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var result = await this.ExecuteAsync("keys", paramArr);
? ? ? ? ? ? ? ? var valArr = ((RedisValue[])result);
? ? ? ? ? ? ? ? foreach (var item in valArr)
? ? ? ? ? ? ? ? {
? ? ? ? ? ? ? ? ? ? list.Add(item);
? ? ? ? ? ? ? ? }
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex) { }
? ? ? ? ? ? return list;
? ? ? ? }
? ? ? ? /// <summary>
? ? ? ? /// 執行redis原生命令
? ? ? ? /// </summary>
? ? ? ? /// <param name="cmd"></param>
? ? ? ? /// <param name="paramArr"></param>
? ? ? ? /// <returns></returns>
? ? ? ? public async Task<RedisResult> ExecuteAsync(string cmd, params string[] paramArr)
? ? ? ? {
? ? ? ? ? ? try
? ? ? ? ? ? {
? ? ? ? ? ? ? ? var db = this.GetDb();
? ? ? ? ? ? ? ? return await db.ExecuteAsync(cmd, paramArr);
? ? ? ? ? ? }
? ? ? ? ? ? catch (Exception ex) { }
? ? ? ? ? ? return default(RedisResult);
? ? ? ? }
b. 開啟不同商品的處理隊列任務:通過Task.Factory.StartNew(action,object)方法開啟不同商品的處理秒殺訂單的任務;
c. 更新庫存和秒殺訂單狀態:由于搶購商品要求庫存剩余實時性,所以每處理一個搶購訂單,需要對該商品減去相應的庫存和修改秒殺訂單的狀態方便用戶查看秒殺結果;
d.?處理隊列具體的實現代碼可以去git看下,個人覺得還是有用的:https://github.com/shenniubuxing3/SeckillPro/blob/master/SeckillPro/SeckillPro.Server/Program.cs
使用Jexus代理部署分布式站點和接口
這里部署的代理采用的是Jexus代理;作為在linux和unix上部署.net程序實用的工具,真的很感謝jexus作者;首先本篇講解的部署環境是ubunt16.04x64(至于這么安裝jexus可以參考上一篇分享文章),為了更直觀的看出來效果我在服務器上拷貝了兩份SeckillPro.Web發布的站點,他們代碼都是一樣的只是分別把_Layout.cshtml試圖模板中加入了端口7777和8888,我就用這兩個端口來測試jexus的代理效果;
測試方便直接分別在兩個復制站點中執行如下終端命令:dotnet SeckillPro.Web.dll http://ip:端口 ;一個監聽7777端口一個監聽8888;執行命令效果圖:
監聽7777和8888端口成功后,我們就可以直接在瀏覽器輸入:http://172.16.9.66:7777 訪問,正常情況下能夠看到如下圖示例:
單個站點訪問沒問題了,下面開始配置jexus代理;只需要在jexus/siteconf的配置文件中(我這里是default配置文件),增加如下設置:
注意reproxy參數:
a. 第一個/表示根目錄,一般不變
b. 多個被代理地址使用‘,’隔開;
c. 被代理地址后面也同樣需要加/
此時我們配置完后,只需要啟動jexus就行了:./jws start (怎么啟動可以參考上一篇文章);當啟動jws成功后,我們就能通過配置的80端口,來訪問SeckillPro.Web站點了,效果圖:
至于代理分發的策略暫不在本章的討論范圍內,如果可以建議去jexus官網了解下;同樣對于Seckill.Api我們也可以這樣部署,這里部署了個秒殺線上地址,有興趣的朋友可以點擊試試:http://www.lovexins.com:3333/?(注:這里沒有使用代理)
封裝StackExchange.Redis的使用類StackRedis.cs
其實這個在之前已經分享過了,只不過只有操作string和list的分裝;本篇測試涉及到訂單查詢和商品查詢等功能,所以這里我又擴展了對hash的操作方法,可以說更豐富了吧,如果您正打算使用redis或許直接用我這個封裝類是個不錯的打算;
相關文章:?
在CentOS上使用Jexus托管運行 ZKEACMS
[.NET跨平臺]Jexus獨立版本的便利與過程中的一些坑
來騰訊云開發者實驗室 學習.NET
Jexus針對Asp.net core應用程序的六大不可替代的優勢
Jexus部署.Net Core項目
Linux使用Jexus托管Asp.Net Core應用程序
[.NET跨平臺]Jexus獨立版本的便利與過程中的一些坑
原文地址:http://www.cnblogs.com/wangrudong003/p/7111789.html
.NET社區新聞,深度好文,微信中搜索dotNET跨平臺或掃描二維碼關注
總結
以上是生活随笔為你收集整理的.NetCore+Jexus代理+Redis模拟秒杀商品活动的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: DDD理论学习系列(4)-- 领域模型
- 下一篇: 在ASP.NET CORE 2.0使用S