高并发场景之RabbitMQ篇

简介: 上次我们介绍了在单机、集群下高并发场景可以选择的一些方案,传送门:高并发场景之一般解决方案但是也发现了一些问题,比如集群下使用ConcurrentQueue或加锁都不能解决问题,后来采用Redis队列也不能完全解决问题,因为使用Redis要自己实现分布式锁 这次我们来了解一下一个专门处理队列的组件: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

 

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

相关实践学习
快速体验阿里云云消息队列RocketMQ版
本实验将带您快速体验使用云消息队列RocketMQ版Serverless系列实例进行获取接入点、创建Topic、创建订阅组、收发消息、查看消息轨迹和仪表盘。
消息队列 MNS 入门课程
1、消息队列MNS简介 本节课介绍消息队列的MNS的基础概念 2、消息队列MNS特性 本节课介绍消息队列的MNS的主要特性 3、MNS的最佳实践及场景应用 本节课介绍消息队列的MNS的最佳实践及场景应用案例 4、手把手系列:消息队列MNS实操讲 本节课介绍消息队列的MNS的实际操作演示 5、动手实验:基于MNS,0基础轻松构建 Web Client 本节课带您一起基于MNS,0基础轻松构建 Web Client
目录
相关文章
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
216434 68
|
6月前
|
编解码 人工智能 测试技术
CogView4:智谱开源中文文生图新标杆,中文海报+任意分辨率一键生成
CogView4 是智谱推出的开源文生图模型,支持中英双语输入和任意分辨率图像生成,特别优化了中文文字生成能力,适合广告、创意设计等场景。
300 1
CogView4:智谱开源中文文生图新标杆,中文海报+任意分辨率一键生成
|
10月前
|
机器学习/深度学习 人工智能 分布式计算
【AI系统】分布式通信与 NVLink
进入大模型时代后,AI的核心转向大模型发展,训练这类模型需克服大量GPU资源及长时间的需求。面对单个GPU内存限制,跨多个GPU的分布式训练成为必要,这涉及到分布式通信和NVLink技术的应用。分布式通信允许多个节点协作完成任务,而NVLink则是一种高速、低延迟的通信技术,用于连接GPU或GPU与其它设备,以实现高性能计算。随着大模型的参数、数据规模扩大及算力需求增长,分布式并行策略,如数据并行和模型并行,变得至关重要。这些策略通过将模型或数据分割在多个GPU上处理,提高了训练效率。此外,NVLink和NVSwitch技术的持续演进,为GPU间的高效通信提供了更强的支持,推动了大模型训练的快
298 0
|
11月前
|
物联网 Linux 开发者
电子信息类专业技术学习及比赛路线总结(大一到大三)
电子信息类专业技术学习及比赛路线总结(大一到大三)
|
自然语言处理 安全 开发者
在构建知识库时,如何有效管理领域术语和同义词信息
在构建知识库时,如何有效管理领域术语和同义词信息
441 0
|
存储 前端开发 UED
HTML中的<img>标签使用指南
HTML中的<img>标签使用指南
829 3
|
11月前
|
存储 NoSQL API
.NET NoSQL 嵌入式数据库 LiteDB 使用教程
.NET NoSQL 嵌入式数据库 LiteDB 使用教程~
390 0
|
机器学习/深度学习 自然语言处理 语音技术
Transformer框架
Transformer框架
331 1
He3全能开发工具箱
He3 提供了丰富的工具集、Alt + Space 热键 (可配置)、智能化功能等,让你有更好的体验同时拥有更高的效率。内置超过 200 种实用工具,免费持续更新更多品类。包含智能搜索、类型识别、自定义快捷键等特性,让你的开发效率直接飞起。
265 0
|
UED 开发者
无障碍网页设计(A11Y):提升用户体验,践行社会责任
【4月更文挑战第13天】本文探讨了无障碍网页设计(A11Y)的重要性,强调其消除数字鸿沟、扩大用户群体和优化通用体验的价值。文章介绍了实践无障碍设计的指南,包括使用语义化HTML、提供文本替代、确保键盘可操作性、保证色彩对比度和使用ARIA属性。通过代码示例,展示了如何将这些原则应用到实际项目中,呼吁开发者共同构建更具包容性的网络环境。
321 0