分布式架构核心组件之消息队列RabbitMQ

五、RabbitMQ-消息可靠性传递实现方案 一、实现方案图解 第一步 将要发送的信息进行对应数据库的录入,并且将发送信息的操作作为一条操作日志录入数据库中设置状态字段status为0(发送中)。 第二步 生产端将消息发送到RabbitMQ服务上。 第三步 RabbitMQ接收到消息后,进行回应,告诉生产端已接收到信息,这一步骤需要在生产端进行配置,设置RabbitMQ接收到信息后自动回应。 第四步 生产端接收到Rabbit... 阅读详情

一、为什么使用消息队列

1、实现解耦

耦合指不同模块/系统之间相互作用、相互依赖的关系。RabbitMQ以异步的方式解耦系统间的关系,使用者将业务请求发送到Rabbit服务器,然后就可以返回了,Rabbit会确保请求被正确处理,即使遇到网络异常、Rabbit服务器崩溃等特殊场景。针对这些特殊场景,Rabbit提供了各种机制确保其可用性。

2、实现异步

对于大批量的用户操作,同步等待需要很长时间,利用MQ的发布订阅模型,异步处理响应结果可以避免用户不必要的等待。

举一个简单MQ使用场景:使用手机APP实时转账,就采用了MQ低延迟特性,将转账消息投递到MQ中,然后由消费者(对方银行)进行处理,具体到账时间以对方银行收到转账消息,处理完转账操作时间为准。

3、流量消峰

对于像电商网站,每逢店庆、双11等节日会出现瞬间访问量特别大的情况。不能因为系统支持的并发量有限而拒绝部分用户请求,通常做法是承接所有用户请求转变为消息存放到MQ中,由后端业务系统按照顺序进行处理。借助MQ低延迟高吞吐量特性,可以创建多消费者实现负载,从而实现流量消峰。

另外可以利用MQ发布订阅模型可以实现消息广播。

 二、RabbitMQ工作模型

RabbitMQ中生产者发送消息、消费者接收消息都需要与Broker建立连接Connection(TCP长连接),为了减少Broker性能损耗,RabbitMQ引入了消息通道/信道Channel,Channel是在应用程序与Broker的Connection连接中创建的虚拟连接,在发送接收消息时直接操作Channel即可,不需要频繁与Broker创建连接。另外Channel还是最重要的编程接口,对交换机Exchange、队列Queue操作的很多API都是对Channel方法的封装。

RabbitMQ消息投递引用了交换机Exchange,当一个消息携带了地址(Routing Key)时,交换机会根据携带的路由关键字发送到不同队列Queue。交换机Exchange和队列Queue的对应关系需要进行事先绑定Binding。队列Queue和交换机是多对多的关系,交换机可以绑定多个队列Queue,队列Queue也可以绑定到不同交换机。

同时为了节省服务器资源,RabbitMQ引入了Virtual Host虚拟机机制,我们可以把Virtual Host虚拟机当做一个小型的RabbitMQ服务器。在同一个Broker中可以创建多个Virtual Host虚拟机,每个Virtual Host虚拟机中都能创建自己的交换机Exchange和队列Queue,以及它们的绑定关系。从而实现了硬件服务器的高效利用以及资源的隔离。

RabbitMQ中核心概念:

1、Server:又称Broker,接收客户端的连接,实现AMQP实体服务。

2、Connection:应用程序与Broker的网络连接。

3、Channel:网络信道,几乎所有的操作都在Channel中进行,包括定义Queue、定义Exchange、绑定Queue与Exchange、发布消息等。Channel是进行消息读写的通道。客户端可以建立多个Channel,每个Channel代表一个会话任务。

4、Message:服务器和应用程序之间传送的消息,由Properties和Body组成。Properties可以对消息进行修饰,比如消息的优先级、延迟等高级特性;Body就是消息体内容。

5、Virtual Host:虚拟地址,用于进行逻辑隔离,最上层的消息路由。一个Virtual Host可以有若干个Exchange和Queue,同一个Virtual host里面不能有相同的Exchange和Queue。

6、Exchange:接收消息的交换机,根据路由关键字转发消息到绑定的队列。RabbitMQ中有三种常用的交换机类型:

6.1、直连交换机direct:通过Binding关键字将Queue队列和直连交换机建立连接。队列Queue绑定直连交换机时,必须指定一个关键字。发送消息时会携带一个路由关键字,RabbitMQ会将路由关键字和绑定关键字进行一个全字符匹配。

channel.basicPublish("My_Direct_Exchange","spring","hello world");

channel.basicPublish("My_Direct_Exchange","struts","hi struts");

6.2、主题交换机topic:绑定关键字时,不需要全字符匹配,可以采用通配符。

* 代表一个单词

# 代表零个或多个单词

channel.basicPublish("My_Direct_Exchange","junior.netty","hello world");

6.3、广播交换机fanout:不再需要任何绑定关键字,交换机会将消息分发到所有队列Queue。

7、Binding:Exchange和Queue之间的虚拟连接,binding中可以包含routing key。

8、Routing key:一个路由规则,虚拟机可用它来确定如何路由一个特定消息。

9、Queue:也称为Message Queue消息队列,保存消息并将它们转发给消费者,多个消费者可以订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

10、Prefetch count:如果有多个消费者同时订阅同一个Queue中的消息,Queue中的消息会被平摊给多个消费者。这时如果每个消息的处理时间不同,就有可能会导致某些消费者一直在忙,而另外一些消费者很快就处理完手头工作并一直空闲的情况。我们可以通过设置prefetchCount来限制Queue每次发送给每个消费者的消息数,比如我们设置prefetchCount=1,则Queue每次给每个消费者发送一条消息;消费者处理完这条消息后Queue会再给该消费者发送一条消息。

三、Spring Boot集成RabbitMQ

RabbitMQ安装成功后登录RabbitMQ控制台http://192.168.1.112:15672/,设置Exchange、Queue、Routing Key。Spring Boot集成RabbitMQ步骤:

1、引入相关依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-amqp</artifactId>
</dependency>

2、配置application.yml

## producer配置
spring:
  rabbitmq:
    addresses: 192.168.1.110:5672
    username: wangpf
    password: 111111
    virtual-host: /
server:
  port: 8001
  servlet:
    context-path: /

## consumer配置
spring:
  rabbitmq:
    addresses: 192.168.1.110:5672
    username: guest
    password: guest
    virtual-host: /
    listener:
      simple:
        concurrency: 5
        acknowledge-mode: manual
        max-concurrency: 10
        prefetch: 1
server:
  port: 8002
  servlet:
    context-path: /

3、实例代码

生产者RabbitSender

@Component
public class RabbitSender {
    //自动注入RabbitTemplate模板类
    @Autowired
    private RabbitTemplate rabbitTemplate;

    @Autowired
    private BrokerMessageLogMapper brokerMessageLogMapper;

    //回调函数: confirm确认
    final RabbitTemplate.ConfirmCallback confirmCallback = new RabbitTemplate.ConfirmCallback() {
        @Override
        public void confirm(CorrelationData correlationData, boolean ack, String cause) {
            System.err.println("correlationData: " + correlationData);
            String messageId = correlationData.getId();
            if(ack){
                //如果confirm返回成功 则进行更新
                brokerMessageLogMapper.changeBrokerMessageLogStatus(messageId, Constants.ORDER_SEND_SUCCESS, new Date());
            } else {
                //失败则进行具体的后续操作:重试 或者补偿等手段
                System.err.println("异常处理...");
            }
        }
    };

    //发送消息方法调用: 构建自定义对象消息
    public void sendOrder(Order order) throws Exception {
        // 通过实现 ConfirmCallback 接口,消息发送到 Broker 后触发回调,确认消息是否到达 Broker 服务器,也就是只确认是否正确到达 Exchange 中
        rabbitTemplate.setConfirmCallback(confirmCallback);
        //消息唯一ID
        CorrelationData correlationData = new CorrelationData(order.getMessageId());
        rabbitTemplate.convertAndSend("order-exchange", "order.msg", order, correlationData);
    }
}

消费者RabbitReceiver

@Component
public class RabbitReceiver {
    //配置监听的哪一个队列,同时在没有queue和exchange的情况下会去创建并建立绑定关系
    @RabbitListener(bindings = @QueueBinding(
            value = @Queue(value = "order-queue",durable = "true"),
            exchange = @Exchange(name="order-exchange",durable = "true",type = "topic"),
            key = "order.*"
        )
    )
    
    //如果有消息过来,在消费的时候调用这个方法
    @RabbitHandler
    public void onOrderMessage(@Payload Order order, @Headers Map<String,Object> headers, Channel channel) throws IOException {
        //消费者操作
        System.out.println("---------收到消息,开始消费---------");

        /**
         * Delivery Tag 用来标识信道中投递的消息。RabbitMQ 推送消息给 Consumer 时,会附带一个 Delivery Tag,
         * 以便 Consumer 可以在消息确认时告诉 RabbitMQ 到底是哪条消息被确认了。
         * RabbitMQ 保证在每个信道中,每条消息的 Delivery Tag 从 1 开始递增。
         */
        Long deliveryTag = (Long) headers.get(AmqpHeaders.DELIVERY_TAG);

        /**
         *  multiple 取值为 false 时,表示通知 RabbitMQ 当前消息被确认
         *  如果为 true,则额外将比第一个参数指定的 delivery tag 小的消息一并确认
         */
        boolean multiple = false;
        //ACK,确认一条消息已经被消费
        channel.basicAck(deliveryTag,multiple);
    }
}

 

 

海量数据采集实战:Python爬虫结合消息队列(RabbitMQ/Kafka)的异步处理架构(万字实战) 在 海量数据采集场景 下(日请求量千万级、目标站点数十个、数据维度多),传统同步爬虫或简单异步爬虫会暴露致命瓶颈:消息队列(RabbitMQ/Kafka)的核心价值是 “解耦、削峰、异步通信”,恰好解决上述痛点。通过将爬虫流程拆分为“任务生产→消息队列→多节点消费(采集/解析/存储)”的分布式架构,可实现:本文将实战落地 “Python爬虫 + 消息队列”的异步处理架构,分别集成RabbitMQ(适合任务调度)和Kafka(适合高吞吐数据传输),覆盖任务分发、异步采集、解析、存储全流程,提供可直接复用的代码 阅读详情

相关推荐

STM32F407+LAN8720网口不通?别慌,手把手教你用CubeMX和HAL库搞定RMII配置与调试

本文详细介绍了STM32F407与LAN8720网口不通的全面排查与解决方法,涵盖硬件检查、CubeMX配置、PHY芯片初始化和LWIP协议栈优化。通过RMII接口配置、时钟树设置和PHY芯片调试,帮助开发者快速定位并解决网络连接问题,提升嵌入式网络开发效率。

weixin_30457551的博客 506

RabbitMQ学习笔记(总结)

点击上方蓝字"优派编程"选择“加为星标”,第一时间关注原创干货一、RabbitMQ的深入理解和最简单的用途说明如何在新的系统中使用RabbitMQ.系统设计的两个重大问题.第一条要满足未来...

优派编程 1178

BMS开发避坑指南:如何用ADBMS6815实现0.03%精度的电池采样?

本文深入解析了如何利用ADBMS6815等高精度AFE芯片,在车规级BMS开发中实现0.03%级别的电池电压采样精度。文章从芯片选型、硬件设计、软件配置、算法优化到系统验证,提供了一套完整的实战指南,帮助工程师系统性地提升BMS测量精度,从而保障电池安全、延长寿命并增强产品竞争力。

weixin_28314575的博客 134

rabbitmq SpringBoot Demo 完美代码

rabbitmq SpringBoot Demo 完美代码@laowang rabbitmq客户端配置 代码片. #springboot整合rabbitmq的基本配置 spring.rabbitmq.addresses=127.0.0.1:5672 spring.rabbitmq.username=guest spring.rabbitmq.password=guest spring.rabbit...

BraveHeart 605

【论文阅读笔记】One Shot 3D Photography

论文主页:https://facebookresearch.github.io/one_shot_3d_photography/ 代码地址:https://github.com/facebookresearch/one_shot_3d_photography   该3D照片方向,由于刚入门,所以会倾向于翻译文章。每个操作上的选择,及为什么不进行另外操作的原因都如数放上。 论文小结   本作的工作是从单张RGB图片生成一个移动视角的3D照片。   其管道大致如下: 由RGB图像通过单目深度估计网络估计深度图

时光机 °的博客 1839

Agent Skills:AI智能体规模化落地的基础设施

摘要:AgentSkills体系已成为AI智能体落地的核心基础设施,解决了能力扩展和行业知识沉淀两大核心难题。该开放标准通过语义优先、渐进式披露等设计原则,实现了工具调用的标准化和可控化,同时支持轻量化知识沉淀。Skill作为最小能力单元,将传统软件功能、行业知识等封装为可被智能体调用的标准化模块,推动了软件产业从"工具时代"向"智能体时代"的范式变革。目前该体系已被主流Agent工具广泛兼容,形成完整生态,未来将持续演进,进一步降低落地门槛,推动AI原生转型。

技术引领业务创新 1158

rabbitmq的routingkey的作用

对于消息发布者而言它只负责把消息发布出去,甚至它也不知道消息是发到哪个queue,消息通过exchange到达queue,exchange的职责非常简单,就是一边接收发布者的消息一边把这些消息推到queue中。 而exchange是怎么知道消息应该推到哪个queue呢,这就要通过绑定queue与exchange时的routingkey了,通过代码进行绑定并且指定routingkey,下面有一张关系...

超帅哥哥的人生巅峰 7万+

零基础小白Coze知识普及【新手必备资料!!】

AI智能体|扣子(Coze)工作流搭建【零基础小白Coze知识普及】 1、领取100+工作流源码!复制到扣子即可直接使用 2、AI认知+9节商业智能体拆解 3、500+各行业高质量提示词 4、超低价格使用即梦文生图图生视频和banana生图

Zhima0522的博客 3250

rabbitmq direct 多个消费者_分布式架构核心组件之消息队列RabbitMQ

一、为什么使用消息队列1、实现解耦耦合指不同模块/系统之间相互作用、相互依赖的关系。RabbitMQ以异步的方式解耦系统间的关系,使用者将业务请求发送到Rabbit服务器,然后就可以返回了,Rabbit会确保请求被正确处理,即使遇到网络异常、Rabbit服务器崩溃等特殊场景。针对这些特殊场景,Rabbit提供了各种机制确保其可用性。2、实现异步对于大批量的用户操作,同步等待需要很长时间,利用MQ的...

weixin_39978863的博客 356

从SolidWorks到Simulink:手把手教你用URDF文件搭建六轴机械臂仿真模型(含STL文件配置避坑)

本文详细介绍了从SolidWorks到Simulink的六轴机械臂URDF仿真全流程,包括URDF文件导出、Simscape模型生成与调试、动力学参数获取与验证等关键步骤。重点解决了STL文件配置、关节接口设置等工程化难题,帮助开发者高效构建可控制的数字孪生体。通过实战案例和优化技巧,提升机械臂仿真效率与准确性。

weixin_26812607的博客 266

七步设计高频变压器

七步设计高频变压器

m0_71394959的博客 5401

Java后端常用技术选型 |(三)分布式篇

Java后端常用技术选型 |(三)分布式篇

qq_20236937的博客 1005

工商银行软件开发中心数据安全监测溯源防护体系建设成果及展望

结合业界先进溯源理念和我行管理要求,依托大数据、分布式搜索分析引擎等技术,构建PB级海量数据加工分析和小时级快速核验、检索、溯源手段(如图6所示),支撑6种客户敏感信息关键要素的单一或组合溯源,形成行之有效的数据安全溯源流程,配套落地自动化快速泄露样本真实性核验和灵活高效的溯源能力,通过数据相关属性的自动化分析,实现追踪泄露源头、明确泄露路径的目标,为有效应对数据安全事件,降低和消除风险与不良影响,开展事后追责处置工作提供体系化解决方案。提高数据排查的自动化程度和排查效率,降低人工成本。

银行信息系统应用架构详解 224

04 架构核心技术之分布式消息队列

使用异步调用的架构方法,就是使用消息队列,将生产者和消费者进行隔离。主要的架构模型有两种,一种是点对点模型,一种是发布订阅模型。其中点对点模型,一个消息只会被一个消费者消费;而发布订阅模型,一个消息可以被多个消费者订阅。消息队列实现的异步架构可以在架构上带来更多的好处。它可以实现业务逻辑的异步处理,从而获得更好性能特性;可以使系统具有更好的伸缩性;可以平衡用户访问流量,实现削峰填谷;还可以隔离失败,并进行自我修复;以及对生产者和消费者进行解耦,使系统拥有更好的扩展和维护能力。

周壮的博客 1870

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

架构核心技术之分布式消息队列

使用异步调用的架构方法,就是使用消息队列,将生产者和消费者进行隔离。主要的架构模型有两种,一种是点对点模型,一种是发布订阅模型。其中点对点模型,一个消息只会被一个消费者消费;而发布订阅模型,一个消息可以被多个消费者订阅。消息队列实现的异步架构可以在架构上带来更多的好处。它可以实现业务逻辑的异步处理,从而获得更好性能特性;可以使系统具有更好的伸缩性;可以平衡用户访问流量,实现削峰填谷;还可以隔离失败,并进行自我修复;以及对生产者和消费者进行解耦,使系统拥有更好的扩展和维护能力。

Java全能学习+面试指南 873

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

架构师的36项修炼-03架构核心技术之分布式消息队列

第五个好处,如下图所示,使用分布式消息队列,可以使生产者和消费者的代码实现解耦合,也就是说可以多个生产者发布消息,多个消费者处理消息,共同完成完整的业务处理逻辑,但是它们却不需要直接进行交互调用,没有代码的依赖耦合。消费者和生产者只需要知道消息队列的名字,生产者发送消息到消息队列中,而消息队列的另一端是多个消费者竞争消费消息,每个到达消息队列的消息只会被路由到一个消费者中去,所以消费者看到的是全部消息的一个子集。消息的消费者从消息队列中接收并处理消息,也是由应用开发者实现的,但是一个异步处理的组件。

u013699308的博客 1409

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

分布式架构核心组件之消息队列:Rabbit Mq的了解与使用

MQ(消息队列)作为现代比较流行的技术,在互联网应用平台中作为中间件,主要解决了应用解耦、异步通信、流量削锋、服务总线等问题,为实现高并发、高可用、高伸缩的企业应用提供了条件。目前市面比较流行的消息队列有ActiveMQ,RabbitMQ,ZeroMQ,Kafka,MetaMQ,RocketMQ等,而每种产品又有着独特的着重点,可根据业务需要进行选择。这里有对主流MQ的优缺点...

weixin_34259232的博客 187

Java工具08-Java消息队列:Kafka与RabbitMQ

Java消息队列:Kafka与RabbitMQ对比指南 本文全面对比了Java生态中两大主流消息队列Kafka和RabbitMQ的核心差异。Kafka是一种高吞吐量的分布式流处理平台,基于日志流模型,适合大数据场景;RabbitMQ则是灵活路由的企业级消息中间件,基于AMQP协议,适合业务解耦。 在架构设计上,Kafka采用主题/分区模型,强调批量处理和顺序存储;RabbitMQ通过交换器/队列实现多模式路由。性能方面,Kafka吞吐量更高但延迟较大,RabbitMQ延迟更低但吞吐量中等。两者在可靠性保障、

千淘万漉虽辛苦,吹尽狂沙始到金 2万+

分布式架构核心组件之消息队列

消息队列已经逐渐成为分布式应用场景、内部通信、以及秒杀等高并发业务场景的核心手段,它具有低耦合、可靠投递、广播、流量控制、最终一致性 等一系列功能。无论是 RabbitMQ、RocketMQ、ActiveMQ、Kafka还是其它等,都有的一些基本原理、术语、机制等,总结分享出来,希望大家在使用消息队列技术的时候能够快速理解。1. 消息生产者、消息者、队列消息生产者Produc...

weixin_34212762的博客 292

SigNoz消息队列:Kafka/RabbitMQ监控集成

在现代微服务架构中,消息队列(Message Queue)已成为系统解耦、异步处理和数据缓冲的核心组件。Kafka和RabbitMQ作为最流行的消息队列系统,承载着关键的业务流量。然而,消息队列的监控一直存在诸多挑战: - **消费者延迟(Consumer Lag)**:消费者处理速度跟不上生产者速度,导致消息积压 - **分区性能瓶颈**:Kafka分区负载不均衡,影响整体吞吐量 - **网络...

gitblog_00621的博客 1037

分布式消息队列(联网架构核心中间件)之研讨

       本次分享是结合网络上现有的资料和自己的一点感想,进行总结,按照下面六方面进行详细阐述: 消息、消息协议、消息队列概述 消息队列应用场景 消息中间件示例 JMS消息服务 常用消息队列 总结 一、消息、消息协议、消息队列概述         消息即是信息的载体。为了让消息发送者和消息接收者都能够明白消息所承载的信息(消息发送者需要知道如何构造消息;消息接收者需要知道如何解析...

艺术架构 1554

我与DeepSeek读《大型网站技术架构》(7)- 利用分布式消息队列降低系统耦合性

利用分布式消息队列降低系统耦合性

gdr12的专栏 894

kafka和其他消息队列的区别

摘要: Kafka与其他消息队列(RabbitMQ、RocketMQ等)的核心差异源于设计目标不同。Kafka定位为高吞吐分布式日志系统,侧重持久化存储与批量处理,通过分区扩展、顺序写磁盘和零拷贝实现百万级TPS,适配大数据流处理;而RabbitMQ等侧重即时消息投递,提供灵活路由、低延迟(微秒级)和事务支持,适合业务解耦。RocketMQ则平衡吞吐与可靠性,支持金融级场景。选型需权衡吞吐、延迟、功能(如事务/回溯)及生态适配(如Kafka整合Flink)。关键区别在于Kafka是“存储优先”,其他MQ是“

qq_52531977的博客 1046

【架构实战】消息队列选型完全指南:Kafka、RocketMQ、RabbitMQ深度对比

日志/大数据/流处理 →Kafka交易/订单/分布式事务 →RocketMQ轻量解耦/小系统 →RabbitMQ没有最好的消息队列,只有最适合的消息队列。技术选型时,不要追新,不要炫技,把业务需求吃透,再去匹配技术能力。很多系统的故障,根源不在消息队列本身,而在于对消息队列能力的误用。你们系统目前用的是什么消息队列?有没有踩过什么坑?欢迎评论区分享!个人观点,仅供参考。

分享技术应用、实践场景等,评论区开放技术难题讨论,共同成长进步。 1029
上一篇: 在Windows10中安装Docker
下一篇: Docker常用命令集锦
wangpf2011
博客等级 码龄16年 71粉丝 75原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值