鉴于目前中文的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. VUE.JS和小程序的共通之处

    我是先学习的小程序开发,之后才了解到vue.js.也是一直没有时间去看相关vue.js的知识和内容.现在回顾起来,小程序和vue.js都是前端的内容. 例如小程序中的目录结构物page+app.js+ ...

  2. 引用类型--Date类型

    要创建一个日期对象,使用new操作符和Date构造函数即可. var now = new Date() 在调用Date构造函数而不传递参数的情况下,新创建的对象自动获得当前日期和时间.如果想根据特定的 ...

  3. Pie Chart _Study

    1.Select a theme 2.Experiment with visual customization 3.Creat a script 4.Name should be as defined ...

  4. CentOS LVM 卷在线扩容

    场景: vmware 虚拟机,装了CentOS  ,更改了虚拟机磁盘的大小:从200G,扩展到320G,可以参考本文写了步骤. 1. 在线扫描虚拟机SCSI新增的容量 # for i in `find ...

  5. Ubuntu下安装 Mysql

    MYSQL在ubuntu16.04下的编译安装mysql-5.6.23.tar.gz 为减少安装过程中因权限带来个各种问题,建议全程用root用户编译安装,步骤如下: 1.安装依赖文件  apt-ge ...

  6. 08.swoole学习笔记--异步tcp客户端

    <?php //创建异步tcp客户端 $client=new swoole_client(SWOOLE_SOCK_TCP,SWOOLE_SOCK_ASYNC); //注册连接成功的回调函数 $c ...

  7. 011-PHP获取数组中的元素

    <?php $monthName = array( /*定义$monthName[1]到$monthName[12]*/ 1=>"January", "Feb ...

  8. 使用Hibarnate: 出现 java.sql.SQLException: ORA-00911: 无效字符, 解决思路

    1. 查看到: Hibernat自动生成的sql查询语句 Hibernate: select * from ( select module0_.MODULE_ID as MODULE_ID1_1_, ...

  9. DIV 透明度 设置

    filter:alpha(opacity=70); -moz-opacity:0.70;-khtml-opacity: 0.70;   opacity: 0.70;

  10. Acwing200 Hankson的趣味题

    原题面:https://www.acwing.com/problem/content/202/ 题目大意:gcd(x,a0)=a1,lcm(x,b0)=b1,问你有多少满足条件的正整数x. 输入描述: ...