消息中间价

消息中间价,也称消息队列,是分布式式系统中常用的中间价。
通过消息中间价传递消息,使得各个子系统解耦,异步通信。
目前业界有许多消息队列的实现,如RabbitMQ、Kafka、ActiveMQ、ZeroMQ和RocketMQ等。

AMQP

AMQP(Advanced Message Queuing Protocal)是应用层的一个通信协议,面向消息中间价设计,定义了消息客户端和消息中间价之间的一种通信标准。
AMQP是应用层协议,传输层使用TCP。

RabbitMQ是AMQP的实现,采用Erlang实现。除了实现AMQP,RabbitMQ支持其他协议,如STOMP、MQTT。

RabbitMQ整体架构

架构与角色

  • Publisher: 消息发送方
  • Consumer: 消息消费方
  • Message: 一条消息
  • Broker:消息中间价服务节点
  • Exchange: 交换器。交换器有多种类型
  • Queue: 队列
  • Binding: 交换器和队列绑定
  • BindingKey: 交换器和队列绑定是使用的key。BindingKey与Exchange的类型以及消息的RoutingKey一起决定了消息到达Exchange之后,转发到哪些队列
  • RoutingKey: 路由健。发送方发送消息时,给消息带上一个路由健

消息转发过程

发送方发布一条带有RoutingKey的消息到Exchange,Exchange根据消息的RoutingKey和Exchange的类型以及Exchange和Queue之间的BindingKey,将消息发送到与之绑定的若干个队列中,消费从订阅的队列中获取到消息进行消费。

Exchange,Queue,Binding

从上面的消息转发过程可以看出,Exchange,Queue和Binding在消息转发过程中扮演核心角色。当带有RoutingKey当消息被投递到一个Exchange后,后续会路由
到哪个队列将由Exchange到类型、Exchange绑定到Queue以及绑定时到BindingKey所决定。

Queue

Queue到概念很好理解,及消息独立。Queue时RabbitMQ内用于消息存储到对象。生产者发送到消息将最终到达Queue,等待消费者消费。

Exchange、Binding

Exchange时RabbitMQ中消息到入口,生产者将消息发送到Exchange,由Exchange将消息在发送到Queue。
Exchange和Queue之间到关联通过Binding实现,在将Queue和Exchange绑定时,需要指定一个BindingKey、该BindingKey后续将配合Exchange到类型和消息
的RoutingKey来共同决定这条消息可以由Exchange发送到哪些队列。
同一组Exchange和Queue可以通过不同到BindingKey多次绑定。

Exchange类型

消息不是由生产者直接发送到Queue,然后由消费者消费的。这样到模型过于简单,应用场景很受限,只能满足类似点对点通信到场景。
为了满足丰富到应用场景,消息将将首先发送到Exchange,在由Exchange发送到Queue。这里面实现灵活到通信模型的关键在于RabbitMQ实现了多种不同类型到Exchange。
不同类型到Exchange,对消息定义了不同到路由策略。下面依次说明各个类型到Exchange。

  • fanout类型
    fanout类型到Exchange对消息采用广播策略:对于发送到该Exchange到消息,将被路由到所有与该Exchange绑定到队列,而忽略消息到RoutingKey

    如图所示,无论消息的routingkey为何值,bindingkey1和bindingkey2为何值消息都将被同时路由到Queue1和Queue2。

  • direct类型
    direct类型到Exchange,将消息路由到那些BingKey与消息到RoutingKey完全相同到队列中。

    如图所示,如果消息的RoutingKey为red,消息将被路由到Queue1;如果消息的RoutingKey为yellow,消息将被路由到Queue2。其他发送到该Exchange的消息都被丢弃。

  • topic类型
    与direct类型到Exchange不同,topic类型到Exchange采取来更加灵活到路由策略:它将消息路由到BindingKey与消息到RoutingKey相匹配到队列中。其中灵活性
    体现在匹配规则上。
    RoutingKey和BindingKey被定义为"."分割到字符串,如 "red.cat.big","yellow.pig.small"。分割出到每一单位我们称作单词,如"cat","pig"等。
    BindingKey中可以使用两种特殊到单词用于模糊匹配,其中""匹配任意一个单词,"#"匹配零或多个任意单词。如"red..big"匹配任意以单词"red"开头,以"big"
    结尾的三个单词的key("red.pig.big","red.mouse.big"...);"yellow.#"匹配任意以单词"yellow"开头到key("yellow","yellow.tiger.small.ku")。
    这样,Exchange与Queue绑定时使用带有模糊匹配到BindingKey,即可对消息实现灵活的路由。

    如图所示,如果消息可RoutingKey为red.pig.big,red.mouse.big等,消息将被路由到Queue1;如果消息的RoutingKey为yellow,yellow.tiger.small.ku等,消息将被路由到Queue2。Exchange和Queue可以有多个绑定,如果消息的RoutingKey为all,它也会被路由到Queue2。

  • header类型
    header类型到Exchange路由规则比较特殊,它不依赖消息到RoutingKey来路由消息,而是根据消息内容中到header属性来路由。绑定Exchange和Queue时,指定
    一组header属性,发送消息时为消息设置一组header属性,当消息到达Exchange时,将被路由的header属性匹配到队列中。该类型到Exchange性能会比较差,实际
    应用中也很少见。

以上即是Exchange、Queue、Binding、BindingKey和RoutingKey直接到协作关系,也是RabbitMQ消息路由到核心原理。

RabbitMQ(1) 核心概念的更多相关文章

  1. RabbitMQ如何工作和RabbitMQ核心概念

    RabbitMQ是一个开源的消息代理软件.它接受来自生产者的消息并将其传递给消费者.它就像一个中间人,可以用来减少Web应用程序服务器的负载和交付时间. RabbitMQ如何工作 让我们简要介绍一下R ...

  2. RabbitMq核心概念和术语

    简介 越来越多的消息中间件很容易让人产生混淆,在学习一种消息中间件的时候,最好先了解他的几种抽象概念,方便你理解,明白了这些概念,你学习起来的时候也就得心应手,同时也是使用好RabbitMQ的基础. ...

  3. 消息中间件——RabbitMQ(三)理解RabbitMQ核心概念和AMQP协议!

    前言 本章学习,我们可以了解到以下知识点: 互联网大厂为什么选择RabbitMQ? RabbiMQ的高性能之道是如何做到的? 什么是AMQP高级协议? AMQP核心概念是什么? RabbitMQ整体架 ...

  4. 消息中间件——RabbitMQ(六)理解Exchange交换机核心概念!

    前言 来了解RabbitMQ一个重要的概念:Exchange交换机 1. Exchange概念 Exchange:接收消息,并根据路由键转发消息所绑定的队列. 蓝色框:客户端发送消息至交换机,通过路由 ...

  5. RabbitMQ核心概念和AMQP协议(二)

    RabbitMQ是什么? RabbitMQ是一个开源的消息代理和队列服务器,用来通过普通协议,在完全不同的应用之间共享数据,RabbirMQ是使用Erlang语言来编写的,并且RabbitMQ是基于A ...

  6. Spring Cloud Stream 核心概念

    Spring Cloud Stream简介 Spring cloud stream是一个构建与Spring Boot和Spring Integration之上的框架,方便开发人员快速构建基于Messa ...

  7. RabbitMQ(1)---基本概念

    一.安装RabbitMQ 安装直接用docker安装,如果手动安装的话比较繁琐,还要安装erlang语言的环境.在安装有docker机器上执行官网提供的指令(https://www.rabbitmq. ...

  8. 领域驱动设计(DDD)部分核心概念的个人理解

    领域驱动设计(DDD)是一种基于模型驱动的软件设计方式.它以领域为核心,分析领域中的问题,通过建立一个领域模型来有效的解决领域中的核心的复杂问题.Eric Ivans为领域驱动设计提出了大量的最佳实践 ...

  9. Javascript本质第一篇:核心概念

    很多人在使用Javascript之前都至少使用过C++.C#或Java,面向对象的编程思想已经根深蒂固,恰好Javascript在语法上借鉴了Java,虽然方便了Javascript的入门,但要深入理 ...

随机推荐

  1. Hive的metastore

    hive --service metastore 默认端口是9083 <property> <name>hive.metastore.uris</name> < ...

  2. java并发内存模型

    java中线程之间的共享变量存储在主内存(java堆)中,每个线程都有一个私有的本地内存,本地内存存储了该线程以读.写共享变量的副本.本地内存是一个抽象概念,并不真实存储.它涵盖了cache,寄存器记 ...

  3. javaee加密部署,tomcat使用自己的classloader解密

    http://www.2cto.com/kf/201312/264455.html [起因] 公司需要对一个web项目进行加密之后出售, 大家都知道的,class很好反编译, 所以需要对class文件 ...

  4. saltstack之keepalived的安装配置

    使用saltstack编译安装keepalived: 创建相应的目录,并在目录下创建相应的sls配置文件 [root@node1 ~]# mkdir /srv/salt/prod/keepalived ...

  5. 在vim中的复制,剪切,粘贴

    1. 剪切和粘贴 定位鼠标到剪切的开始位置 输入v键开始选择剪切的字符,或者V键是为了选择 整行 移动方向键到结束的地方 d键是剪切,y键是复制 移动鼠标到粘贴的位置 输入P是在鼠标位置前粘贴,输入p ...

  6. 百度开源分布式id生成器uid-generator源码剖析

    百度uid-generator源码 https://github.com/baidu/uid-generator snowflake算法 uid-generator是基于Twitter开源的snowf ...

  7. 4.9版本linux内核的ina220电流检测芯片源码在哪里

    答:在drivers/hwmon/ina2xx.c中,内核配置项为CONFIG_SENSORS_INA2XX Location: -> Device Drivers -> Hardware ...

  8. [BZOJ1131]Sta

    Description 给出一个N个点的树,找出一个点来,以这个点为根的树时,所有点的深度之和最大 Input 给出一个数字N,代表有N个点.N<=1000000 下面N-1条边. Output ...

  9. linux网络连接的查看和端口的监听

    网络软件都是由客户端和服务端组成,由服务端在服务器上监听指定的端口处理接收到的数据,而客户端是向服务器端监听的端口发送数据,并由服务器端对该数据进行处理,然后将处理结果返回给客户端. 那么我们在lin ...

  10. hbase(二)hfile结构

    HFile结构 截止hbase 1.0.2版本,hfile已经有3个版本,要深入了解hfile的话,还是要从第一个版本开始看起. hfile v1 Data Block:保存表中的数据,这部分可以被压 ...