官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ
鉴于目前中文的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集群
官网英文版学习——RabbitMQ学习笔记(一)认识RabbitMQ的更多相关文章
- 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群
在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...
- 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)
利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录) 作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...
- Unity shader 官网文档全方位学习(一)
转载:https://my.oschina.net/u/138823/blog/181131 摘要: 这篇文章主要介绍Surface Shaders基础及Examples详尽解析 What?? Sha ...
- 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装
一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...
- 官网英文版学习——RabbitMQ学习笔记(八)Remote procedure call (RPC)
在第四篇学习笔记中,我们学习了如何使用工作队列在多个工作者之间分配耗时的任务. 但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?这是另一回事.这种模式通常称为远程过程调用或RPC. ...
- 官网英文版学习——RabbitMQ学习笔记(七)Topic
在上一篇中使用直接交换器改进了我们的系统,使得它能够有选择的进行接收消息,但它仍然有局限性——它不能基于多个条件进行路由.本节我们就进行能够基于多个条件进行路由的topics exchange学习. ...
- 官网英文版学习——RabbitMQ学习笔记(五)Publish/Subscribe
发布/订阅模式:把一个消息发送给多个消费者. 前几篇文章的思想是,我们好像看到了生产者将消息直接发送给queue,然后消费者也从queue中进行消费.其实并非如此,RabbitMQ中的消息传递模型的核 ...
- 官网英文版学习——RabbitMQ学习笔记(四)Work queues
工作队列:把每个任务只发送给一个工作者. 上一篇我们是从一个指定的队列发送接收消息,在本文中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务. 工作队列(即任务队列)背后的主要思想是避免立 ...
- 官网英文版学习——RabbitMQ学习笔记(三)Hello World!
参考http://www.rabbitmq.com/tutorials/tutorial-one-java.html,我们直接上代码,由于我们的RabbitMQ服务是安装在虚拟机上的,具体参考上一节. ...
随机推荐
- Day4 - C - 六度分离 HDU - 1869
1967年,美国著名的社会学家斯坦利·米尔格兰姆提出了一个名为“小世界现象(small world phenomenon)”的著名假说,大意是说,任何2个素不相识的人中间最多只隔着6个人,即只用6个人 ...
- c++中比较好用的“黑科技”
切入正题,上黑科技 一.黑科技函数(常用的我就不写了,例如sort函数) 1.next_permutation(a+1,a+1+n) a[1-n]全排列 2.reverse(a+1,a+1+n) 将a ...
- 渗透测试神器Burp Suite v1.7.11发布(含下载)
BurpSuite是一款信息安全从业人员必备的集成型的渗透测试工具,它采用自动测试和半自动测试的方式,包含了Proxy,Spider,Scanner,Intruder,Repeater,Sequenc ...
- NSQ学习记录
一.简介 NSQ是一个基于Go语言的开源的分布式实时消息平台,他的代码托管在GitHub上. NSQ可用于大规模系统的实时消息服务,它的设计目标是为在分布式环境下提供一个强大的去除中心化的分布式服务架 ...
- MQTT 协议学习: QoS等级 与 会话
背景 QoS 等级 与 通信的流程有关,直接影响了整个通信.而且篇幅比较长,所以我觉得应该单独拎出来讲一下. 概念 QoS 代表了 服务质量等级. 设置上,由2 位 的二进制控制,且值不允许为 3(0 ...
- arm linux 移植 MQTT (paho、mosquitto)
前言 我们在这里做2件事情: 1)编译 paho.mqtt.mosquitto 2个开源项目的c版本库(mosquitto库没有用上) 2)编译好 依赖 paho.mqtt的库编写例程 + mosqu ...
- 蓝桥杯 2n皇后问题
题意: 问题描述 给定一个n*n的棋盘,棋盘中有一些位置不能放皇后.现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行.同一列或同一条对角线上,任意的两个白皇后都不在同一行.同一 ...
- MyBatis源码部分简单地解析
. 一.解析xml: > org.apache.ibatis.session.SqlSessionFactoryBuilder.build(java.io.InputStream, java.l ...
- 【LeetCode】找出所有数组中消失的数字
[问题] 给定一个范围在 1 ≤ a[i] ≤ n ( n = 数组大小 ) 的 整型数组,数组中的元素一些出现了两次,另一些只出现一次.找到所有在 [1, n] 范围之间没有出现在数组中的数字. ...
- 解题报告:luogu P2299
题目链接:P2299 Mzc和体委的争夺战 单源最短路板子题吗,体面晦涩难懂(语文不好),以为是有向图,只有\(30pts\),其实是无向的,我使用了刚学来的\(SPFA\),通过了此题: \(Cod ...