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

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

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

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

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

一、新建RabbitMQ.Receive

private static ConnectionFactory factory = new ConnectionFactory { HostName = "192.168.1.109", UserName = "ljr", Password = "root", VirtualHost = "/" };
         static void Main(string[] args)
         {
             using (var connection = factory.CreateConnection())
             {
                 using (var channel = connection.CreateModel())
                 {
                     var consumer = new EventingBasicConsumer();
                     consumer.Received += (model, ea) =>
                     {
                         var body = ea.Body;
                         var message = Encoding.UTF8.GetString(body);
                         Console.WriteLine(" [x] Received {0}", message);

                         var total = DbHelper.ExecuteScalar("Select Total from ConCurrency where Id = 1", null).ToString();
                         ;

                         DbHelper.ExecuteNonQuery(string.Format("Update ConCurrency Set Total = {0} where Id = 1", value.ToString()), null);
                     };

                     channel.QueueDeclare(queue: "queueName", durable: false, exclusive: false, autoDelete: false, arguments: null);
                     channel.BasicConsume(queue: "queueName", noAck: true, consumer: consumer);

                     Console.WriteLine(" Press [enter] to exit.");
                     Console.ReadLine();
                 }
             }
         }

二、新建RabbitMQ.Send  

         static void Main(string[] args)
         {
             ; i <= ; i++)
             {
                 Task.Run(async () =>
                 {
                     await Produce();
                 });

                 Console.WriteLine(i);
             }

             Console.ReadKey();
         }

         public static Task Produce()
         {
             return Task.Factory.StartNew(() =>
             {
                 using (var connection = factory.CreateConnection())
                 {
                     using (var channel = connection.CreateModel())
                     {
                         var body = Encoding.UTF8.GetBytes(Guid.NewGuid().ToString());
                         channel.QueueDeclare(queue: "queueName", durable: false, exclusive: false, autoDelete: false, arguments: null);
                         channel.BasicPublish(exchange: "", routingKey: "queueName", basicProperties: null, body: body);
                     }
                 }
             });
         }

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

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

2.1、打开接收端

2.2 运行客户端

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

好了,就是这样 、。

高并发场景之RabbitMQ篇的更多相关文章

  1. 高并发场景之RabbitMQ

    高并发场景之RabbitMQ 上次我们介绍了在单机.集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案 但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能 ...

  2. [ 高并发]Java高并发编程系列第二篇--线程同步

    高并发,听起来高大上的一个词汇,在身处于互联网潮的社会大趋势下,高并发赋予了更多的传奇色彩.首先,我们可以看到很多招聘中,会提到有高并发项目者优先.高并发,意味着,你的前雇主,有很大的业务层面的需求, ...

  3. 【转】记录PHP、MySQL在高并发场景下产生的一次事故

    看了一篇网友日志,感觉工作中值得借鉴,原文如下: 事故描述 在一次项目中,上线了一新功能之后,陆陆续续的有客服向我们反应,有用户的个别道具数量高达42亿,但是当时一直没有到证据表示这是,确实存在,并且 ...

  4. HttpClient在高并发场景下的优化实战

    在项目中使用HttpClient可能是很普遍,尤其在当下微服务大火形势下,如果服务之间是http调用就少不了跟http客户端找交道.由于项目用户规模不同以及应用场景不同,很多时候可能不需要特别处理也. ...

  5. java高并发系列 - 第26篇:学会使用JUC中常见的集合,常看看!

    这是java高并发系列第26篇文章. 环境:jdk1.8. 本文内容 了解JUC常见集合,学会使用 ConcurrentHashMap ConcurrentSkipListMap Concurrent ...

  6. Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%。再往后,每提高0.1%,优化难度成指数级增长了。哪怕是千分之一,也直接影响用户体验,影响每天上万张机票的销售额。 在高并发场景下,提供了保证线程安全的对象、方法。比如经典的ConcurrentHashMap,它比起HashMap,有更小粒度的锁,并发读写性能更好。线程安全的StringBuilder取代S

    Qunar机票技术部就有一个全年很关键的一个指标:搜索缓存命中率,当时已经做到了>99.7%.再往后,每提高0.1%,优化难度成指数级增长了.哪怕是千分之一,也直接影响用户体验,影响每天上万张机 ...

  7. 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存

    原文:http://blog.csdn.net/heyewu4107/article/details/71009712 高并发场景系列(一) 利用redis实现分布式事务锁,解决高并发环境下减库存 问 ...

  8. 高并发场景下System.currentTimeMillis()的性能问题的优化 以及SnowFlakeIdWorker高性能ID生成器

    package xxx; import java.sql.Timestamp; import java.util.concurrent.*; import java.util.concurrent.a ...

  9. 高并发场景下System.currentTimeMillis()的性能问题的优化

    高并发场景下System.currentTimeMillis()的性能问题的优化 package cn.ucaner.alpaca.common.util.key; import java.sql.T ...

随机推荐

  1. Odd Numbers of Divisors

    给出一个正奇数K,两个正整数low,high. 有多少整数属于[low, high],且包含K个因子. 数据 C(0 < C < 1e5),测试样例数. (1 < K < 10 ...

  2. [JAVA] - Java OutOfMemoryError分类

    Java OutOfMemoryError一般常遇到的分为两类,分别提示: "Java heap space" 和 "PermGen space",前面的是指j ...

  3. linux 下安装eclipse和pydev插件用来开发python程序

    1.网上的教程要求必须要安装java虚拟机,但是我觉得不用,但是为了不出意外就装吧. (1)去官网下载安装包www.sun.com (2)安装包是.tar.gz的可以用 tar -xzvf +压缩包路 ...

  4. 【转载】简析TCP的三次握手与四次分手

    最近在补习HTTP协议相关知识点,看到这篇讲得不错,所以转载收藏一下,同时也分享给大家.原文地址:http://www.jellythink.com/archives/705,版权归原作者所有. TC ...

  5. android学习12——重载SurfaceView一些方法的执行顺序

    先看代码 public class SurfaceViewActivity extends Activity { @Override public void onCreate(Bundle saved ...

  6. XHTML清单

    1.无序清单 <ul> <li>...</li> <li>...</li> <li>...</li> </ul ...

  7. react-router 中的history(react中关于后退键的处理用的到)

    react-router 中的history react-router 是建立在history之上的:我们来谈谈这个history吧. github: mjackson/history history ...

  8. Sublime Text3安装、注册、插件安装教程

          在前端开发中,有很多软件供我们使用:大名鼎鼎的WebStorm,老而弥坚的Dreamweaver,后起之秀Hbuilder,还有小清新Sublime Text.......等等.作为新手, ...

  9. samba服务搭建

    文件传输 smb主配置文件 /etc/samba/smb.conf? yum install samba samba-client 要启动smb和nmb服务 修改安全级别 security = sha ...

  10. 数据库:oracle,MySQL,SqlServer   安装资源分享

    1. oracle 11g: 链接:http://pan.baidu.com/s/1bppaqR1 密码:http 2. mysql   链接:http://pan.baidu.com/s/1jH8O ...