Net分布式系统之四:RabbitMQ消息队列应用

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

 

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


 

 

1、RabbitMQ介绍算法

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


 

2、RabbitMQ原理简介session

 

图2- RabbitMQ结构示意图架构

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

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

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

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

    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通讯;

  三、消息消费者(Consumer):主要负责消费Queue的消息,一样基于TCP协议,经过创建Connection和Channel与Queue传输消息,一个消息能够给多个Consumer消费;

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

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

    (2)Channel:是基于Connection之上创建通讯通道,由于每次Connection创建TCP协议通讯开销及性能消耗较大,因此一次创建Connection后,使用多个Channel通道通讯减小开销和提升性能。

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


 

3、RabbitMQ安装部署

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

  一、安装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)安装成功

    

 

  二、安装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 管理员页面。

 

 


 

4、RabbitMQ应用

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

    

图3- 功能结构示意图

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

  

 

   一、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" );
         }

  页面效果图。

 

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

     基于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" ;
 
                 }
             }
         }

  

 

   三、RabbitMQ页面监控状况

   RabbitMQ自带页面监控工具,经过此工具能够监控MQ的状况:

         

 

5、总结

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

 

引用:http://www.cnblogs.com/Andon_liu/p/5401961.html

相关文章
相关标签/搜索