高并发场景之RabbitMQ
高并发场景之RabbitMQ
上次我们介绍了在单机、集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案
但是也发现了一些问题,比如集群下使用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的更多相关文章
- 高并发场景之RabbitMQ篇
上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队 ...
- Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S
Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...
- 【转】记录PHP、MySQL在高并发场景下产生的一次事故
看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且 ...
- 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存
原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...
- 高并发场景下System.currentTimeMillis()的性能问题的优化 以及SnowFlakeIdWorker高性能ID生成器
package xxx; import java.sql.Timestamp; import java.util.concurrent.*; import java.util.concurrent.a ...
- HttpClient在高并发场景下的优化实战
在项目中使用HttpClient可能是很普遍,尤其在当下微服务大火形势下,如果服务之间是http调用就少不了跟http客户端找交道.由于项目用户规模不同以及应用场景不同,很多时候可能不需要特别处理也. ...
- 高并发场景下System.currentTimeMillis()的性能问题的优化
高并发场景下System.currentTimeMillis()的性能问题的优化 package cn.ucaner.alpaca.common.util.key; import java.sql.T ...
- Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路
这里我借鉴了网上其他大佬的观点: 一:高并发带来的挑战 原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户. 吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100 ...
- MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"
本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...
随机推荐
- 对inetd、xinetd与TCP_Wrapper的基本了解
在Linux系统中有一个特殊的守护进程inetd(InterNET services Daemon),它用于Internet标准服务,通常在系统启动时启动.通过命令行可以给出inetd的配置文件,该配 ...
- AE 向已存在的要素类中添加字段
风过无痕 原文向已存在的要素类中添加字段 以前,在用AE写程序的时候,为了方便,一般都是直接新建一个MapControl窗体应用程序.这次需要解决的问题用不到窗口,就突发奇想,直接新建了一个Conso ...
- AE IColor.rgb 的计算
原文 AE IColor.rgb 的计算方法 IColor的rgb属性 是通过对应 的红 绿 蓝 值计算出来的,那么AE的内部计算方法是什么呢? 其实就是一个256进制的BGR数.下面是转换算法: / ...
- 可视化格式模型(visual formatting model)
原文 简书原文:https://www.jianshu.com/p/7632f16ff555 大纲 1.认识可视化模型 2.可视化模型的内容 3.可视化模型的影响因素 1.认识可视化模型 盒子模型是C ...
- Java中的日期操作 分类: B1_JAVA 2015-02-16 17:55 6014人阅读 评论(0) 收藏
在日志中常用的记录当前时间及程序运行时长的方法: public void inject(Path urlDir) throws Exception { SimpleDateFormat sdf = n ...
- PHP 正则截取符合条件的字符串成为数组
$str2 = '<p>678678<em>111111<img src="http://www.XXX.top/upload/image/20180709/1 ...
- 钢琴 - steinway
http://www.wangyanpiano.com/bbs/thread-104723-1-1.html Poston 波士顿钢琴 三角钢琴 GP-156 黑色抛光 178 ...
- ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍
如果我是C罗 原文 ORACLE PL/SQL 中序列(sequence)的简易使用方法介绍 sequence在ORACLE中应用十分广泛,就是序列号的意思,会自动增加指定变数,如逐次增加1或者2或者 ...
- 在word中使用notepad++实现代码的语法高亮 分类: C_OHTERS 2013-09-22 10:38 2273人阅读 评论(0) 收藏
转载自:http://blog.csdn.net/woohello/article/details/7621651 有时写文档时需要将代码粘贴到word中,但直接粘贴到word中的代码虽能保持换行与缩 ...
- 【27.77%】【BZOJ 4066】简单题
Time Limit: 50 Sec Memory Limit: 20 MB Submit: 1919 Solved: 533 [Submit][Status][Discuss] Descript ...