上次我们介绍了在单机、集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案

但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队列也不能完全解决问题,

因为使用Redis要自己实现分布式锁

这次我们来了解一下一个专门处理队列的组件:RabbitMQ,这个东西天生支持分布式队列。

下面我们来用RabbitMQ来实现上一篇的场景

一、新建RabbitMQ.Receive

private static ConnectionFactory factory = new ConnectionFactory { HostName = "192.168.1.109", UserName = "ljr", Password = "root", VirtualHost = "/" };

 1         static void Main(string[] args)2         {3             using (var connection = factory.CreateConnection())4             {5                 using (var channel = connection.CreateModel())6                 {7                     var consumer = new EventingBasicConsumer();8                     consumer.Received += (model, ea) =>9                     {
10                         var body = ea.Body;
11                         var message = Encoding.UTF8.GetString(body);
12                         Console.WriteLine(" [x] Received {0}", message);
13
14                         var total = DbHelper.ExecuteScalar("Select Total from ConCurrency where Id = 1", null).ToString();
15                         var value = int.Parse(total) + 1;
16
17                         DbHelper.ExecuteNonQuery(string.Format("Update ConCurrency Set Total = {0} where Id = 1", value.ToString()), null);
18                     };
19
20                     channel.QueueDeclare(queue: "queueName", durable: false, exclusive: false, autoDelete: false, arguments: null);
21                     channel.BasicConsume(queue: "queueName", noAck: true, consumer: consumer);
22
23                     Console.WriteLine(" Press [enter] to exit.");
24                     Console.ReadLine();
25                 }
26             }
27         }

二、新建RabbitMQ.Send  

 1         static void Main(string[] args)2         {3             for (int i = 1; i <= 500; i++)4             {5                 Task.Run(async () =>6                 {7                     await Produce();8                 });9
10                 Console.WriteLine(i);
11             }
12
13             Console.ReadKey();
14         }
15
16         public static Task Produce()
17         {
18             return Task.Factory.StartNew(() =>
19             {
20                 using (var connection = factory.CreateConnection())
21                 {
22                     using (var channel = connection.CreateModel())
23                     {
24                         var body = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
25                         channel.QueueDeclare(queue: "queueName", durable: false, exclusive: false, autoDelete: false, arguments: null);
26                         channel.BasicPublish(exchange: "", routingKey: "queueName", basicProperties: null, body: body);
27                     }
28                 }
29             });
30         }

这里是模拟500个用户请求,正常的话最后Total就等于500

我们来说试试看,运行程序

2.1、打开接收端

2.2 运行客户端

2.3、可以看到2边几乎是实时的,再去看看数据库

三、我们在集群里执行

最后数据是1000

完全没有冲突,好了,就是这样 、。

高并发场景之RabbitMQ篇相关推荐

  1. MySQL调优篇:单机数据库如何在高并发场景下健步如飞?

    在当前的IT开发行业中,系统访问量日涨.并发暴增.线上瓶颈等各种性能问题纷涌而至,性能优化成为了现时代中一个炙手可热的名词,无论是在开发.面试过程中,性能优化都是一个常谈常新的话题.而MySQL作为整 ...

  2. 分布式锁和mysql事物扣库存_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  3. 阿里、百度、美团都在用的‘’高并发秒杀系统‘’;抢红包、秒杀活动、微博热搜、12306抢票等高并发场景

    "秒杀活动"."抢红包"."微博热搜"."12306抢票"."共享单车拉新"等都是高并发的典型业务场 ...

  4. java分布式库存系统_这个是真的厉害,高并发场景下的订单和库存处理方案,讲的很详细了!...

    前言 之前一直有小伙伴私信我问我高并发场景下的订单和库存处理方案,我最近也是因为加班的原因比较忙,就一直没来得及回复.今天好不容易闲了下来想了想不如写篇文章把这些都列出来的,让大家都能学习到,说一千道 ...

  5. 干货 | Python后台开发的高并发场景优化解决方案

    嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课 互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求.在平时的工作中,我们或多或少都遇到过服务器压力过大问题.针对该问题,本次公 ...

  6. 架构分层—高并发场景微服务实战(四)

    你好,我是程序员Alan. 在<系统架构设计- 高并发场景微服务实战(三)>一文中,我提了一个问题"系统架构设计为什么要分层?",这篇文章我会详细说一下我的见解,写的比 ...

  7. 用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景?

    用分布式锁来防止库存超卖,但是是每秒上千订单的高并发场景,如何对分布式锁进行高并发优化来应对这个场景? 转载 codeing_doc 最后发布于2018-11-23 09:44:41 阅读数 1073 ...

  8. 高并发场景下数据库的常见问题及解决方案

    一.分库分表 (1)为什么要分库分表 随着系统访问量的增加,QPS越来越高,数据库磁盘容量不断增加,一般数据库服务器的QPS在800-1200的时候性能最佳,当超过2000的时候sql就会变得很慢并且 ...

  9. 万字干货 | Python后台开发的高并发场景优化解决方案

    嘉宾 | 黄思涵 来源 | AI科技大本营在线公开课 互联网发展到今天,规模变得越来越大,也对所有的后端服务提出了更高的要求.在平时的工作中,我们或多或少都遇到过服务器压力过大问题.针对该问题,本次公 ...

最新文章

  1. OPenCv java 形态学操作(12)
  2. c++设计一个不能被继承的类
  3. 小花梨的三角形(暴力上下扫三角形)
  4. css:hover选择器
  5. 漫游Kafka设计篇之消息传输的事务定义
  6. [转载]QQ空间技术架构之深刻揭密
  7. 玩转oracle 11g(11):开启归档模式
  8. iOS开发之--改变系统导航的颜色,字体,还有返回样式的自定义
  9. 国潮国粹剪纸风京剧人物PSD素材,让东方韵味更浓
  10. 百度文库免积分下载器
  11. PaddlePaddle2.0利用ResNet101预训练模型实现蝴蝶分类
  12. 全球第二大硬盘磁头专业制造商成都建基地
  13. 物联网、RISC-V、OS应用、边缘AI蓄势待发...
  14. Html移动端红包雨功能页面实现
  15. P1395 会议 题解
  16. Android 判断当前应用是否开启消息通知
  17. KNN分类——matlab(转载)
  18. linux多字节错误,在Linux中解压缩时遇到多字节字符的问题
  19. python猫狗大战游戏下载_猫狗大战RPG游戏下载-猫狗大战RPG官方版下载v1.1.8-PChome下载中心...
  20. 戴尔DELL SCV/SC系列存储故障 Storage Center停机错误的解决方案

热门文章

  1. android 调用系统相机
  2. iOS自定义View 控件自动计算size能力
  3. RxSwift UI控件扩展
  4. java纳税服务_纳税服务系统【总结】
  5. python微信红包代码_有了这个再也不担心任何微信红包,Python就是好用
  6. .net 常用的插件列表
  7. [THUWC2017]在美妙的数学王国中畅游
  8. 最大熵模型(Maximum Etropy)—— 熵,条件熵,联合熵,相对熵,互信息及其关系,最大熵模型。。...
  9. 使用FileZilla Server轻松搭建个人FTP服务器
  10. C# .net中cookie值为中文时的乱码解决方法