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

概述

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

5d64ce9c54fd6c3d08525e0d6cbee61a.png

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。

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

450311220f41bc0042786533fd0518c8.png

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

消息发送步骤

f463bf62e6a6cfe494a79e5a60bb7c75.png

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方面的内容,感兴趣的朋友可以关注一下~

c37fec0084b0225a4d617d01416914a6.gif

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/573408.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql所有版本介绍_mysql各个版本介绍

一、版本说明:MYSQL自从被ORCLE收购后,软件的版本也ORACLE化,整体的感觉就是服务的费用提高了很多,整体的软件的Supports也有相应的提高;MYSQL根据软件的功能可以分成三个版本:社区版、企业版、集群版。社区…

d3js mysql_D3js技术文档 可视化展现

转载请注明http://www.cnblogs.com/juandx/articles/3885220.htmlD3js技术文档概述D3 allows you to bind arbitrary data to a Document Object Model (DOM), and then apply data-driven transformations to the document. For example, you can use D3 to generate an HTML …

text-indent的用法

一、text-indent应用于块级元素 <style type"text/css">*{margin:0;padding:0;}body{font-size:12px;color:#333;}p{text-indent:2em;background-color:#f00;color:#fff;}</style> </head> <body><p>携程旅行网携程旅行网携程旅行网携…

kettle连接mysql教程_kettle 连接 mysql8

kettle默认使用的是org.gjt.mm.mysql.Driver&#xff0c;而mysql 8.0以上connector已经不再支持这个包名;即使将mysql-connector-java-8.0.xx.jar包拷贝到data-integration/lib目录下&#xff0c;还是报错找不到驱动;所以要用jndi方法配置kettle&#xff0c;用com.mysql.cj.jdb…

小白学数据分析--留存率使用的窘境

小白学数据分析--留存率使用的窘境 随着移动游戏整体的火热&#xff0c;现在看到太多的数据&#xff0c;太多信息&#xff0c;很多时候我们仰慕和钦佩别人的成功&#xff0c;我们总是把这个行业达成所谓共识的一些数据来出来说明问题。因为我们笃信数据是有力的证据&#xff0c…

用groovy采集网页数据

首先&#xff0c;用 http://groovyconsole.appspot.com/ 测试下面的代码&#xff0c;发现引用总是失败. 下载了GGTS&#xff1a; https://spring.io/tools/ggts 测试成功&#xff1a; Grapes( Grab(grouporg.ccil.cowan.tagsoup, moduletagsoup, version1.2) )import org.ccil…

vue 时间回显 格式化_VSCode 开发Vue必备插件

1。Vetur —— 语法高亮、智能感知、Emmet等包含格式化功能&#xff0c; AltShiftF &#xff08;格式化全文&#xff09;&#xff0c;CtrlK CtrlF&#xff08;格式化选中代码&#xff0c;两个Ctrl需要同时按着&#xff09;2。EsLint —— 语法纠错3。Debugger for Chrome —— …

公司消费一卡通“变法”记

一卡通在每家公司都存在&#xff0c;不仅含考勤机&#xff0c;还会有门禁&#xff0c;订餐&#xff0c;食堂消费等。我们公司采用的是厦门舒特科技的一卡通系统&#xff0c;前后用了好几年了。 在我之前&#xff0c;一卡通的功能主要启用了考勤和消费这两大模块。 1、考勤机是每…

eslint不报错 vue_2-2【微信小程序全栈开发课程】index页面搭建--ESlint格式错误

1、修改入口文件也就是src/pages/index/main.js文件main.js是入口文件&#xff0c;通过main.js来加载index.vue文件。每个页面文件夹中都要有main.js文件//加载vue组件和index.vue文件 import Vue from vue import App from ./index//新建一个index页面的Vue实例 const app ne…

python弹出另一个窗口_Python 中PyQt5 点击主窗口弹出另一个窗口的实现方法

1.先使用Qt designer设计两个窗口&#xff0c;一个是主窗口&#xff0c;一个是子窗口其中主窗口是新建-Main Window,子窗口是Dialog窗体。两个窗口不能是同一类型,否则会崩溃。并保存为EyeTracking_main.ui和EyeTracking_process.ui(因为我在做眼动追踪&#xff0c;因此窗体命名…

python读取文件数据堆栈溢出的原因_堆栈溢出一般是什么原因?

堆栈是一个在计算机科学中经常使用的抽象数据类型。堆栈中的物体具有一个特性&#xff1a; 最后一个放入堆栈中的物体总是被最先拿出来&#xff0c; 这个特性通常称为后进先出(LIFO)队列。 堆栈中定义了一些操作。 两个最重要的是PUSH和POP。 PUSH操作在堆栈的顶部加入一 个元素…

.NET Core 开发之旅 (1. .NET Core R2安装教程及Hello示例)

前言 前几天.NET Core发布了.NET Core 1.0.1 R2 预览版&#xff0c;之前想着有时间尝试下.NET Core。由于各种原因&#xff0c;就没有初试。刚好&#xff0c;前几天看到.NET Core发布新版本了&#xff0c;决定要去一探究竟。于是乎&#xff0c;就立马去官网查找相关的信息&…

程雷被机器人_太意外了:49岁知名主持人程雷,得遗传性病和女友终分手!

注本文部分文字与图片资源来自于网络&#xff0c;转载此文是出于传递更多信息之目的,若有来源标注错误或侵犯了您的合法权益&#xff0c;请立即通知我们&#xff0c;情况属实&#xff0c;我们会第一时间予以删除&#xff0c;并同时向您表示歉意遗传性肝病发女友不离不弃&#x…

java post 多文件报头_Spring MVC-------文件上传,单文件,多文件,文件下载

Spring MVC框架的文件上传是基于 commons-fileupload 组件的文件上传&#xff0c;只不过SpringMVC 框架在原有文件上传组件上做了进一步封装&#xff0c;简化了文件上传的代码实现&#xff0c;取消了不同上传组件上的编程差异。commons-fileupload组件由于 Spring MVC 框架的文…

win10 java无法运行_Win10中配置jdk之后javac无法运行

环境变量(environment variables)一般是指在操作系统中用来指定操作系统运行环境的一些参数&#xff0c;如&#xff1a;临时文件夹位置和系统文件夹位置等。环境变量是在操作系统中一个具有特定名字的对象&#xff0c;它包含了一个或者多个应用程序所将使用到的信息。例如Windo…

java的reentrantlock_JAVA中ReentrantLock详解(转)

转自https://www.cnblogs.com/java-learner/p/9651675.html前言&#xff1a;本文解决的问题RentrantLock与Synchronized区别ReentrantLock特征ReentrantLock类的方法介绍1.什么是ReentrantLock1.1ReentrantLock 与Synchronized区别在面试中询问ReentrantLock与Synchronized区别…

Servlet添加商品

Servlet实现添加商品 <% page language"java" contentType"text/html; charsetUTF-8"pageEncoding"UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd&…

java运行win10_win10配置java运行环境

1.下载jdk根据自己的电脑下载对应的版本&#xff0c;需要先注册账号才可以下载百度网盘&#xff1a;链接&#xff1a;https://pan.baidu.com/s/1gjpdQo8t8Va8uPiHDDvB3Q提取码&#xff1a;5a0c2.下载完成&#xff0c;点击安装&#xff0c;一般直接根据默认安装即可&#xff0c;…

java8 stringbuilder_为什么 Java 8 中不需要 StringBuilder 拼接字符串

在Java开发者中&#xff0c;字符串的拼接占用资源高往往是热议的话题.让我们深入讨论一下为什么会占用高资源。在Java中&#xff0c;字符串对象是不可变的&#xff0c;意思是它一旦创建&#xff0c;你就无法再改变它。所以在我们拼接字符串的时候&#xff0c;创建了一个新的字符…

c mysql dll_C:\Windows\libmysql_e.dll

这是C:\Windows\libmysql_e.dll下载&#xff0c;一款很重要的dll文件组件哦&#xff0c;如果你的电脑libmysql e.dll错误或者确实会导致很程序和软件都不能正常运行的哦&#xff0c;有需要的就来下载吧&#xff01;软件介绍C:\Windows\libmysql_e.dll是需要安装php和MySQL的工具…