概述

  RabbitMQ(MQ 为 MessageQueue) 是一个消息队列,主要是用来实现应用程序的异步和解耦,同时起到消息缓冲、消息分发作用

  消息队列

  消息(Message)是指应用间传送的数据,可以为字符文本、潜入对象

  消息队列(Message Queue)是一种应用的通信方式,消息发送后可立即返回,由消息系统来确保可靠的传递,消息发布者只管消息发布到 MQ 中而不用管谁来取,消息消费者只管从 MQ 中取消息而不管是谁发布,这样发布者和消费者都不用知道对方的存在

  为何用消息队列

  消息队列是一种应用程序异步协作机制

  以订单系统为例:用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成相应数据、发送短信通知

  在业务初期这些逻辑可能放在一起同步执行,随着业务发展订单量增大,需要提升系统服务的性能,这时可以将一些不需立即生效的操作拆分出来异步执行,如发送短信通知,这种场景下就可以使用 MQ

  在下单的主流程(扣减库存、生成相应单据)完成之后发送一条消息到 MQ 让主流程快速完结,而由另外的单独线程拉取 MQ 的消息(或由 MQ 推送消息),当发现 MQ 中有发红包或发短信之类的消息时,执行相应的业务逻辑

  RabbitMQ 特点

  RabbitMQ 最初起源于金融系统,用于在分布式系统中存储转发消息,它是 AMQP 协议的开源实现

  AMQP:Advanced Message Queue(高级消息队列)它是应用层协议的一个开放标准,为面向消息得中间件设计,基于此协议的客户端与消息中间件可传递消息,并且不受产品、开发语言等条件限制

  可靠性:RabbitMQ 通过一些机制来保证可靠性,如持久化、传输确认、发布确认

  灵活的路由:在消息进入队列之前,通过 Exchange 来路由消息,RabbitMQ 提供了一些内置得 Exchange 实现,也可以自定义

  消息集群:多个 RabbitMQ 可以组成一个集群

  高可用:队列可以在集群中的机器上进行镜像,某些节点出现问题的情况下仍然可用

  多种协议:RabbitMQ 支持多种消息队列协议,如 STOMP、MQTT

  管理界面:RabbitMQ 提供了一个易用的用户界面

  跟踪机制:RabbitMQ 提供了消息跟踪机制可以跟踪消息异常

  插件机制:RabbitMQ 提供了许多插件可以进行扩展

  RabbitMQ 模型概念

  消息模型

  消费者(consumer)订阅某个队列,生产者(producer)创建消息,然后发布到队列(queue)中,最后消息发送到监听的消费者

  

  RabbitMQ 基本概念

  

  Message:消息由消息头和消息体组成,消息体是不透明的,而消息头由一系列可选属性组成,包括 routing-key(路由键)、priority(相对其它消息的优先权)

  持久化:消息在 RabbitMQ 重启后仍然存在

  Publisher:消息的生产者,也是一个向交换器发布消息的客户端应用程序

  Exchange:交换器,用来接收生产者发送的消息并将消息路由给服务器中的队列

  持久化:交换器在 RabbitMQ 重启后仍然存在

  自动删除:没有任何队列绑定交换机时,交换机会自动删除

  Binding:绑定,用于将消息队列和交换器关联,例如基于路由键将交换器和消息队列连接起来的路由规则

  Queue:消息队列,用来保存消息直到发送给消费者,是消息得容器,也是消息得终点,一个消息可以投入一个或多个队列,消息一直在队列里面,等待消费者将其取走

  持久化:队列在 RabbitMQ 重启后仍然存在,但是队列里面的消息是否保存,还是要看消息是否设置为持久化

  Connection:网络连接,比如一个 TCP 连接

  Channel:信道,双向数据流通道,AMQP 命令都是通过信道发送出去的,不管是发布消息、订阅消息、还是接收消息都是通过信道完成

  Consumer:消息的消费者,表示一个从消息队列中取得消息得客户端应用程序

  Virtual Host:虚拟主机,表示一批交换器、消息队列和相关对象,虚拟主机是共享相同得身份认证和加密环境的独立服务器域,每个 vhost 本质是就是一个 mini 版得 RabbitMQ 服务器,拥有自己的队列、交换器、绑定和权限机制

  Broker:表示消息队列服务器的实体

  AMQP 中的消息路由

  AMQP 中消息的路由过程和 Java 开发者熟悉的 JMS 存在一些差别,AMQP 中增加了 Exchange 和 Binding 的角色。生产者把消息发布到 Exchange 上,消息最终到达队列并被消费者接收,而 Binding 决定交换器的消息应该发送到那个队列

  

  Exchange 类型

  Exchange 分发消息时根据类型不同分发策略也有区别,共四种类型:direct、fanout、topic、headers

  headers 匹配 AMQP 消息的 header 而不是路由键,此外 headers 交换器和 direct 交换器完全一致,但性能差很多,目前几乎用不到了

  direct

  

https://upload-images.jianshu.io/upload_images/5015984-13db639d2c22f2aa.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/385/format/webp

  消息中的路由键如果和 Binding 中的 binding key 一致,交换器就将消息发送到对应队列中

  它是完全匹配、单播模式,如某路由键为 dog 则它只转发 routing key 标记为 dog 的消息,不会转发 dog.puppy、dog.guard 等等

  fanout

  

  每个发到 fanout 类型的交换器消息都会分到所有绑定的队列上,fanout 交换器不处理路由键,只是简单的将队列绑定到交换器上,每个发送到交换器的消息都会被转发到与该交换器绑定得所有队列上

  像子网广播,每台子网内得主机都获得了一份复制的消息,fanout 类型转发消息是最快的

  topic

  

  topic 交换器通过模式匹配分配消息得路由键属性,将路由键和某个模式进行匹配,此时队列需要绑定到一个模式上

  它将路由键和绑定键得字符串切分成单词,这些单词之间用点隔开,可用两个通配符:符号 #(匹配0个或多个单词) 和符号 (匹配一个单词)

RabbitMQ 与 AMQP路由的更多相关文章

  1. RabbitMQ入门:路由(Routing)

    在上一篇博客<RabbitMQ入门:发布/订阅(Publish/Subscribe)>中,我们认识了fanout类型的exchange,它是一种通过广播方式发送消息的路由器,所有和exch ...

  2. php 的rabbitmq 扩展模块amqp安装

    php 的rabbitmq 扩展模块amqp安装 2017年10月08日 10:34:22 阅读数:240 使用PHP开发,要使用中间队列rabbitmq, 必须要安装PHP的扩展模块amqp, 服务 ...

  3. (转)RabbitMQ学习之路由(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40887755 参考:http://blog.csdn.NET/lmj623565791/artic ...

  4. 译: 4. RabbitMQ Spring AMQP 之 Routing 路由

    在上一个教程中,我们构建了一个简单的fanout(扇出)交换.我们能够向许多接收者广播消息. 在本教程中,我们将为其添加一个功能 - 我们将只能订阅一部分消息.例如,我们将只能将消息指向感兴趣的特定颜 ...

  5. rabbitmq消息队列——"路由"

    在之前的教程中,我们创建了一个简单的日志系统.我们能够向许多交换器转发日志消息. 在本教程中,我们将添加一个功能--我们让它仅仅接收我们感兴趣的日志类别.举例:我们 实现仅将严重级别的错误日志写入磁盘 ...

  6. 用PHP尝试RabbitMQ(amqp扩展)实现消息的发送和接收

    消费者:接收消息 逻辑:创建连接-->创建channel-->创建交换机-->创建队列-->绑定交换机/队列/路由键-->接收消息 <?php /********* ...

  7. RabbitMQ与AMQP协议

    AMQP(Advanced Message Queuing Protocol, 高级消息队列协议)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计 ...

  8. 译: 2. RabbitMQ Spring AMQP 之 Work Queues

    在上一篇博文中,我们写了程序来发送和接受消息从一个队列中. 在这篇博文中我们将创建一个工作队列,用于在多个工作人员之间分配耗时的任务. Work Queues 工作队列(又称:任务队列)背后的主要思想 ...

  9. 译: 3. RabbitMQ Spring AMQP 之 Publish/Subscribe 发布和订阅

    在第一篇教程中,我们展示了如何使用start.spring.io来利用Spring Initializr创建一个具有RabbitMQ starter dependency的项目来创建spring-am ...

随机推荐

  1. 汇编文件后缀.s与.S

    转载:http://www.cnblogs.com/IamEasy_Man/archive/2011/08/10/2134212.html 一.大小写后缀的区别: .s:  汇编语言源程序;汇编 .S ...

  2. Mac Angular打包报错xcode-select: error: tool 'xcodebuild' requires Xcode

    Mac Angular打包报错: Error: xcode-select: error: tool 'xcodebuild' requires Xcode, but active developer ...

  3. 如何修改opencart的模版适合为mycncart系统使用

    如何修改opencart的模版适合为mycncart系统使用 mycncart跟随opencart的最新代码不断进行升级,并改造和不断加入中国特色的功能,因此opencart的模版均不能够拿来直接套用 ...

  4. ViewFlipper

    main.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xml ...

  5. Extjs3.4 grid中添加一列复选框

    var sm = new Ext.grid.CheckboxSelectionModel(); var cm = new Ext.grid.ColumnModel( [ sm, new Ext.gri ...

  6. inline-block布局错位问题

    如图, 两个display为 inline-block的元素,会出现情况 针对第三种情况: 需要添加 vertical-align: top; 参考代码 <!DOCTYPE html> & ...

  7. Django REST Framework 学习笔记

    前言: 基于一些不错的RESTful开发组件,可以快速的开发出不错的RESTful API,但如果不了解开发规范的.健壮的RESTful API的基本面,即便优秀的RESTful开发组件摆在面前,也无 ...

  8. 受限的用户shell环境

    有些特殊情况下需要实现将系统内普通用户限定在指定目录下,并且只能使用系统管理员设定的命令.lshell就是实现这样功能的一个神器. lshell提供了一个针对每个用户可配置的限制性shell,lshe ...

  9. CodeForces - 343C Read Time (二分+贪心)

    题意:有N个指针头,M个标记,用这N个针头扫描所有的标记,针头之间互不影响,求扫描完M个标记的最短时间 分析:二分搜答案,mid为时间限制,则只要所有的点在mid秒内被扫描到即可. 对于每个指针,若其 ...

  10. ACM-ICPC 2018 南京赛区网络预赛 - L Magical Girl Haze (分层迪杰斯特拉)

    题意:N个点,M条带权有向边,求可以免费K条边权值的情况下,从点1到点N的最短路. 分析:K<=10,用dist[i][j]表示从源点出发到点i,免费j条边的最小花费.在迪杰斯特拉的dfs过程中 ...