消息中间价

消息中间价,也称消息队列,是分布式式系统中常用的中间价。
通过消息中间价传递消息,使得各个子系统解耦,异步通信。
目前业界有许多消息队列的实现,如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. DataTables VS EasyUI DataGrid 基础应用 转

    DataTables中文网推出了 第一篇 关于DataTables和其他表格插件比较后,为了把让这个比较更有意义,更能帮助到大家,DataTables中文网 做了问卷调查,根据小伙伴们的填写我归纳了一 ...

  2. Django学习笔记之利用Form和Ajax实现注册功能

    一.注册相关的知识点 1.Form组件 我们一般写Form的时候都是把它写在views视图里面,那么他和我们的视图函数也不影响,我们可以吧它单另拿出来,在应用下面建一个forms.py的文件来存放 2 ...

  3. CF1155D Beautiful Array(动态规划)

    做法 \(f_{i,0}\)表示以\(i\)结尾未操作时的最大值 \(f_{i,1}\)表示以\(i\)结尾正在操作时的最大值 \(f_{i,2}\)表示以\(i\)结尾已结束操作时的最大值 Code ...

  4. [pixhawk笔记]6-uORB流程及关键函数解析

    本文中将结合代码.文档及注释,给出uORB执行流程及关键函数的解析,由于uORB的机制实现较为复杂,所以本文主要学习如何使用uORB的接口来实现通信.回到上一篇笔记中的代码: #include < ...

  5. 手动加载B120i/B320i阵列卡驱动安装RHEL7.0

    实验设备: Micro server Gen8(B120i) DL360e Gen8(B320i) 目录 一.前期准备... 1 二.加载阵列卡驱动... 11 三.手动分区... 21 四.安装设置 ...

  6. 20145216 史婧瑶《Java程序设计》第6周学习总结

    20145216 <Java程序设计>第6周学习总结 教材学习内容总结 第十章 输入/输出 10.1 InputStream与OutputStream 如果要将数据从来源中取出,可以使用输 ...

  7. Azure Active Directory配置java应用的单点登录

    下载应用:https://github.com/Azure-Samples/active-directory-java-webapp-openidconnect(普通项目,集成了特殊配置接入微软的注册 ...

  8. Sublime Text指南

    转自: http://lucida.me/blog/sublime-text-complete-guide/  摘要(Abstract) 本文系统全面的介绍了Sublime Text,旨在成为最优秀的 ...

  9. Python 实现C语言 while(scanf("%d%d", &a, &b) != EOF) 语句功能

    reference:Python 实现C语言 while(scanf("%d%d", &a, &b) != EOF) 语句功能 在python中,无法通过input ...

  10. Spring Boot的自动配置的原理

    Spring Boot在进行SpringApplication对象实例化时会加载META-INF/spring.factories文件,将该配置文件中的配置载入到Spring容器. 1.1.1.   ...