非常强悍的 RabbitMQ 总结,写得真好!

使用 Visual Studio Code 搭建 SAP UI5 本地开发环境 工欲善其事,必先利其器。时至今日,SAP 提供了非常多的 SAP UI5 开发工具,既包含本地搭建的,也包含浏览器里远端使用的工具,比如 WebIDE 和 Business Application Studio. 我们访问下面这个链接,就能找到所有这些工具的安装或者配置步骤: https://tools.hana.ondemand.com/#sapui5 如果想选择本地开发,SAP 推荐的工具是 Visual Studio Code,也就是本文要介绍的内容。 也可以下载 WebIDE 的本地安装包,将其安 阅读详情

作者:一号线

https://segmentfault.com/a/1190000022387211

前言

RabbitMQ是基于AMQP协议的,通过使用通用协议就可以做到在不同语言之间传递。

AMQP协议

核心概念

  1. server:又称broker,接受客户端连接,实现AMQP实体服务。

  2. connection:连接和具体broker网络连接。

  3. channel:网络信道,几乎所有操作都在channel中进行,channel是消息读写的通道。客户端可以建立多个channel,每个channel表示一个会话任务。

  4. message:消息,服务器和应用程序之间传递的数据,由properties和body组成。properties可以对消息进行修饰,比如消息的优先级,延迟等高级特性;body是消息实体内容。

  5. Virtual host:虚拟主机,用于逻辑隔离,最上层消息的路由。一个Virtual host可以若干个Exchange和Queue,同一个Virtual host不能有同名的Exchange或Queue。

  6. Exchange:交换机,接受消息,根据路由键转发消息到绑定的队列上。

  7. banding:Exchange和Queue之间的虚拟连接,binding中可以包括routing key

  8. routing key:一个路由规则,虚拟机根据他来确定如何路由 一条消息。

  9. Queue:消息队列,用来存放消息的队列。

Exchange

交换机的类型,direct、topic、fanout、headers,durability(是否需要持久化true需要)auto delete当最后一个绑定Exchange上的队列被删除Exchange也删除。

  1. Direct Exchange,所有发送到Direct Exchange的消息被转发到RouteKey 中指定的Queue,Direct Exchange可以使用默认的默认的Exchange (default Exchange),默认的Exchange会绑定所有的队列,所以Direct可以直接使用Queue名(作为routing key )绑定。或者消费者和生产者的routing key完全匹配。

  2. Toptic Exchange,是指发送到Topic Exchange的消息被转发到所有关心的Routing key中指定topic的Queue上。Exchange 将routing key和某Topic进行模糊匹配,此时队列需要绑定一个topic。所谓模糊匹配就是可以使用通配符,“#”可以匹配一个或多个词,“”只匹配一个词比如“log.#”可以匹配“log.info.test” "log. "就只能匹配log.error。

  3. Fanout Exchange:不处理路由键,只需简单的将队列绑定到交换机上。发送到改交换机上的消息都会被发送到与该交换机绑定的队列上。Fanout转发是最快的。

消息如何保证100%投递
什么是生产端的可靠性投递?
  1. 保证消息的成功发出

  2. 保证MQ节点节点的成功接收

  3. 发送端MQ节点(broker)收到消息确认应答

  4. 完善消息进行补偿机制

可靠性投递保障方案

消息落库,对消息进行打标

消息的延迟投递

在高并发场景下,每次进行db的操作都是每场消耗性能的。我们使用延迟队列来减少一次数据库的操作。

消息幂等性

幂等性是什么?点击这篇文章看下。

我对一个动作进行操作,我们肯能要执行100次1000次,对于这1000次执行的结果都必须一样的。比如单线程方式下执行update count-1的操作执行一千次结果都是一样的,所以这个更新操作就是一个幂等的,如果是在并发不做线程安全的处理的情况下update一千次操作结果可能就不是一样的,所以并发情况下的update操作就不是一个幂等的操作。对应到消息队列上来,就是我们即使受到了多条一样的消息,也和消费一条消息效果是一样的。

高并发的情况下如何避免消息重复消费
  1. 唯一id+加指纹码,利用数据库主键去重。

    优点:实现简单

    缺点:高并发下有数据写入瓶颈。

  2. 利用Redis的原子性来实习。

    使用Redis进行幂等是需要考虑的问题

  • 是否进行数据库落库,落库后数据和缓存如何做到保证幂等(Redis   和数据库如何同时成功同时失败)?

  • 如果不进行落库,都放在Redis中如何这是Redis和数据库的同步策略?还有放在缓存中就能百分之百的成功吗?

confirm 确认消息、Return返回消息

理解confirm消息确认机制

  • 消息的确认,指生产者收到投递消息后,如果Broker收到消息就会给我们  的生产者一个应答,生产者接受应答来确认broker是否收到消息。

如何实现confirm确认消息。
  • 在Channel上开启确认模式:channel.confirmSelect()

  • 在channel上添加监听:addConfirmListener,监听成功和失败的结果,具体结果对消息进行重新发送或者记录日志。

return消息机制

Return消息机制处理一些不可路由的消息,我们的生产者通过指定一个Exchange和Routinkey,把消息送达到某一个队列中去,然后我们消费者监听队列进行消费处理!

在某些情况下,如果我们在发送消息的时候当Exchange不存在或者指定的路由key路由找不到,这个时候如果我们需要监听这种不可到达的消息,就要使用Return Listener!

Mandatory 设置为true则会监听器会接受到路由不可达的消息,然后处理。如果设置为false,broker将会自动删除该消息。

消费端自定义监听
消费端限流

什么是消费端的限流?限流算法点击这里阅读。

假设我们有个场景,首先,我们有个rabbitMQ服务器上有上万条消息未消费,然后我们随便打开一个消费者客户端,会出现:巨量的消息瞬间推送过来,但是我们的消费端无法同时处理这么多数据。

这时就会导致你的服务崩溃。其他情况也会出现问题,比如你的生产者与消费者能力不匹配,在高并发的情况下生产端产生大量消息,消费端无法消费那么多消息。

  • rabbitMQ提供了一种qos(服务质量保证)的功能,即非自动确认消息的前提下,如果有一定数目的消息(通过consumer或者Channel设置qos)未被确认,不进行新的消费。

void basicQOS(unit prefetchSize,ushort prefetchCount,Boolean global)方法。

  • prefetchSize:0 单条消息的大小限制。0就是不限制,一般都是不限制。

  • prefetchCount: 设置一个固定的值,告诉rabbitMQ不要同时给一个消费者推送多余N个消息,即一旦有N个消息还没有ack,则consumer将block掉,直到有消息ack

  • global:truefalse 是否将上面的设置用于channel,也是就是说上面设置的限制是用于channel级别的还是consumer的级别的。

消费端ack与重回队列
  • 消费端进行消费的时候,如果由于业务异常我们可以进行日志的记录,然后进行补偿!(也可以加上最大努力次数的尝试)

  • 如果由于服务器宕机等严重问题,那我们就需要手动进行ack保证消费端的消费成功!

消息重回队列
  • 重回队列就是为了对没有处理成功的消息,把消息重新投递给broker!

  • 实际应用中一般都不开启重回队列。

TTL队列/消息

TTL time to live 生存时间。

  • 支持消息的过期时间,在消息发送时可以指定。

  • 支持队列过期时间,在消息入队列开始计算时间,只要超过了队列的超时时间配置,那么消息就会自动的清除。

死信队列

死信队列:DLX,Dead-Letter-Exchange

利用DLX,当消息在一个队列中变成死信(dead message,就是没有任何消费者消费)之后,他能被重新publish到另一个Exchange,这个Exchange就是DLX。

消息变为死信的几种情况:

  1. 消息被拒绝(basic.reject/basic.nack)同时requeue=false(不重回队列)

  2. TTL过期

  3. 队列达到最大长度

DLX也是一个正常的Exchange,和一般的Exchange没有任何的区别,他能在任何的队列上被指定,实际上就是设置某个队列的属性。

当这个队列出现死信的时候,RabbitMQ就会自动将这条消息重新发布到Exchange上去,进而被路由到另一个队列。可以监听这个队列中的消息作相应的处理,这个特性可以弥补rabbitMQ以前支持的immediate参数的功能。

死信队列的设置

  • 设置Exchange和Queue,然后进行绑定

Exchange: dlx.exchange(自定义的名字)

queue: dlx.queue(自定义的名字)

routingkey: #(#表示任何routingkey出现死信都会被路由过来)

然后正常的声明交换机、队列、绑定,只是我们在队列上加上一个参数:

arguments.put("x-dead-letter-exchange","dlx.exchange");

rabbitMQ集群模式
  1. 主备模式:实现rabbitMQ高可用集群,一般在并发量和数据不大的情况下,这种模式好用简单。又称warren模式。(区别于主从模式,主从模式主节点提供写操作,从节点提供读操作,主备模式从节点不提供任何读写操作,只做备份)如果主节点宕机备份从节点会自动切换成主节点,提供服务。

  2. 集群模式:经典方式就是Mirror模式,保证100%数据不丢失,实现起来也是比较简单。

  • 镜像队列,是rabbitMQ数据高可用的解决方案,主要是实现数据同步,一般来说是由2-3节点实现数据同步,(对于100%消息可靠性解决方案一般是3个节点)

多活模式:这种模式也是实现异地数据复制的主流模式,因为shovel模式配置相对复杂,所以一般来说实现异地集群都是使用这种双活,多活的模式,这种模式需要依赖rabbitMQ的federation插件,可以实现持续可靠的AMQP数据。

rabbitMQ部署架构采用双中心模式(多中心)在两套(或多套)数据中心个部署一套rabbitMQ集群,各中心的rabbitMQ服务需要为提供正常的消息业务外,中心之间还需要实现部分队列消息共享。

多活架构如下:

federation插件是一个不需要构建Cluster,而在Brokers之间传输消息的高性能插件,federation可以在brokers或者cluster之间传输消息,连接的双方可以使用不同的users或者virtual host双方也可以使用不同版本的erlang或者rabbitMQ版本。federation插件可以使用AMQP协议作为通讯协议,可以接受不连续的传输。

Federation Exchanges,可以看成Downstream从Upstream主动拉取消息,但  
并不是拉取所有消息,必须是在Downstream上已经明确定义Bindings关系的  
Exchange,也就是有实际的物理Queue来接收消息,才会从Upstream拉取消息  
到Downstream。

使用AMQP协议实施代理间通信,Downstream 会将绑定关系组合在一起, 绑定/解除绑定命令将发送到Upstream交换机。

因此,Federation Exchange只接收具有订阅的消息。

HAProxy是一款提供高可用性、负载均衡以及基于TCP (第四层)和HTTP  
(第七层)应用的代理软件,支持虚拟主机,它是免费、快速并且可靠的一种解决  
方案。

HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会  
话保持或七层处理。HAProxy运行在时下的硬件上,完全可以支持数以万计的  
并发连接。

并且它的运行模式使得它可以很简单安全的整合进您当前的架构中  
同时可以保护你的web服务器不被暴露到网络上。

HAProxy性能为何这么好?
  1. 单进程、事件驱动模型显著降低了.上下文切换的开销及内存占用.

  2. 在任何可用的情况下,单缓冲(single buffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽

  3. 借助于Linux 2.6 (>= 2.6.27.19). 上的splice()系统调用,HAProxy可以实现零复制转发(Zero-copy forwarding),在Linux 3.5及以上的OS中还可以实现心零复制启动(zero-starting)

  4. 内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长

  5. 树型存储:侧重于使用作者多年前开发的弹性二叉树,实现了以O(log(N))的低开销来保持计时器命令、保持运行队列命令及管理轮询及最少连接队列

keepAlive

KeepAlived软件主要是通过VRRP协议实现高可用功能的。VRRP是  
Virtual Router RedundancyProtocol(虚拟路由器冗余协议)的缩写,  
VRRP出现的目的就是为了解决静态路由单点故障问题的,它能够保证当  
个别节点宕机时,整个网络可以不间断地运行所以,Keepalived - -方面  
具有配置管理LVS的功能,同时还具有对LVS下面节点进行健康检查的功  
能,另一方面也可实现系统网络服务的高可用功能

keepAlive的作用

  1. 管理LVS负载均衡软件

  2. 实现LVS集群节点的健康检查中

  3. 作为系统网络服务的高可用性(failover)

Keepalived如何实现高可用

Keepalived高可用服务对之间的故障切换转移,是通过VRRP (Virtual Router  
Redundancy Protocol ,虚拟路由器冗余协议)来实现的。

在Keepalived服务正常工作时,主Master节点会不断地向备节点发送( 多播的方式)心跳消息,用以告诉备Backup节点自己还活看,当主Master节点发生故障时,就无法发送心跳消息,备节点也就因此无法继续检测到来自主Master节点的心跳了,于是调用自身的接管程序,接管主Master节点的IP资源及服务。

而当主Master节点恢复时备Backup节点又会释放主节点故障时自身接管的IP资源及服务,恢复到原来的备用角色。

Python控制程控电源(USB) 随着智能电动汽车行业的持续发展,汽车电子或嵌入式设备在软硬件的测试中,都会使用程控电源供电,特别是自动化测试、压力测试场景必定使用到程控电源控制,控制电源上下电,监听电源电流、电压等,以下就以常见的艾德克斯程控电源为例,分享如何通过USB连接方式Python语言来控制程控电源。 阅读详情

相关推荐

嵌入式开发必备:手把手教你用DB-9连接器搞定RS-232串口通信(附万用表测试技巧)

本文详细解析了嵌入式开发中RS-232串口通信的硬件连接核心。从DB-9连接器的引脚定义入手,深入讲解DTE与DCE设备角色,明确直连线与交叉线的选择法则,并重点分享了使用万用表进行线缆连通性测试、电压测量及故障诊断的实战技巧,帮助开发者彻底掌握串口通信的硬件连接与排查方法。

tgb345678的博客 1169

RabbitMQ一对多使用

RabbitMQ一对多简单使用

weixin_36723038的博客 1439

ARM 汇编指令:LSL(逻辑左移) 和 LSR(逻辑右移)

ARM 汇编中的 LSL(逻辑左移)和 LSR(逻辑右移)是基础移位指令,分别实现二进制位的左移和右移操作。LSL 低位补0,等效于乘以2^n;LSR 高位补0,等效于无符号除以2^n。这两个指令可以单独使用或与其他指令结合(如ADD、MOV等),利用ARM的"桶形移位器"硬件实现高效运算。关键特性包括:移位范围0-31(LSL)或1-32(LSR),可选更新标志位,以及与其他指令结合时的无额外开销优势。LSR与ASR(算术右移)的主要区别在于高位填充方式,分别适用于无符号和有符号数处理

guigenyi的专栏 1817

RabbitMQ广播模式(动态生成queue)

RabbitMQ的广播机制和ActiveMQ有所不同。 先来梳理下RabbitMQ中消息从产生到消费的流程吧: 而exchange 存在多种类型,这里就只说广播模式(fanout)了。在广播模式中,一个exchange对应多个queue的话,会向每个queue都发送信息,然后不同的queue再由其对应的消费者消费信息,即完成了广播。 因为广播模式中不关注routingkey和queue,只需要q...

404 Not Found 4589

Halcon像素比例标定(误差大)-相机标定

一种简易标定: 像素比例标定,如果需要精确一些则需要在高度和宽度上都需要计算,然后求出比例系数。需要高精度标定板和相机,以及多次标定才能达到稳定的状态,这种标定简单,但是误差大。 read_image (Img0008, 'D:/00项目代码/000视觉软件/02Halocn算法20190501/04测量20190424/07_比例计算测量标定/IMG0008.jpg') rgb1_to_...

SSSS的博客 3985

最简解决 Unity Error Registry configuration is invalid Unable to connect https packages.unity.cn

前言 在学习其他大佬项目的时候,大佬说项目能直接运行,然后我拉下来就报如下错误 Unity报错:[Package Manager]Error Registry configuration is invalid:Unable to connect “https://packages.unity.cn” 翻了很多博发现是 unity3d 中国增强版的原因,中国增强版屏蔽了国外自定义的插件仓库。 安装 非中国增强版后可以成功打开。 然后大家给出的解决方案都比较激进,大抵就是更换Unity版本就OK了。 当然我是觉

Gipsyz的博客 6842

RabbitMQ如何实现对同一个应用的多个节点进行广播

RabbitMQ如何实现对同一个应用的多个节点进行广播 1.背景 了解过RabbitMQ的Fanout模式,应该知道它原本的Fanout模式就是用来做广播的。但是它的广播有一点区别,来回顾下它的含义:Fanout类型没有路由键的概念,只要队列绑定到了改exchange上面,就会接收到所有的消息。 使用过程一般就是先new 出一个Fanout类型的交换机,然后往这个...

weixin_42786274的博客 3330

基于知识图谱的电影推荐系统——Neo4j&Python

也可直接从这里下载:链接: https://pan.baidu.com/s/1l6wjwcUzy5G_dIlVDbCkpw 提取码: pkq6。修改main.py中的driver,输入自己数据库的用户名与密码。系统会询问是否需要重新加载并创建知识图谱,在第一次时输入1。

weixin_46351593的博客 6357

RabbitMQ 简单入门 通俗理解

一.RabbitMQ什么语言编写的? 我们这边为什么要重点说这个能,就是因为他的编写语言,才让他能在MQ这个大家庭里脱颖而出。 rabbitmq是Erlang编程语言编写的: Erlang编程语言最初目的是进行大型电信交换设备的软件开发,是一种适用于大规模并行处理环境的高可靠性编程语言。随着多核处理器技术的日渐普及,以及互联网、云计算等技术的发展,该语言的应用范围也有逐渐扩大之势。所以Ra...

悠忧南士 833

AgentScope深入分析-ReActAgent

ReActAgent 是 AgentScope 框架中最核心的智能体实现,它完美诠释了"推理-行动"(Reasoning-Acting)循环的精髓。本文将深入分析 ReActAgent 的类继承关系、核心执行流程,以及状态管理、钩子机制、实时介入等关键技术点。通过阅读本文,你会理解智能体如何与模型交互、如何执行工具、如何处理中断,以及这些机制背后的设计考量。模块化:通过组合不同的组件(模型、格式化器、工具集、记忆)来构建智能体透明性:所有关键流程都对开发者可见,可以精确控制可扩展性。

842

matlab 质心重合法实现点云配准【2026最新版】

质心重合法是将源点云和目标点云的质心重合,以此缩小两点云集之间的平移误差,从而为下一步粗配准提供更好的初始位置姿态。

点云侠的博客 510

RabbitMQ最全思维导图整理

1、思维导图结构 2、基本知识 3、AMQP协议 4、基本架构 5、交换器 6、工作队列模型 7、消息与事务 8、集群模式 9、死信队列 10、消息相关四大问题

nemoyss的博客 1831

使用强化学习快速让AI学会玩贪食蛇游戏(轻量级二十分钟训练+代码)

如何让AI玩会贪食蛇,甚至比你厉害概述构建问题(强化学习求解的一般步骤)环境动作定义状态定义奖励设计训练奖励值收敛图效果代码 概述 所用技术:强化学习(Deep Reinforcement Learning),属于一种无监督学习,利用奖励rewardrewardreward教会智能体AgentAgentAgent在合适的场景做合适的决策。 采用算法:试过两种算法D3QN和离散版本的PPO算法,最终采用离散版本PPO算法+GAE(PPO是我用过的性能最好的算法之一) 编程语言与深度学习框架:Python3.

ZYunfei的博客 2万+
上一篇: 面试官:你画的SpringMVC请求处理过程是从网上抄的吧?
下一篇: Springboot启动扩展点超详细总结,再也不怕面试官问了
Java思维导图
博客等级 码龄10年 306粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值