概述

之前已经对rabbitMQ的一些基本概念做了介绍和不同MQ之间的比较,今天主要对rabbitMQ的一些方面做扩展。


01

消息队列

Broker:简单来说就是消息队列服务器实体。

Exchange:消息交换机,它指定消息按什么规则,路由到哪个队列。

Queue:消息队列载体,每个消息都会被投入到一个或多个队列。

Binding:绑定,它的作用就是把exchange和queue按照路由规则绑定起来。

Routing Key:路由关键字,exchange根据这个关键字进行消息投递。

vhost:虚拟主机,一个broker里可以开设多个vhost,用作不同用户的权限分离。每个虚拟主机是隔离的,互不影响.

producer:消息生产者,就是投递消息的程序。

consumer:消息消费者,就是接受消息的程序。

channel:消息通道,在客户端的每个连接里,可建立多个channel,每个channel代表一个会话任务。


02

消息队列的工作过程

(1)客户端连接到消息队列服务器,打开一个channel。

(2)客户端声明一个exchange,并设置相关属性。

(3)客户端声明一个queue,并设置相关属性。

(4)客户端使用routing key,在exchange和queue之间建立好绑定关系。

(5)客户端投递消息到exchange。


03

消费模式 :推(push)模式和拉(pull)模式。

Pull(推模式)是指由Broker(中介,这里是队列),主动推送消息至消费端,实时性较好,不过需要一定的流制机制来确保服务端推送过来的消息不会压垮消费端。

而拉模式是指消费端主动向Broker端请求拉取(一般是定时或者定量)消息,实时性较推模式差,但是可以根据自身的处理能力而控制拉取的消息量。


04

消息持久化

rabbit如何进行消息持久化操作呢?exchange是实现发布订阅的基础,其类型包含fanout、headers、direct、、topic。我们本次仅讨论类型为topic。

发布订阅模式执行消息发送的流程:

RabbitMQ要实现发布订阅持久化,按照消息的传输流程,可以分成三类:

Exchange 持久化:如果不设定Exchange持久化,那么在RabbitMQ由于某些异常等原因重启之后,Exchange会丢失。Exchange丢失, 会影响发送端发送消息到RabbitMQ。

Queue持久化:发送端将消息发送至Exchange,Exchange将消息转发至关联的Queue。如果Queue不设置持久化,那么在RabbitMQ重启之后,Queue信息会丢失。导致消息发送至Exchange,但Exchange不知道需要将该消息发送至哪些具体的队列。

Message持久化:发送端将消息发送至Exchange,Exchange将消息转发至关联的Queue,消息存储于具体的Queue中。如果RabbitMQ重启之后,由于Message未设置持久化,那么消息会在重启之后丢失。

为了保证发布订阅的持久化,必须设置Exchange、Queue、Message的持久化,才可以保证消息最终不会丢失。虽然持久化会造成性能损耗,但为了生产环境的数据一致性,这是我们必须做出的选择。但我们可以通过设置消息过期时间、降低发送消息大小等其他方式来尽可能的降低MQ性能的降低。

消息队列持久化包括3个部分:

(1)exchange持久化,在声明时指定durable => 1

(2)queue持久化,在声明时指定durable => 1

(3)消息持久化,在投递时指定delivery_mode => 2(1是非持久化)

如果exchange和queue都是持久化的,那么它们之间的binding也是持久化的。如果exchange和queue两者之间有一个持久化,一个非持久化,就不允许建立绑定。


05

消息发送步骤

exchange接收到消息后,就根据消息的key和已经设置的binding,进行消息路由,将消息投递到一个或多个队列里。

exchange也有几个类型,完全根据key进行投递的叫做Direct交换机,例如,绑定时设置了routing key为”abc”,那么客户端提交的消息,只有设置了key为”abc”的才会投递到队列。对key进行模式匹配后进行投递的叫做Topic交换 机,符号”#”匹配一个或多个词,符号”*”匹配正好一个词。

例如”abc.#”匹配”abc.def.ghi”,”abc.*”只匹配”abc.def”。还有一种不需要key的,叫做Fanout交换机,它采取广播模式,一个消息进来时,投递到与该交换机绑定的所有队列。


RabbitMQ的Connection是昂贵的,但Channel是廉价的,在多线程环境下,尽量创建少数Connection,然后在每个Connection中创建多个Channel,利用Channel实现Connection复用,从而提高系统性能。很像Java NIO里的Selector到Channel的多路复用。

生产端发送消息时,同一个Channel的basicPublish方法并不是线程安全的,因此更加体现出多Channel的重要性。如果生产端需要使用多线程发送消息,那么必须创建多个Channel,每一个线程单独使用一个Channel,但是这些Channel可以来自同一个Connection。假如线程数量过多,那么也不可以无限制的创建Channel,需要使用Channel Pool(连接池)的思路去控制并发。

后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

rabbitmq 不同的消费者消费同一个队列_消息队列王者--rabbitMQ深入理解--工作过程、消费模式、持久化等...相关推荐

  1. rabbitmq导出队列_消息队列BCMQ在大云运维管理平台BCDeepWatch中的应用

    友情提示:全文约2600字,预计阅读时间12分钟 摘要 消息队列作为重要的中间件,广泛用于分布式系统中各子系统间的异步解耦:本文主要介绍了大云消息队列中间件BC-MQ在BC-DeepWatch中的应用 ...

  2. php 消息队列_消息队列篇——windows本地搭建RabbitMQ Server

    前言: 最近的PHP项目中有使用AMQP,解耦一些业务性的功能模块.因为工作使用的是线上Linux搭建,为了方便测试所以我决定本地搭建一个MQ服务. RabbitMQ简介: MQ全称为Message ...

  3. 队列和消息队列_消息队列概述[幻灯片]

    队列和消息队列 昨天,我进行了一次演讲,探讨了使用消息队列的所有方面. 我以前曾写过"您可能不需要消息队列" –现在的结论有些细微差别,但我仍然坚持简单性的观点. 演讲探讨了使用消 ...

  4. rabbitmq多个消费者消费同一个队列中的同一条消息。

    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.rabbitmq是什么? 二.使用步骤 1.引入库 2.rabbitmq相关配置 3.生产者代码 4.多个消费者, ...

  5. ibm mq并发访问队列_消息队列之九问九答

    问题1 为什么要用消息队列呀? 答:如下图所示,外呼系统需要将外呼结果发送给业务系统,如果采用rpc的调用方式:则带来的后果, 首先,1.外呼系统与业务系统严重耦合,多个业务系统需要外呼系统传输数据, ...

  6. 消息队列_消息队列:kafka

    概念 kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域. 要理解kafka首先要有分布式的概念,要有消息队列的概念.分布式系统最大的优势就是解耦和削峰,这种情况下,A系 ...

  7. posix自定义消息队列_消息队列开源框架,基于Io,节约服务器资源

    dophon框架中的消息队列模块,包括本地消息中心,远程消息中心,以及生产消费相关装饰器以及内部操作模块等 dophon-mq 项目介绍 dophon框架中的消息队列模块,包括本地消息中心,远程消息中 ...

  8. java onmessage监听消息队列_消息队列(MQ)功能场景

    来自公众号:京东技术 消息队列(MQ)是一种不同应用程序之间(跨进程)的通信方法.应用程序通过写入和检索出入列队的数据(消息)来通信,而无需通过专用链接来连接它们.消息传递指的是程序之间通过在消息中发 ...

  9. rabbitmq 不同的消费者消费同一个队列_RabbitMQ 消费端限流、TTL、死信队列

    消费端限流 1. 为什么要对消费端限流 假设一个场景,首先,我们 Rabbitmq 服务器积压了有上万条未处理的消息,我们随便打开一个消费者客户端,会出现这样情况: 巨量的消息瞬间全部推送过来,但是我 ...

最新文章

  1. java I/O之装饰者模式
  2. 模型(Model)– ASP.NET MVC 4 系列
  3. Java JDBC
  4. 使用podspec创建iOS插件
  5. 是否是一个新的机会?
  6. java 控制台五子棋_java控制台五子棋
  7. Ansible and FileBeta
  8. round()和trunc()函数的应用
  9. 深入理解java虚拟机读书笔记(三)
  10. 网页表白代码烟花特效
  11. 椭圆曲线数字签名算法
  12. 【Error】pwntools 解决安装terminator后 unable to find a shell
  13. jQuery 瀑布流插件
  14. 同济大学计算机系拿奖学分绩点,同济大学绩点换算(同济大学绩点多少算高)
  15. SSL协议和SET协议
  16. 一种非Timeline的feeds流架构
  17. 联咏NT98323SDK编译
  18. Mac下的破解软件真的安全吗?
  19. Web组态——新一代全流程低代码物联网平台
  20. 人工智能会取代人类,会毁灭人类吗?

热门文章

  1. html多个单元格合并单元格内容,excel怎样快速把多个单元格内容合并 合并多个单元格内容的设置方法...
  2. Java File类详解
  3. IDEA里的web.xml页面的Servlet名称报错下方出现红色下划线
  4. 2048java课程设计报告_2048小游戏-Java-课程设计报告书
  5. 两台服务器安装redis集群_redis 集群搭建,小白也能搭三主三从的集群环境
  6. 我的Go+语言初体验——(2)IDE 详细安装教程
  7. TensorFlow3-会话
  8. linux如何安装python环境变量中,Windows和linux环境下python安装及环境变量的配置
  9. php 前往页面,PHP实现网页截图?
  10. jmeter五种参数化方式之CSV Data Set Config参数化