消息通信组件Net分布式系统的核心中间件之一,应用与系统高并发,各个组件之间解耦的依赖的场景。本框架采用消息队列中间件主要应用于两方面:一是解决部分高并发的业务处理;二是通过消息队列传输系统日志。目前业界使用较多的消息队列组件有RabbitMQ、ActiveMQ、MSMQ、kafka、zeroMQ等,本文对系统架构之MQ Component诠释,并采用RabbitMQ作为消息队列中间件。

图1- 消息队列组件示意图


一、RabbitMQ介绍

  RabbitMQ是一款基于AMQP(消息队列协议),由Erlang开发的开源消息队列组件。是一款优秀的消息队列组件,他由两部分组成:服务端和客户端,客户端支持多种语言的驱动,如:.Net、JAVA、Erlang等。RabbitMQ与其他消息队列组件性能比较,在此不作介绍,网上有大把的资料。


二、RabbitMQ原理简介

图2- RabbitMQ结构示意图

  RabbitMQ中间件分为服务端(RabbitMQ Server)和客户端(RabbitMQ Client),服务端可以理解为是一个消息的代理消费者,客户端又分为消息生产者(Producer)和消息消费者(Consumer)。

  1、消息生产者(Producer):主要生产消息并将消息基于TCP协议,通过建立Connection和Channel,将消息传输给RabbitMQ Server,对于Producer而言基本就完成了工作。

  2、服务端(RabbitMQ Server):主要负责处理消息路由、分发、入队列、缓存和出列。主要由三部分组成:Exchange、RoutingKey、Queue。

    (1)Exchange:用于接收消息生产者发送的消息,有三种类型的exchange:direct, fanout,topic,不同类型实现了不同的路由算法;

    A. direct exchange:将与routing key 比配的消息,直接推入相对应的队列,创建队列时,默认就创建同名的routing key。

    B. fanout exchange:是一种广播模式,忽略routingkey的规则。

    C. topic exchange:应用主题,根据key进行模式匹配路由,例如:若为abc*则推入到所有abc*相对应的queue;若为abc.#则推入到abc.xx.one ,abc.yy.two对应的queue。

    (2)RoutingKey:是RabbitMQ实现路由分发到各个队列的规则,并结合Binging提供于Exchange使用将消息推送入队列;

    (3)Queue:是消息队列,可以根据需要定义多个队列,设置队列的属性,比如:消息移除、消息缓存、回调机制等设置,实现与Consumer通信;

  3、消息消费者(Consumer):主要负责消费Queue的消息,同样基于TCP协议,通过建立Connection和Channel与Queue传输消息,一个消息可以给多个Consumer消费;

  4、关键名词说明:Connection、Channel、Binging等;

    (1)Connection:是建立客户端与服务端的连接。

    (2)Channel:是基于Connection之上建立通信通道,因为每次Connection建立TCP协议通信开销及性能消耗较大,所以一次建立Connection后,使用多个Channel通道通信减少开销和提高性能。

    (3)Binging:是一个捆绑定义,将exchange和queue捆绑,定义routingkey相关策略。


三、RabbitMQ安装部署

  以上对RabbitMQ简介,接下来我们通过实际搭建消息队列服务实践。RabbitMQ服务端能运行于Window、Linux和Mac平台,客户端也支持多种技术的实现。本次我们将在Linux之CentOS7平台搭建。

  1、安装Erlang运行环境

    由于RabbitMQ使用Erlang技术开发,所以需要先安装Erlang运行环境后,才能安装消息队列服务。

    (1)配置系统能正常访问公网,设置默认网关

1
route add  default  gw 192.168.1.1

    (2)安装erlang

1
2
su -c  'rpm -Uvh http://download.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-5.noarch.rpm'
sudo yum install erlang

    (3)检查erlang是否安装成功

1
erl

    (4)安装成功

    

  2、安装RabbitMQ服务端

    (1)下载安装包

1
wget http: //www.rabbitmq.com/releases/rabbitmq-server/v3.6.0/rabbitmq-server-3.6.0-1.noarch.rpm

    (2)安装和配置RabbitMQ服务端,3.6.0版本:

1
2
rpm --import https: //www.rabbitmq.com/rabbitmq-signing-key-public.asc
yum install rabbitmq-server-3.6.0-1.noarch.rpm

    (3)启用web管理插件

1
rabbitmq-plugins enable rabbitmq_management

    (4)启动RabbitMQ

1
2
chkconfig rabbitmq-server  on
/sbin/service rabbitmq-server start

    (5)防火墙开通端口

1
2
3
# firewall-cmd --permanent --zone=public --add-port=5672/tcp
# firewall-cmd --permanent --zone=public --add-port=15672/tcp
# firewall-cmd --reload

    (6)rabbitmq默认会创建guest账号,只能用于localhost登录页面管理员,本机访问地址:http://localhost:15672/

1
2
rabbitmqctl add_user test test
rabbitmqctl set_user_tags test administrator<br>rabbitmqctl set_permissions -p / test  ".*"  ".*"  ".*"

      RabbitMQ 管理员页面。


四、RabbitMQ应用

  本章节描述,web应用生产的日志,通过rabbitmq传输,然后日志服务接收消息队列的消息。

    

图3- 功能结构示意图

  本系统采用官方的Client,通过nuget引用。

  

  1、Web应用生产业务日志

1
2
3
4
5
6
7
8
9
10
[HttpPost]
         public  ActionResult Create()
         {
             this .HttpContext.Session[ "mysession" ] = DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" );
             var  txt = Request.Form[ "txtSite" ].ToString();
             RabbitMQHelper helper =  new  RabbitMQHelper();
             helper.SendMsg(txt +  ",操作日志,时间:"  + DateTime.Now.ToString( "yyyy-MM-dd hh:mm:ss" ));
             return  RedirectToAction( "Index" );
         }

  页面效果图。

  2、日志服务接收日志消息

    基于window form开发一个日志处理服务,并将接收的消息打印出来。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private  void  btnReceive_Click( object  sender, EventArgs e)
         {
             isConnected =  true ;
             using  ( var  channel = connection.CreateModel())
             {
                 channel.QueueDeclare( "MyLog" false false false null );
                 var  consumer =  new  QueueingBasicConsumer(channel);
                 channel.BasicConsume( "MyLog" true , consumer);
                 while  (isConnected)
                 {
                     var  ea = (BasicDeliverEventArgs)consumer.Queue.Dequeue();
                     var  body = ea.Body;
                     var  message = Encoding.UTF8.GetString(body);
                     txtMsg.Text += message +  "\r\n" ;
                 }
             }
         }

  

  3、RabbitMQ页面监控情况

  RabbitMQ自带页面监控工具,通过此工具可以监控MQ的情况:

         

五、总结

  此文大概介绍RabbitMQ搭建和应用于本系统,RabbitMQ还是较为简单,还提供界面监控工具方便运维人员监控。

原文地址:http://www.cnblogs.com/Andon_liu/p/5401961.html

.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注

RabbitMQ消息队列应用相关推荐

  1. RabbitMQ学习系列二:.net 环境下 C#代码使用 RabbitMQ 消息队列

    上一篇已经讲了Rabbitmq如何在Windows平台安装,不懂请移步:RabbitMQ学习系列一:windows下安装RabbitMQ服务 一.理论: .net环境下,C#代码调用RabbitMQ消 ...

  2. RabbitMQ消息队列(十三)-VirtualHost与权限管理

    像mysql有数据库的概念并且可以指定用户对库和表等操作的权限.那RabbitMQ呢?RabbitMQ也有类似的权限管理.在RabbitMQ中可以虚拟消息服务器VirtualHost,每个Virtua ...

  3. rabbitMQ消息队列 – 面板介绍及简单demo

    首先rabbit安装好之后,运维会给一个控制面板. 默认账号密码为guest 登入以后可以看到具体界面. 在此鸣谢百度翻译给予的大力支持.. ###写一个简单的demo 编写之前..虽然说可以直接用底 ...

  4. 大数据互联网架构阶段 QuartZ定时任务+RabbitMQ消息队列

    QuartZ定时任务+RabbitMQ消息队列 一 .QuartZ定时任务解决订单系统遗留问题 情景分析: 在电商项目中 , 订单生成后 , 数据库商品数量-1 , 但是用户迟迟不进行支付操作 , 这 ...

  5. RabbitMQ消息队列(七):适用于云计算集群的远程调用(RPC)

    在云计算环境中,很多时候需要用它其他机器的计算资源,我们有可能会在接收到Message进行处理时,会把一部分计算任务分配到其他节点来完成.那么,RabbitMQ如何使用RPC呢?在本篇文章中,我们将会 ...

  6. (四)RabbitMQ消息队列-服务详细配置与日常监控管理

    (四)RabbitMQ消息队列-服务详细配置与日常监控管理 原文:(四)RabbitMQ消息队列-服务详细配置与日常监控管理 RabbitMQ服务管理 启动服务:rabbitmq-server -de ...

  7. 使用EasyNetQ组件操作RabbitMQ消息队列服务

    RabbitMQ是一个由erlang开发的AMQP(Advanved Message Queue)的开源实现,是实现消息队列应用的一个中间件,消息队列中间件是分布式系统中重要的组件,主要解决应用耦合, ...

  8. 初探 RabbitMQ 消息队列

    初探 RabbitMQ 消息队列 rabbitmq基础概念常见应用场景导入依赖属性配置具体编码定义队列实体类控制器消息消费者主函数测试总结说点什么 SpringBoot 是为了简化 Spring 应用 ...

  9. 基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战

    基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 参考文章: (1)基于RabbitMQ消息队列的分布式事务解决方案 - MQ分布式消息中间件实战 (2)https:// ...

  10. 消息队列——RabbitMQ消息队列集群

    RabbitMQ消息队列集群 消息队列/中间件 RabbitMQ详解 RabbitMQ单机部署 RabbitMQ集群部署 消息队列/中间件 一.前言 在我们秒杀抢购商品的时候,系统会提醒我们稍等排队中 ...

最新文章

  1. 【RecyclerView】 十四、GridLayoutManager 网格布局管理器 ( GridLayoutManager.SpanSizeLookup 指定 item 元素占用网格个数 )
  2. linux 踢出其他用户,Linux查看当前登录用户并踢出用户
  3. windows API 实现截图
  4. 网络安全04_互联网发展史_网线+网卡+协议栈_中继器_集线器_网桥_路由器_AC/AP_防火墙_流控_家庭网络_小型创业公司网络_园区网_政务网络_数据中心网络拓扑_电信网/互联网_Mac地址
  5. mooon db wrapper
  6. 在Zabbix中添加交换机端口监控
  7. laravel 自带验证
  8. 前言【高等数学教程(单变量微积分)】
  9. TigerGraph百万美元挑战赛奖项全揭晓,通过图技术解决全球问题的创新方案令人印象深刻
  10. 牛牛的旅游纪念品 动态规划背包问题
  11. 七牛云 转码_七牛云视频在线转码 - 持久化处理
  12. k8s之无状态服务Deployment1
  13. abs绝对位置指令 三菱plc_三菱FX系列PLC方便指令的使用方法
  14. 机器学习 | 台大林轩田机器学习基石课程笔记12 --- Nonlinear Transformation
  15. win10同时安装wps和office时,如何设置默认应用为office!!!
  16. 智能手表产业迎来潜在的市场空间
  17. 原文 葛底斯堡宣言_如何有感情地背下葛底斯堡演说的全文?
  18. 磁珠和去耦电感的区别
  19. java面向对象程序设计的六大基本原则
  20. EASYRECOVERY_3.3.29包含注册机、都教授数据恢复含注册码

热门文章

  1. 导入BaiduMapSdkDemo报230错误解决思路
  2. 第十周项目1-程序填空与阅读(一)
  3. 第10章-管理Hadoop集群-hadoop 安全模式相关知识点
  4. .NET6之MiniAPI(二十九):UnitTest
  5. CALL FOR DUTY 来和我们一起冒险吧!
  6. C# 数据适配器之 DataAdapter 对象
  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(八)——一步一步教你如何撸Dapr之链路追踪
  8. B 站面试官:“啥是重定向?”
  9. Newbe.Claptrap 0.10.2 发布,Blazor 演示
  10. 云原生 | .NET 5 with Dapr 初体验