鉴于目前中文的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的更多相关文章

  1. 官网英文版学习——RabbitMQ学习笔记(十)RabbitMQ集群

    在第二节我们进行了RabbitMQ的安装,现在我们就RabbitMQ进行集群的搭建进行学习,参考官网地址是:http://www.rabbitmq.com/clustering.html 首先我们来看 ...

  2. 利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)

    利用JQ实现的,高仿 彩虹岛官网导航栏(学习HTML过程中的小记录)   作者:王可利(Star·星星) 总结: 今天学习的jQ类库的使用,代码重复的比较多需要完善.严格区分大小写,在 $(" ...

  3. Unity shader 官网文档全方位学习(一)

    转载:https://my.oschina.net/u/138823/blog/181131 摘要: 这篇文章主要介绍Surface Shaders基础及Examples详尽解析 What?? Sha ...

  4. 官网英文版学习——RabbitMQ学习笔记(二)RabbitMQ安装

    一.安装RabbitMQ的依赖Erlang 要进行RabbitMQ学习,首先需要进行RabbitMQ服务的安装,安装我们可以根据官网指导进行http://www.rabbitmq.com/downlo ...

  5. 官网英文版学习——RabbitMQ学习笔记(八)Remote procedure call (RPC)

    在第四篇学习笔记中,我们学习了如何使用工作队列在多个工作者之间分配耗时的任务.   但是,如果我们需要在远程计算机上运行一个函数并等待结果呢?这是另一回事.这种模式通常称为远程过程调用或RPC.   ...

  6. 官网英文版学习——RabbitMQ学习笔记(七)Topic

    在上一篇中使用直接交换器改进了我们的系统,使得它能够有选择的进行接收消息,但它仍然有局限性——它不能基于多个条件进行路由.本节我们就进行能够基于多个条件进行路由的topics exchange学习. ...

  7. 官网英文版学习——RabbitMQ学习笔记(五)Publish/Subscribe

    发布/订阅模式:把一个消息发送给多个消费者. 前几篇文章的思想是,我们好像看到了生产者将消息直接发送给queue,然后消费者也从queue中进行消费.其实并非如此,RabbitMQ中的消息传递模型的核 ...

  8. 官网英文版学习——RabbitMQ学习笔记(四)Work queues

    工作队列:把每个任务只发送给一个工作者. 上一篇我们是从一个指定的队列发送接收消息,在本文中,我们将创建一个工作队列,用于在多个工作者之间分配耗时的任务. 工作队列(即任务队列)背后的主要思想是避免立 ...

  9. 官网英文版学习——RabbitMQ学习笔记(三)Hello World!

    参考http://www.rabbitmq.com/tutorials/tutorial-one-java.html,我们直接上代码,由于我们的RabbitMQ服务是安装在虚拟机上的,具体参考上一节. ...

随机推荐

  1. jquery 操作单选框,复选框,下拉列表实现代码

    1.复选框全选操作:其实说到底就是对Jquery 选择器的运用,点我查看Jquery选择器 html代码: 复制代码代码如下: <form> 您爱好的运动是: <input type ...

  2. IPython 自动重载魔术

    在开启IPython 后输入下列命令就可以开启Ipython 的自动重载 %load_ext autoreload %autoreload 2 当你在IPython中导入的函数或类发生修改时,IPyt ...

  3. 范数(norm)

    [范数定义] 非负实值函数(非线性) 1)非负性: || a || >= 0 2)齐次性: || ka || = |k| ||a|| 3)三角不等式: || a + b || <= || ...

  4. 预备JS执行环境,预执行脚本

    page.evaluateOnNewDocument(pageFunction, ...args) pageFunction <function|string> Function to b ...

  5. GNS3 ProxyArp(查看路由器是否具有转发功能)

    R2是否可以把R1的数据转发出去,参看http://www.cnblogs.com/qq76211822/p/5129134.html 命令:show ip interface f0/0

  6. 编程题目:输入一个链表,输出该链表中倒数第k个节点

    两种方法 1.在链表的初始化数据中加入 num 数据, 每添加一个节点,num加1,每删除一个节点,num减1 查找倒数第k个元素,即 指向第一个节点的指针向后移动 num - k 步. 2.使用两个 ...

  7. tp5日志分表

    /** * 记录网站日志 * * @return bool */ public function record() { // 组装数据 $log = self::$param; $log[self:: ...

  8. git下载安装、配置及idea初始化

    安装 wget https://mirrors.edge.kernel.org/pub/software/scm/git/git-2.19.0.tar.gz git 安装依赖 yum -y insta ...

  9. 《新标准C++程序设计》4.6(C++学习笔记16)

    重载流插入运算符和流提取运算符 流插入运算符:“<<” 流提取运算符:“>>” cout 是在 iostream 中定义的,ostream 类的对象. “<<” 能 ...

  10. mysql 索引入门

    创建索引的语法结构: