开篇叙

,顺手点个推荐也不错;

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模拟秒杀商品活动相关推荐

  1. thinkphp5使用redis实现秒杀商品活动

    如题,废话少说贴码为上↓ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 ...

  2. 秒杀的定时任务开启 、 将秒杀商品存入redis、秒杀商品 下单进入订单队列(未支付)、异步实现下单

    秒杀的定时任务开启 ⼀会⼉我们采⽤Spring的定时任务定时将符合参与秒杀的商品查询出来再存⼊到Redis缓存,所以这⾥需要使⽤到定时任务 这⾥我们了解下spring boot定时任务相关的配置,配置 ...

  3. 高并发redis实现秒杀商品

    高并发redis实现秒杀 ps:直接在redis读取插入操作 只是插入的时候要加锁 怎么加锁 http://newmiracle.cn/?p=488 public function miaoshate ...

  4. 什么是redis,用redis进行秒杀项目

    文章目录 什么是NoSql 演变过程 NoSql的特点 什么是Redis Redis能干嘛 http://www.redis.cn 中文网 Redis入门 安装 性能测试 基础知识 五大基本数据类型 ...

  5. gin redis 链接不上_php + redis 高并发商品秒杀 完整业务模拟流程 实现方案

    关于商品秒杀 之前百度了很多关于商品秒杀的业务怎么做,网上的答案真的是五花八门,归纳一下就两种方式 队列或计数器 网上大部分都没有写具体的代码业务 我这里模拟一个业务小场景进行实践 商品:1 每日限量 ...

  6. 使用redis模拟商品秒杀

    简介:现如今在用户访问量激增的情况下,通过redis单线程特性下,通过队列的方式实现商品秒杀 1.用户抢购商品添加队列 const server = require('./lib/mjdblib/db ...

  7. 电商秒杀商品功能实现——rabbitMQ+redis

    1.思路: 当秒杀开始的时候,会有大量的高并发,解决高并发是我们的第一个目标,其次就是高并发的时候,会有超卖的现象,解决超卖是我们的第二个目标. 解决高并发: 我们使用rabbitMQ消息队列,让用户 ...

  8. 高并发下秒杀商品,你必须知道的9个细节

    前言 高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个 ...

  9. 高并发下秒杀商品,必须知道的9个细节

    高并发下如何设计秒杀系统?这是一个高频面试题.这个问题看似简单,但是里面的水很深,它考查的是高并发场景下,从前端到后端多方面的知识. 秒杀一般出现在商城的促销活动中,指定了一定数量(比如:10个)的商 ...

最新文章

  1. Blender创建三维教室场景学习教程 3D Classroom Environment Creation in Blender
  2. 软件工程 项目管理的目标和细节
  3. DVWA1.9平台XSS小结
  4. moveit!功能包安装问题
  5. 单链表的逆序java_java 实现单链表的逆序
  6. QT,C++多项式计算器—version3(厌倦CMD黑框框的走起!)
  7. 蓝桥杯抽卡游戏c语言,取球游戏——第三届蓝桥杯省赛C语言A组第10题
  8. caffe安装,编译(包括CUDA和cuDNN的安装),并训练,测试自己的数据(caffe使用教程)
  9. 使用FFmpeg实现抽取多媒体文件的音频并按照AAC格式进行保存--附源码
  10. 您的框架有多可扩展性?
  11. Halcon学习笔记:select_points_object_model_3d(3D对象模型阀值分割)
  12. python数据库mysql_python数据库(mysql)操作
  13. 仿得微博字符限制效果
  14. 面向对象七大设计原则
  15. oracle如何查询明细账,新纪元通用账证查询打印软件常用问题解答.docx
  16. 单点登录 cas 设置回调地址_单点登录终极方案之 CAS 应用及原理
  17. 计算机关机doc命,[计算机]自动关机命令设置.doc
  18. 雷电模拟器连接hb_原生的安卓模拟器来了,微软发布Your Phone,与三星独家合作...
  19. 宝塔面板申请带有www的二级域名SSL证书失败的处理方法
  20. 网络通信安全基础和OpenSSL

热门文章

  1. 201521123070 《JAVA程序设计》第13周学习总结
  2. go方法的深入探究(7.21增补)
  3. 对象androidandroid 开发中 如何取得ListView 的 每条Item 的对象
  4. 排查 .NET开发的工厂MES系统 内存泄漏分析
  5. .NET Core 服务在 ARM64 服务器中的部署
  6. 手把手教你构建WPF官方开源框架源代码
  7. 使用 Xunit.DependencyInjection 改造测试项目
  8. BCVP,想真正为社区做努力的开发者们
  9. 拥抱.NET 5,从自研微服务框架开始
  10. 如何在Windows上使用Git创建一个可执行脚本?