高并发场景之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的更多相关文章

  1. 高并发场景之RabbitMQ篇

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

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

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

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

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

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

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

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

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

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

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

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

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

  8. Java电商项目,秒杀,抢购等高并发场景的具体场景和一些概念以及处理思路

    这里我借鉴了网上其他大佬的观点: 一:高并发带来的挑战 原因:秒杀抢购会经常会带来每秒几万的高并发场景,为了更快的返回结果给用户. 吞吐量指标QPS(每秒处理请求数),假设一个业务请求响应耗时为100 ...

  9. MySQL在大数据、高并发场景下的SQL语句优化和"最佳实践"

    本文主要针对中小型应用或网站,重点探讨日常程序开发中SQL语句的优化问题,所谓“大数据”.“高并发”仅针对中小型应用而言,专业的数据库运维大神请无视.以下实践为个人在实际开发工作中,针对相对“大数据” ...

随机推荐

  1. iOS_06_基本运算符

    一.算术运算 c语言一共有34种运算符,包括了常见的加减乘除 1.加法运算+ # 除了能做加法运算,还能表示正号:+5.+90 2.减法运算- # 除了能做减法运算,还能表示符号:-10.-200 3 ...

  2. win8.1 “服务器运行失败”的解决方法

    平台:win8.1 SP1 问题:安装QQ安全管家又卸载后出现了奇怪的问题,1.在桌面点右键→个性化时,提示“服务器运行失败”.2.右键点击“这台电脑”,选择“属性”时没有反应.3.开始屏幕里随便选择 ...

  3. python3 打印九九乘法表

    打印九九乘法表 # !/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan for i in range(1, 10): fo ...

  4. (7)Launcher3客制化之,改动单屏幕后,Fix在Hotseat拖动应用删除报错

    改动单屏幕后,在workspace里面拖动图标.到删除button上松开的时候,报错问题. 而且无法再次显示拖动的图标. 拖动松开手时候触发 public void onDropCompleted(f ...

  5. gvim不能直接打开360压缩打开的文件

    1. 压缩文件a.rar 2. 默认使用360压缩打开 3.用gvim打开对应的a.c文件,提示permission denied 4.用gvim跟踪目录,发现360管理的缓冲目录无法打开 原因未分析 ...

  6. js进阶 13-3 jquery动画显示隐藏,滑动,淡入淡出的本质是什么

    js进阶 13-3 jquery动画显示隐藏,滑动,淡入淡出的本质是什么 一.总结 一句话总结:分别改变display,高度,opacity透明度这三种属性. 1.fade系列函数有哪四个? fade ...

  7. mootools常用特性和示例(基础篇1)

    网上关于mootools这个库的信息很少. 公司一些老的项目用到了mootools库,因为要维护,所以接触到了mootools. mootools(文档)官网:http://www.chinamoot ...

  8. IQueryFielter接口

    IQueryFilter基于属性查询过滤数据.需要定义一个where子句.可以指定要返回值的字段列表.如果没有指定列,将返回所有值.当需要根据属性值和属性的关系过滤数据时,使用该接口. 成员 AddF ...

  9. 在vue中使用font-awesome

    1.安装 cnpm i font-awesome -S 2.在main.js中引入 import 'font-awesome/css/font-awesome.min.css'

  10. php获取调用本方法的上个方法,php堆栈,函数入库

    $array =debug_backtrace(); //print_r($array);//信息很齐全 unset($array[0]); foreach($array as $row) { $ht ...