鉴于目前中文的RabbitMQ教程很缺,本博主虽然买了一本rabbitMQ的书,遗憾的是该书的代码用的不是java语言,看起来也有些不爽,且网友们不同人学习所写不同,本博主看的有些地方不太理想,为此本博主决定根据官网进行原版学习,并进行相关笔记记录。
本博主接下来会根据官网http://www.rabbitmq.com/进行学习记录。
首先,我们来认识一下什么是RabbitMQ:下面摘录并翻译官网上两段话来理解一下他是什么:
RabbitMQ is the most widely deployed open source message broker.
RabbitMQ 是部署最广泛的开源消息代理。
RabbitMQ is a message broker: it accepts and forwards messages. You can think about it as a post office: when you put the mail that you want posting in a post box, you can be sure that Mr. or Ms. Mailperson will eventually deliver the mail to your recipient. In this analogy, RabbitMQ is a post box, a post office and a postman.
RabbitMQ是一个消息代理:它接受和转发消息。你可以把它想象成一个邮局:当你把你想要投寄的邮件放在一个邮筒里时,你可以确信邮差先生或女士最终会把邮件发给你的收件人。在这个类比中,RabbitMQ是一个邮箱、一个邮局和一个邮递员。
The major difference between RabbitMQ and the post office is that it doesn't deal with paper, instead it accepts, stores and forwards binary blobs of data ‒ messages.
RabbitMQ和邮局之间的主要区别是,它不处理纸张,而是接受、存储和转发二进制数据消息。
AMQP 0-9-1(高级消息队列协议)是一种消息传递协议,允许符合要求的客户端应用程序与符合要求的消息传递中间件代理进行通信。
好,通过上面的几段话我们大概指导RabbitMQ是干什么了,接下来我们跟着官网进行学习更详细的知识,学习笔记分别按照以下顺序进行记录,各标题将会含有链接附在最后以方便大家学习。
同样我们也会把学习过程中的一些基本最终在第十节总结的时候,发布在此,以便后来者能够方便的学习。
AMQP的模型
AMQP 0-9-1模型认为世界是这样的:消息发布到交换器,交换器通常与邮局或邮箱相类似,上面已经说明。随后交换器根据称为绑定的规则将消息副本分发到队列。然后,AMQP代理要么向订阅了队列的消费者发送消息,要么根据需要从队列中获取/提取消息。队列、交换器和绑定统称为AMQP实体。下面将一些概念进行讲解。
1.生产者
生产者是发送消息的程序
2.消费者
消费者是一个等待接收消息的程序。
3.队列
队列是存在于RabbitMQ内部的邮箱的名称。尽管消息通过RabbitMQ和应用程序流动,但它们只能存储在队列中。队列只受主机的内存和磁盘限制约束,它本质上是一个大型消息缓冲区。许多生产者可以向一个队列发送消息,许多消费者可以尝试从一个队列接收数据。
在使用队列之前,必须声明队列。如果队列不存在,则声明队列将导致它被创建。如果队列已经存在,且其属性与声明中的属性相同,则声明无效。当现有队列属性与声明中的队列属性不相同时,就会出现通道级异常,代码为406。
4.绑定
绑定(Bindings)是交换器为了将消息路由到队列而使用(除其他外)的规则。要表示交换器E将消息路由到队列Q,必须将Q绑定到E. 绑定有一些交换类型使用的可选路由键属性。路由键的目的是选择发布到要路由到绑定队列的交换器的某些消息。换句话说,路由密钥就像一个过滤器。
打个比喻:
- 队列就像你在纽约的目的地
- 交换器就像肯尼迪机场。
- 绑定是从肯尼迪机场到目的地的路由。可以是零,也可以是多种途径
如果不能将AMQP消息路由到任何队列(例如,因为没有发布到它的交换的绑定),则根据发布者设置的消息属性,将其删除或返回给发布者。
5.交换器和交换类型
交换器是发送消息的AMQP实体。交换器接收消息并将其路由到零个或多个队列中。所使用的路由算法依赖于称为绑定的交换类型和规则。AMQP 0-9-1经纪人提供四种交换类型:
名字 | 默认预先声明的名字 |
---|---|
Direct exchange(直接交换器) | (Empty string) and amq.direct |
Fanout exchange(扇形交换器) | amq.fanout |
Topic exchange(主题交换器) | amq.topic |
Headers exchange(头部交换器) | amq.match (and amq.headers in RabbitMQ) |
除了交换类型以外,声明队列还有其他的属性,比较重要的有名字、持久性、自动删除、参数们。
默认交换器:默认交换器是直接交换器,当时用默认交换器时,创建的每个队列都会自动绑定一个与队列名称相同的路由键。举例,当您声明一个名为“search-indexing-online”的队列时,AMQP 0-9-1代理将使用“search-indexing-online”作为路由键将其绑定到默认交换器上。因此,以“search-indexing-online”路由键发布到默认交换器上的消息将被路由到名字为“search-indexing-online”的队列。
a)直接交换器:直接交换器根据消息路由键向队列发送消息。直接交换对于消息的单播路由是理想的(尽管它们也可以用于多播路由)。它是这样工作的:
队列用路由键K绑定到交换
当带有路由键R的新消息到达直接交换器时,交换器将它路由到队列(如果K = R)
直接交换器通常用于以循环方式在多个工作者(同一个应用程序的实例)之间分配任务。当这样做时,重要的是要理解,在AMQP 0-9-1中,消息在消费者之间而不是在队列之间负载均衡。
b)扇形交换器
一个扇形交换器将消息传递给绑定到它的所有队列,并且忽略路由键。如果N个队列绑定到扇出交换,当一个新消息发布到该交换器时,消息的副本将被发送到所有N个队列。扇形交换器是消息广播路由的理想选择。
c)主题交换器
主题交换器根据消息路由键与模式(该模式用于将队列绑定到交换器上)的匹配,将路由消息交换到一个或多个队列。主题交换类型通常用于实现各种发布/订阅模式变体。主题交换器通常用于消息的多播路由。
当一个问题涉及多个使用者/应用程序,这些使用者/应用程序有选择地选择要接收的消息类型时,应该考虑使用主题交换。
d)头部交换器
貌似不经常使用,暂时不介绍
6.连接connection
AMQP连接通常是长期的。AMQP是一个应用程序级协议,使用TCP进行可靠的传输。AMQP连接使用身份验证,可以使用TLS (SSL)进行保护。当应用程序不再需要连接到AMQP代理时,它应该优雅地关闭AMQP连接,而不是突然地关闭底层的TCP连接。
7.信道channel
为了方便理解,打个比喻,将connection比作电缆,channel就是里面的光纤,一个连接可以有很多信道,各个信道相互独立传输信息。
8.虚拟主机virtural hosts
为了使单个代理能够承载多个独立的“环境”(用户组、交换、队列等),AMQP包含虚拟主机(vhosts)的概念。它们类似于许多流行Web服务器使用的虚拟主机,并提供AMQP实体所在的完全独立的环境。AMQP客户端指定在AMQP连接协商期间希望使用的vhost。
- 官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
- 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
- 官网英文版学习——RabbitMQ学习笔记(三)Hello World!
- 官网英文版学习——RabbitMQ学习笔记(四)Work queues
- 官网英文版学习——RabbitMQ学习笔记(五)Publish/Subscribe
- 官网英文版学习——RabbitMQ学习笔记(六)Routing
- 官网英文版学习——RabbitMQ学习笔记(七)Topic
- 官网英文版学习——RabbitMQ学习笔记(八)Remote procedure call (RPC)
- 官网英文版学习——RabbitMQ学习笔记(九)总结
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群