RabbitMq应用一 html
RabbitMQ的具体概念,百度百科一下,我这里说一下个人理解,若是有少或者不对的地方,欢迎纠正和补充。数据库
一个项目架构,小的时候,通常都是传统的单一网站系统,或者项目,三层架构,到如今的MVC架构。随着用户访问量愈来愈多,系统业务愈来愈多,会出现如下问题:数组
1.修改完大量代码后,不敢更新,由于都是集成在一块儿,互相耦合性很是强,一处报错,满盘皆挂;缓存
2.整个项目文件夹,层级愈来愈多,对新来的同事很不友好,文件不可避免的会乱放,重复的过多,甚至为了紧急更新,会把不少本来的须要编译的代码,挪到通常处理程序中,架构
时间越长,越会发现,整个代码结构像一锅粥同样;负载均衡
3.会有不少地方须要记录日志,邮件,短信等等不少须要异步的操做,若是访问量太高,会把这个系统拖垮。异步
上述问题出现必定时间后,必定会重构整个,进行业务分离,SOA架构服务化,这就涉及到多个应用相互之间的通讯,常见的方式,是经过API的方式经过JSON的方式,进行数据交互,性能
这种作法实时性很高,可是对单个业务系统的高峰期压力仍是很是大的,须要对但业务API系统进行负载均衡,这时候,若是说把一些要求实时性相对低一些,而且特别消耗性能的请求,摘出去慢慢处理的话,消息队列就派上用场了,引入的消息队列就成了消息处理的缓冲区。消息队列引入的异步通讯机制,使得发送方和接收方都不用等待对方返回成功消息,就能够继续执行下面的代码,从而提升了数据处理的能力。尤为是当访问量和数据流量较大的状况下,就能够结合消息队列与后台任务,经过避开高峰期对大数据进行处理,就能够有效下降数据库和程序处理数据的负荷。学习
一 搭建环境测试
RabbitMq是由erlang语言开发,全部到先安装erlang语言的环境,传送门下载,而且安装,默认安装后会自动配置一个环境变量ERLANG_HOME ,若是没配置的话,手动配置一下,指向erlang安装目录就能够了。
安装好erlang语言环境,咱们去下载rabbitmq服务了。地址http://www.rabbitmq.com/download.html,下载RabbitMq Server.
下载完,安装完毕后,打开安装目录到sbin下
咱们右键CMD,用管理员身份打开,而后切到上图这个目录下,执行3行命令
rabbitmq-service install rabbitmq-service enable rabbitmq-service start
开启rabbitMq的服务,这时候能够本身查看服务是否开启。
安装好之后,咱们使用rabbitmqctl list_users命令,是列出当前服务用户的列表,
这个用户是我本身添加的,刚开始的时候是默认有一个用户guest
咱们能够本身添加用户,而且设置密码,设置权限,设置管理员操做,还能够删除用户,更改密码
rabbitmqctl add_user feige habi 添加用户,帐号feige,密码habi rabbitmqctl set_permissions feige ".*" ".*" ".*"给feige这个用户设置对全部消息队列设置和配置,读,写的权限 rabbitmqctl set_user_tags feige administrator给feige这个用户设置成管理员
rabbitmqctl delete_user feige 这个是删除用户
rabbitmqctl change_password feige 1234修改feige的密码
运行下面命令来启用管理插件:rabbitmq-plugins enable rabbitmq_management
默认端口:http://localhost:15672/#/这个是能够监控的后台。
综上,RabbitMq的环境已经部署完毕,一些基本命令已经熟悉了,下面开始使用
二 基本使用
在.NET中使用RabbitMQ须要下载RabbitMQ的客户端程序集,能够到官网下载,下载解压后就能够获得RabbitMQ.Client.dll,这就是RabbitMQ的客户端。
在使用RabitMQ以前,须要对下面的几个基本概念说明一下:
RabbitMQ是一个消息代理。他从消息生产者(producers)那里接收消息,而后把消息送给消息消费者(consumer)在发送和接受之间,他可以根据设置的规则进行路由,缓存和持久化。
咱们用VS2012+,能够直接从nuget控制台命令,添加
Install-Package RabbitMq.Client -version 3.6.5
生产(Producing)意思就是发送。发送消息的程序就是一个生产者(producer)。
队列(queue)就是邮箱的名称。消息经过你的应用程序和RabbitMQ进行传输,它们只能存储在队列(queue)中。 队列(queue)容量没有限制,你要存储多少消息均可以——基本上是一个无限的缓冲区。多个生产者(producers)可以把消息发送给同一个队列,一样,多个消费者(consumers)也能从同一个队列(queue)中获取数据。队列能够画成这样(图上是队列的名称):
消费(Consuming)和获取消息是同样的意思。一个消费者(consumer)就是一个等待获取消息的程序
一般,消息生产者,消息消费者和消息代理不在同一台机器上。
下面,咱们用.net代码,来分别作一个制造者,发送消息的控制台,一个消费者,接收消息的控制台,固然,咱们在本机作一下实验,。
/// <summary> /// 消息生产者,客户端消息存进队列中 /// </summary> class Program { static void Main(string[] args) { //建立连接工厂,设置目标,用户,密码 var factory = new ConnectionFactory(); factory.HostName = "127.0.0.1"; factory.UserName = "feiyang"; factory.Password = "123456"; //开启当前服务设置的用户的连接 using (var connection = factory.CreateConnection()) { //开启一个频道 using (var channel = connection.CreateModel()) { //建立一个队列 channel.QueueDeclare("firstQueue",false,false,false,null); byte[] body = null; //消息是以二进制数组的形式传输的,因此若是消息是实体对象的话,须要序列化和而后转化为二进制数组。 for (int i = 0; i < 100000; i++) { body = Encoding.UTF8.GetBytes("这是第-----"+i+"-----条消息"); channel.BasicPublish("", "firstQueue", null, body); Console.Write("成功发送第-----"+i+"-----条消息!"); } Console.ReadKey(); } } } }
上述是消费者控制台代码,我下面那个循环时测试的10W条数据,不断的发送和另外一个控制台不断的获取消息,测试下来还不错性能。。。这个例子发送的消息比较简单,直接转成二进制就能够了,可是若是咱们
用到对象的话,就要先反序列化,再转成二进制。
/// <summary> /// 消息消费者读取消息队列 /// </summary> class Program { static void Main(string[] args) { var factory = new ConnectionFactory(); factory.HostName = "127.0.0.1"; factory.UserName = "feiyang"; factory.Password = "123456"; using (var connection = factory.CreateConnection()) { using (var channel = connection.CreateModel()) { //仍是链接到哪一个队列 channel.QueueDeclare("firstQueue",false,false,false,null); //定义消息接受者 var customer = new QueueingBasicConsumer(channel); //从指定队列获取消息 channel.BasicConsume("firstQueue",true,customer); //开始不断循环出队列的消息 while (true) { var ea = (BasicDeliverEventArgs)customer.Queue.Dequeue(); //将消息二进制转回字符串 var msg = Encoding.UTF8.GetString(ea.Body); Console.WriteLine(msg); } //sw.Stop(); //Console.WriteLine("共用时" + sw.ElapsedTicks + "毫秒"); //Console.ReadKey(); } } } }
这个是消费者端。。下面咱们运行一下。
附加一句,当队列中有数据的话,用rabbitmqctl list_queues,能够列出全部队列名称,和队列中的消息数量
运行的消息生产者客户端后,往队列firstQueue中发送了10W条消息,咱们再运行消费者端。
可见,队列firstQueue中的消息正在不断取出,并且速度很快。
这些是一些RabbitMq的一些基本使用,后面会陆续增长深刻的学习心得。