RabbitMQ简介
1、引言
你是否遇到过2个或者多个系统间,需要通过定时任务来同步某些数据?
你是否在为异构系统的不同进程间相互调用、通讯的问题而苦恼、挣扎?
如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题。
消息服务擅长于解决多系统、异构系统间的数据交换(消息通知/通讯)问题,你也可以把它用于系统间服务的相互调用(RPC)。
RabbitMQ就是当前最主流的消息中间件之一。
2、RabbitMQ简介
(1)AMQP(高级消息队列协议 Advanced Message Queue Protocol)
AMQP是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,消息的发送者无需知道消息使用者的存在,反之亦然。
AMQP的主要特征是面向消息、队列、路由(包括点对点和发布/订阅)、可靠性、安全。
AMQP当中有4个概念非常重要: 虚拟主机(virtual host),交换机(exchange),队列(queue)和绑定(binding)。
一个虚拟主机持有一组交换机、队列和绑定。
为什么需要多个虚拟主机呢?很简单,RabbitMQ当中,用户只能在虚拟主机的粒度进行权限控制。因此,如果需要禁止A组访问B组的交换机/队列/绑定,必须为A和B分别创 建一个虚拟主机。每一个RabbitMQ服务器都有一个默认的虚拟主机“/”。
Producer 要产生消息必须要创建一个 Exchange ,Exchange 用于转发消息,但是它不会做存储,如果没有 Queue bind 到 Exchange 的话,它会直接丢弃掉 Producer 发送过来的消息,当然如果消息总是发送过去就被直接丢弃那就没有什么意思了,一个 Consumer 想要接受消息的话,就要创建一个 Queue ,并把这个 Queue bind 到指定的 Exchange 上,然后 Exchange 会把消息转发到 Queue 那里,Queue 会负责存储消息,Consumer 可以通过主动 Pop 或者是 Subscribe 之后被动回调的方式来从 Queue 中取得消息。
Exchange,Queue,RoutingKey
蓝色-- Client(相对于Rabbitmq Server来说)
绿色--Exchange,交换器(Exchange),它是发送消息的实体。
红色—Queue,队列(Queue),这是接收消息的实体。
绑定器(Bind),将交换器和队列连接起来,并且封装消息的路由信息。
RoutingKey,Exchange指向Queue的黑色线,可以将它简单的理解为一条连接Exchange和Queue的路线。
Exchange和Queue都需要通过channel来进行定义,而RoutingKey则只需要在binding时取个名字就行了。
(2)RabbitMQ是一个开源的AMQP实现的代理软件。
RabbitMQ服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。
用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。
下面将重点介绍RabbitMQ中的一些基础概念,了解了这些概念,是使用好RabbitMQ的基础。
3、ConnectionFactory、Connection、Channel
ConnectionFactory、Connection、Channel都是RabbitMQ对外提供的API中最基本的对象。
(1)Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。
Connection就是一个TCP的连接。Producer和Consumer都是通过TCP连接到RabbitMQ Server的。以后我们可以看到,程序的起始处就是建立这个TCP连接。
(2)ConnectionFactory为Connection的制造工厂。
(3)Channel是虚拟连接。它建立在上述的TCP连接中。数据流动都是在Channel中进行的。也就是说,一般情况是程序起始建立TCP连接,第二步就是建立这个Channel。
Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。