干货 先上图 源码在系列结束后放出 大概2到3篇 本文从第三部分开始根据winform逐点展开
一. 安装部署
下载 rabbitMQ :http://www.rabbitmq.com/download.html
安装rabbitmq需要erlang,下载erlang:http://www.erlang.org/download.html
按照官网按照步骤,例如windows http://www.rabbitmq.com/install-windows.html
安装完rabbitMQ可以再启动插件扩展,其中包含了一个管理后台
最新版本的后台地址为 http://localhost:15672/
用户名和密码都为guest,输入完成进入主菜单
功能很丰富,可以查看当前服务器的交换机,队列,消息,连接,会话等得使用情况。
基本上到这里服务器的安装部署环节算是ok,很简单。
二. 简介
要了解rabbitMQ 首先要了解AMQP协议 百科上给的很详细 http://baike.baidu.com/view/4023136.htm?fr=aladdin
AMQP 有四个非常重要的概念:虚拟机(virtual host),通道(exchange),队列(queue)和绑定(binding)。
虚拟机: 通常是应用的外在边界,我们可以为不同的虚拟机分配访问权限。虚拟机可持有多个交换机、队列和绑定。
交换机: 从连接通道(Channel)接收消息,并按照特定的路由规则发送给队列。
队列: 消息最终的存储容器,直到消费客户端(Consumer)将其取走。
绑定: 也就是所谓的路由规则,告诉交换机将何种类型的消息发送到某个队列中。
这个概念很重要 不然在学习rabbitmq的地方会碰到很多困难。想要进阶学习的可以参考 https://www.rabbitmq.com/tutorials/amqp-concepts.html
借用官方一个图来阐述AMQP
RabbitMQ是一个消息代理。它的核心原理非常简单:接收和发送消息。
你可以把它想像成一个邮局:你把信件放入邮箱,邮递员就会把信件投递到你的收件人处。在这个比喻中,RabbitMQ是一个邮箱、邮局、邮递员。RabbitMQ和邮局的主要区别是,它处理的不是纸,而是接收、存储和发送二进制的数据——消息。
对于rabbitMQ本身的特点 参考官网 http://www.rabbitmq.com/features.html
1、可靠性(Reliability)
RabbitMQ提供很多特性供我们可以在性能和可靠性作出折中的选择,包括持久化、发送确认、发布者确认和高可用性等。
2、弹性选路(Flexible Routing)
消息在到达队列前通过交换(exchanges)来被选路。RabbitMQ为典型的选路逻辑设计了几个内置的交换类型。对于更加复杂的选路,我们可以将exchanges绑定在一起或者写属于自己的exchange类型插件。
3、集群化(Clustering)
在一个局域网内的几个RabbitMQ服务器可以集群起来,组成一个逻辑的代理人。
4、联盟(Federation)
对于那些需要比集群更加松散和非可靠连接的服务器来说,RabbitMQ提供一个联盟模型(Federation Model)
5、高可用队列(High Available Queue)
可以在一个集群里的几个机器里对队列做镜像,确保即时发生了硬件失效,你的消息也是安全的。
6、多客户端(Many Clients)
有各种语言的RabbitMQ客户端
7、管理UI(Management UI)
RabbitMQ提供一个易用的管理UI来监控和控制消息代理人的各个方面。
8、跟踪(Tracing)
如果你的消息系统行为异常,RabbitMQ提供跟踪支持来找出错误的根源。
9、插件系统(Plugin System)
RabbitMQ提供各种方式的插件扩展,我们可以实现自己的插件。
使用任务队列一个优点是能够轻易地并行处理任务。当处理大量积压的任务,只要增加工作队列,通过这个方式,能够实现轻易的缩放。
三. 初探
文中的winform所采取的client为官方的.net版本 https://github.com/rabbitmq/rabbitmq-dotnet-client
首先是Connection和Channel的概念
Connection 建立与rabbitmq server的一个连接,由ConnectionFactory创建,Channel建立在connection基础上的一个频道,相对于connection来说,它是轻量级的。可以理解成一次会话。
代码示例 本机环境
class="brush:csharp;gutter:true;"> using (IConnection connection = factory.CreateConnection()) { using (IModel channel = connection.CreateModel()) { //do something } }
exchange常用有三种类型:
Direct :处理路由键。需要将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配。这是一个完整的匹配。
Fanout :不处理路由键。你只需要简单的将队列绑定到交换机上。一个发送到交换机的消息都会被转发到与该交换机绑定的所有队列上。
Topic : 将路由键和某模式进行匹配。此时队列需要绑定要一个模式上。符号“#”匹配一个或多个词,符号“*”匹配不多不少一个词。
还有一种多重属性的类型headers,我们在下一章节讨论。
我们用winform分别造成三种类型的exchange来实际体验一下
这里所谓的限定exchange是在我们安装rabbitmq server的时候自动生成的一些 我们的测试不使用这些exchange。
然后我们新建3个Queue,这里我们会发现一个有趣的现象,rabbitmq server对于新生成的队列都会默认绑定在一个名称为“”的默认exchange上。
先试试direct类型,下面我们分别把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在dEx上(direct exchange)。
然后我们根据路由key为空,k,k1,k2,k3来发送消息m1,m2,m3,m4,m5
再用3个队列接收消息试一下结果
因为发送确认标记ack,所以队列上读取过的消息会被删除,为了进一步认证,我在结尾又添加了一个routingkey为k.#的消息(对应绑定Q3),由图可见direct 模式下队列之收取他们完全对应的routingkey消息。
下面我们再试一下fanout类型,把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在fEx上(fanout exchange)。
同上步骤建立绑定关系
生产消息,然后看下队列接受消息的情况
效果很明显,fanout为广播模式。
再试试topic类型 把Q1,Q2,Q3根据路由key为空,k1,k.#绑定在tEx上(topic exchange)。
推送消息
接收消息
通过3种模式 3个队列的消息读取 大家应该了解了这3中模式的区别。
临时有约 本篇的内容相对较少 明天再继续详细讲一些api,发布订阅以及消费者集群等功能,希望对大家有帮助