面试总结之消息中间件

news2024/10/7 10:20:53

RabbitMQ的消息如何实现路由

  • RabbitMQ是一个基于AMQP协议实现分布式消息中间件,AMQP具体的工作机制是生产者将消息发送到RabbitMQ Broker上的Exchange交换机上,Exchange交换机将收到的消息根据路由规则发给绑定的队列(Queue),然后再将消息投递给订阅了该队列的消费者,从而完成消息的异步通讯

  • Exchange是一个消息交换机(消息路由规则的核心组件),可定义消息路由规则(即消息应该路由到哪个队列);Queue表示消息的载体,每个消息可以根据路由规则路由到一个或多个队列中
    在这里插入图片描述

  • Exchange负责接收生产者的消息,并将消息路由到消息队列,而消息的路由规则由ExchangeType和Binding决定

  • Binding表示Queue和Exchange之间的绑定关系,每个绑定关系存在一个BindingKey,通过这种方式相当于在Exchange中建立一个路由关系表

  • 生产者发送消息时,需要声明一个routingKey(路由键),Exchange获取到routingKey之后,根据routingKey和路由表中的BindingKey进行匹配,而匹配的规则是通过交换机类型ExchangeType来决定的

  • 在RabbitMQ中,有三种类型的交换机:Direct 、Fanout 、Topic
    1)Direct Exchange(直连交换机):具有路由功能的交换机绑定到此交换机时需要指定一个routingKey,交换机发送消息时需要routingKey,会将消息发送到对应的队列,即 routingKey 和 BindingKey完全一致,相当于点对点的发送
    2)Fanout Exchange(扇形交换机):广播机制,这种方式不会基于routingKey来匹配,而是将消息广播给绑定到当前Exchange上的所有队列上,速度最快,即在直连交换机的基础上增加模式匹配,即对routingKey进行模式匹配,* 代表一个单词,# 代表多个单词
    3)Topic Exchange(主题交换机):正则表达式匹配,根据routingKey使用正则表达式进行匹配,符合匹配规则的Queue都会收到该消息
    4)首部交换机(Headers Exchange):忽略routingKey,使用Headers信息(一个Hash的数据结构)进行匹配,优势在于可以有更多更灵活的匹配规则

如何保证RabbitMQ中的消息可靠传输

  • 在RabbitMQ的整个消息传递过程中,有三种情况会存在消息丢失:
    1)生产者将消息发送到RabbitMQ Server的过程中
    从生产者发送消息的角度来说,RabbitMQ提供了一个Confirm(消息确认)机制,生产者发送消息到Server端以后,如果消息处理成功,Server端会返回一个ack消息。客户端可以根据消息的处理结果来决定是否要做消息的重新发送,从而确保消息一定到达RabbitMQ Server上
    2)RabbitMQ Server收到消息后在持久化之前宕机,从而导致数据丢失
    从RabbitMQ Server端来说,可以开启消息的持久化机制,即收到消息之后持久化到磁盘中
    设置消息的持久化有两个步骤:
  • 创建Queue的时候设置为持久化
  • 发送消息的时候,将消息投递模式设置为持久化投递
    即便设置了持久化消息,但是仍有可能会出现,消息刷新到磁盘之前,RabbitMQ Server宕机导致消息丢失的问题,为了确保万无一失,需要结合Confirm消息确认机制一起使用
    3)消费端收到消息还没来得及处理就宕机,导致RabbitMQ Server认为该消息已经签收
    从消费端的角度来说,我们可以将消息的自动确认机制修改为手动确认,即消费端只有手动调用,消息确认方法才表示消息已经被签收,这可能会造成重复消费的问题,所以这里需要考虑幂等性的设计
    如:为避免MQ重复消费导致数据多次被修改的问题,可以在接受到MQ消息时,将消息通过setnx命令写入到Redis中,一旦消息被消费过,就不会在消费

RabbitMQ如何实现高可用

RabbitMQ高可用实现方式有两种:

  • 第一种:普通集群,在这种模式下,一个Queue的消息只会存在集群的一个节点上,集群中的其他节点会同步Queue所在节点的元数据,消息在生产和消费时,不管请求发送到集群的哪个节点,最终都会路由到Queue所在节点上去存储和拉取消息,这种方式并不能保证Queue的高可用性,但可以提升RabbitMQ消息的吞吐能力
  • 第二种:镜像集群,即集群中的每个节点都会存储Queue的数据副本,在每次生产消息时,都需要将消息内容同步给集群中的其他节点,这种方式能够保证Queue的高可用性,但集群副本之间的同步会带来性能的损耗
    另外,由于每个节点都保存了副本,我们还可以通过HAProxy实现负载均衡

多线程异步和MQ有什么区别

在这里插入图片描述

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

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

相关文章

不同网段的IP怎么互通

最近在整理工作的时候发现一个不同网段无法互通的问题,就是我们大家熟知的一级路由和二级路由无法互通的问题。由于需要记录整个过程的完整性,这里也需要详细记录下整个过程,明白的人不用看,可以直接跳过,到解决方法去…

传智书城源码+课程设计文档基于JSP+Servlet实现

下载地址: https://juzhendongli.store/commodity/details/19 包括源码参考论文

IDEA 断点高阶

一、按钮介绍 1.1 补充 返回断点处: 设置debug配置: 二、增加/切换debugger视图 三、window快捷键 所在行处: CtrlF8断点属性编辑: CtrlShiftF8 四、一些常用的高级功能 4.1 查看对象内存-Attach memory agent 1.勾选Atta…

PHP与mysql数据库交互

PHP与mysql数据库交互 文章目录 PHP与mysql数据库交互方法速查建立与Mysql链接捕获连接错误SQL语句的执行SQL 错误SQL语句执行结果集对象方法速查 案例 方法速查 函数名 作用 mysqli_connect() 与MySQL 数据库建立连接。 mysqli_close() 关闭与MYSQL 数据库建…

git合并错分支还原技巧

如果合并错了,但是还没有push,还原的简单粗暴的方式就是把合并后的分支删了。 本文主要讲的是git合并错分支并且已经push了的还原方式 比如:开发分支future_1,合并到项目组共同使用的分支develop上了,并且已经push了&…

Java实现SQL分页

在日常开发需要对数据进行分页&#xff0c;配置如下 <!-- baomidou --><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.4.0</version></dependency> 在控…

8.稳定性专题

1. anr https://code84.com/303466.html 一句话&#xff0c;规定的时间没有干完要干的事&#xff0c;就会发生anrsystem_anr场景 input 5sservice 前台20s 后台60scontentprivider超市 比较少见 原因 主线程耗时 复杂layout iobinder对端block子线程同步锁blockbinder被占满导…

ROS自学笔记十五:URDF工具

要使用工具之前&#xff0c;首先需要安装&#xff0c;安装命令: sudo apt install liburdfdom-tools 1.check_urdf 语法检查 在ROS中&#xff0c;你可以使用.check_urdf命令行工具来对URDF&#xff08;Unified Robot Description Format&#xff09;文件进行语法检查和验证。…

【广州华锐视点】VR飞行员驾驶模拟实训系统

VR飞行员驾驶模拟实训系统是一种基于虚拟现实技术的航空装备仿真测试技术&#xff0c;可以用于飞行员、乘务员和机务人员的训练。该系统可以模拟真实的飞行环境&#xff0c;包括天气、地形、飞机性能等&#xff0c;使被试者能够在虚拟环境中进行飞行操作&#xff0c;从而提高其…

DAY35 435. 无重叠区间 + 763.划分字母区间 + 56. 合并区间

435. 无重叠区间 题目要求&#xff1a;给定一个区间的集合&#xff0c;找到需要移除区间的最小数量&#xff0c;使剩余区间互不重叠。 注意: 可以认为区间的终点总是大于它的起点。 区间 [1,2] 和 [2,3] 的边界相互“接触”&#xff0c;但没有相互重叠。 示例 1: 输入: [ […

Nginx 的配置文件(负载均衡,反向代理)

Nginx可以配置代理多台服务器&#xff0c;当一台服务器宕机之后&#xff0c;仍能保持系统可用。 cmd查找端口是否使用&#xff1a;netstat -ano Nginx出现403 forbidden #解决办法&#xff1a;修改web目录的读写权限&#xff0c;或者是把nginx的启动用户改成目录的所属用户&…

题目 1059: 二级C语言-等差数列(python详解)——练气四层后期

✨博主&#xff1a;命运之光 &#x1f984;专栏&#xff1a;算法修炼之练气篇&#xff08;C\C版&#xff09; &#x1f353;专栏&#xff1a;算法修炼之筑基篇&#xff08;C\C版&#xff09; &#x1f352;专栏&#xff1a;算法修炼之练气篇&#xff08;Python版&#xff09; ✨…

京东平台数据分析:2023年9月京东空气净化器行业品牌销售排行榜

鲸参谋监测的京东平台9月份空气净化器市场销售数据已出炉&#xff01; 9月份&#xff0c;空气净化器的销售同比上年增长。根据鲸参谋平台的数据显示&#xff0c;今年9月&#xff0c;京东平台空气净化器的销量将近15万&#xff0c;同比增长约1%&#xff1b;销售额将近2亿元&…

身份证读卡器Qt语言实现Linux系统开发集成

Linux系统用Qt开发身份证读卡器示例&#xff0c;后面是Cdemo源码&#xff1a; 编译平台&#xff1a; 麒麟V10&#xff08;SP1&#xff09;&#xff0c;amd构架&#xff0c;Intel i7-10700 CPU Qt版本&#xff1a; Qt Creator 4.11.0&#xff0c;Based on Qt 5.12.12&#xff0…

CTF-Crypto 第二天-DES加密算法原理学习

文章目录 DES算法简介DES算法流程迭代加密费斯妥函数&#xff08;F函数&#xff09;密钥调度 混淆与扩散 DES算法简介 数据加密标准&#xff08;Data Encryption Standard&#xff0c;缩写DES&#xff09;是一种对称加密算法&#xff0c;也是一种分组加密算法。 对称加密指的…

RabbitMQ的交换机(原理及代码实现)

1.交换机类型 Fanout Exchange&#xff08;扇形&#xff09;Direct Exchange&#xff08;直连&#xff09;opic Exchange&#xff08;主题&#xff09;Headers Exchange&#xff08;头部&#xff09; 2.Fanout Exchange 2.1 简介 Fanout 扇形的&#xff0c;散开的&#xff1…

linux配置jdk环境变量的三种方法

在Linux系统中&#xff0c;配置JDK环境变量是非常重要的&#xff0c;它可以让你在终端中直接使用Java命令&#xff0c;同时也能够确保你的Java应用程序能够正常运行。下面将介绍三种常用的方法来配置JDK环境变量。 方法一&#xff1a;使用/etc/profile文件 1. 打开终端&#…

TWAS模型数据*.wgt.RDat查看及导入R

TWAS模型数据*.wgt.RDat查看及导入R 1 数据导入R load(“./SLC7A8.wgt.RDat”) as.data.frame(snps) -> snp snp %>% head()V1 V2 V3 V4 V5 V6 1 12 rs10747759 0 55683634 C T 2 12 rs2293409 0 55684180 A C 3 12 rs1048103 0 55684405 C …

.DS_Store泄露

.DS_Store泄露 1.简介2.发掘和利用方式 1.简介 .DS_Store文件是苹果操作系统&#xff08;如Mac OS&#xff09;中的隐藏文件&#xff0c;它保存了文件夹的自定义属性、图标布局和其他元数据信息。通常&#xff0c;这些文件用于记录文件夹中的视图选项和布局设置。 就文件本身…

中国铁路线路数据,分为高速铁路和普通铁路,有shp格式和xlsx格式,免费下载

数据地址&#xff1a; 中国铁路线路数据https://www.xcitybox.com/datamarketview/#/Productpage?id274 基本信息. 数据名称: 中国铁路线路数据 数据格式: ShpXlsx 数据时间: 2018年 数据几何类型: 线 数据坐标系: WGS84坐标系 数据来源&#xff1a;网络公开数据 数据…