RocketMQ入门5.3.2版本(基于java、SpringBoot操作)

news2025/6/8 15:41:38

一、RocketMQ概述

RocketMQ是一款由阿里巴巴于2012年开源的分布式消息中间件,旨在提供高吞吐量、高可靠性的消息传递服务。主要特点有:

  • 灵活的可扩展性

  • 海量消息堆积能力

  • 支持顺序消息

  • 支持多种消息过滤方式

  • 支持事务消息

  • 支持回溯消费

  • 支持延时消息

RocketMQ的基本概念

Producer(生产者)

负责生产消息,一般由业务系统负责。一个消息生产者会把业务应用系统里产生的消息发送到Broker服务器RocketMQ提供了3种方式发送消息:同步、异步和单向

同步发送(Sync Send)

同步发送是指消息发送方在发送一条消息后,在收到服务器返回的响应结果后才发送下一条消息。如果消息成功发送到Broker,则返回发送成功的结果;如果发送失败(如Broker宕机),则抛出异常。

适用于重要通知消息场景:重要通知邮件、金融交易和订单处理等

异步发送(Async Send)

异步发送是指消息发送方在发送一条消息后,不需要等待服务器响应即可继续发送消息。但需要Broker返回确认信息。

单向发送(One-way Send)

单向发送是指消息发送方发送一条消息后,不会等待服务器响应,也不需要Broker返回确认信息。这种方式发送消息的过程耗时非常短,常用于对可靠性要求不是很高,但对实时性要求较高的场景。

生产者组(Producer Group)

RocketMQ中一组生产者实例的集合,这些生产者实例可以共同工作以发送消息到同一个或多个主题(Topic)。

Consumer(消费者)

消息消费的角色,支持分布式集群方式部署。消费者有两种类型:拉取型和推送型支持集群方式和广播方式的消费。

拉取型消费(Pull Consumer)

在Pull模式下,消费者主动从消息中间件拉取消息。这种模式给了消费者更多的控制权,它们可以根据自己的处理能力和当前状态来决定何时拉取消息、拉取多少消息。

推动型消费(Push Consumer)

在Push模式下,消息中间件主动将消息推送到消费者(Consumer)端。一旦有消息到达,中间件会立即尝试将消息传递给消费者,而不需要消费者主动请求。

Push消费模式下,消费者首先需要注册一个消费监听器(MessageListener)。当Broker(消息服务器)有消息到达并准备好推送给消费者时,会触发这个监听器,进而开始消费消息。这种机制使得消费者无需主动向Broker请求消息,而是等待Broker将消息推送过来,从而提高了消息消费的实时性和便捷性

消费者组(Consumer Group)

是一个承载多个消费行为一致的消费者的逻辑资源分组,它并不是运行实体,而是一个用于管理和组织消费者的逻辑概念。

消息服务器(Broker)

Broker是RocketMQ中负责存储消息的核心组件。它接收生产者(Producer)发送的消息,并将其持久化到本地磁盘或分布式存储系统中,确保消息的安全性和可靠性。除了存储消息外,Broker还负责将消息转发给消费者(Consumer)。当消费者发起消息拉取请求时,Broker会根据请求中的信息(如Topic、Queue等)查找并返回相应的消息给消费者。

Master

Master节点是RocketMQ中的主节点,负责接收客户端(生产者)的写入请求,并将消息持久化到磁盘上。它是消息处理的核心,承担着主要的消息存储和转发任务。

Slave

Slave节点是RocketMQ中的从节点,它负责从Master节点复制消息数据,并保持与Master节点的同步。Slave节点不直接处理客户端的写入请求,但可以在Master节点故障时接替其工作,提供消息的读取服务。

Broker的集群部署有单Master、多Master、多Master多Slave(同步双写)、多Master多Slave(异步复制)

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

NameServer(名称服务器)

充当路由消息的提供者,生产者或消费者能够通过名字服务查找各主题相应的Broker IP列表。

NameServer是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步。

无状态

NameServer 几乎不存储任何持久化数据。它主要维护的是Broker的元数据信息,如Broker的地址、主题信息等,但这些信息是可以从Broker动态获取的,因此NameServer本身不需要进行复杂的数据同步或持久化操作。

集群部署

NameServer支持集群部署,即可以部署多个NameServer实例来提供更高的可用性和容错性。

在集群模式下,生产者和消费者可以随机选择一个或多个NameServer进行查询,这样可以分散查询负载,提高系统整体的性能和可靠性

节点间无信息同步

NameServer集群中的各个节点之间是相互独立的,它们之间不会进行任何信息的同步或通信。

每个NameServer都独立地从Broker获取最新的元数据信息,并维护自己的数据副本。这种设计简化了NameServer集群的管理和部署,同时也避免了因节点间同步导致的延迟和复杂性。

路由信息提供

生产者(Producer)和消费者(Consumer)在发送或接收消息前,会先向NameServer查询目标主题(Topic)对应的Broker列表。NameServer会返回包含Broker地址的列表,生产者和消费者随后可以根据这个列表选择具体的Broker进行消息的发送或接收。

Broker注册与发现

当Broker启动时,它会向NameServer注册自己的信息,包括地址、端口、主题列表等。NameServer会接收这些信息并更新自己的元数据,使得生产者和消费者能够发现新的Broker或Broker的变更

Topic

Topic是生产者在发送消息和消费者在拉取消息时的基本类别。它表示一类消息的集合,每个Topic都包含若干条消息,每条消息只能属于一个Topic。Topic与生产者和消费者之间的关系非常松散,一个Topic可能有0个、一个或多个生产者向其发送消息,同样,一个消费者组可以订阅一个或多个Topic,只要该组的实例保持其订阅一致即可。

Topic的主要作用包括:

  1. 消息分类:通过Topic将不同类型的消息进行区分,便于管理和消费。
  2. 消息路由:生产者发送消息时,会根据Topic将消息路由到相应的Broker上。
  3. 负载均衡:在消费者组中,通过Topic实现消息的负载均衡,使得消息能够均匀地被多个消费者处理。

Tag

Tag是消息的二级分类,可以看作是Topic下的子主题。它为用户提供了额外的灵活性,使得来自同一业务模块的具有不同目的的消息可以具有相同的Topic和不同的Tag。Tag有助于保持代码的清晰和连贯,同时方便RocketMQ提供的查询功能。

Tag的主要作用包括

  1. 消息细分:在同一Topic下,通过Tag对消息进行进一步细分,使得消费者可以根据需要接收特定类型的消息。
  2. 消费过滤:消费者可以指定Tag来接收特定类型的消息,或者使用通配符(如*)来接收该Topic下的所有消息。提高消息处理效率:通过合理使用Tag,可以减少消费者处理不必要消息的开销,提高消息处理的效率。

Topic与Tag的关系

层级关系:Topic是消息的一级分类,而Tag是消息的二级分类。它们共同构成了消息系统的分类体系。

互补关系:Topic和Tag在消息分类上起到互补作用。Topic用于区分不同类型的消息,而Tag则用于在同一Topic下进一步区分不同目的的消息。

在这里插入图片描述

队列

RocketMQ的队列是消息存储和传输的实际容器,也是RocketMQ消息的最小存储单元。

在这里插入图片描述

集群消费模式

同一个消费者组(Consumer Group)中的多个消费者实例会共同分担同一个主题(Topic)下的消息。RocketMQ会将消息分发给不同的消费者实例,但保证同一条消息只会被该消费者组中的一个消费者消费

在这里插入图片描述

特点

  1. 负载均衡:自动实现消息的负载均衡,提高消息处理效率和吞吐量。
  2. 容错性:如果一个消费者实例出现故障,其他实例可以继续处理消息,保证消息不会丢失。
  3. 消费进度管理:消费进度(即已消费消息的偏移量)会被存储在Broker端,以便在消费者重启后能够从上次消费的位置继续处理消息。

广播消费

同一个消费者组中的每个消费者实例都会收到订阅主题下的每一条消息的一个副本。即每条消息都会被发送到该消费者组中的所有消费者实例上,且每个消费者实例都会独立地消费这条消息。

在这里插入图片描述

特点

  1. 消息广播:每条消息都会被发送到所有消费者实例,确保消息被每个消费者都接收到。
  2. 无消费进度管理:在广播模式下,消费进度不需要被存储和共享,因为每个消费者实例都会消费到完整的消息集合。
  3. 无重试机制:如果消费者消费消息失败,RocketMQ在广播模式下不会自动重试,需要业务方自行处理。

并发消费

特点

并发消费是指多个消费者实例同时处理消息,每个实例独立地处理一部分消息。

多个消费者实例可以并发地处理来自同一个主题和标签的消息,提高了消息处理的并发度。

顺序消费

RocketMQ 保证在同一个消息队列(Message Queue)中的消息按照发送的顺序被消费。

特点

顺序消费是指消息按照一定的顺序进行处理,同一个消息队列上的消息按照发送顺序和消费顺序进行处理。顺序消费通常需要保证同一消息队列上只有一个消费者实例处理消息,以确保消息的顺序性。

二、RocketMQ应用

2.1 RocketMQ安装和配置

下载地址https://rocketmq.apache.org/download

在这里插入图片描述

解压

在这里插入图片描述

配置环境变量

在这里插入图片描述

启动nameservver服务

进入安装目录下的bin目录下,执行如下命令

start mqnamesrv.cmd

启动成功效果

启动broker服务

在bin目录下,执行如下命令

start mqbroker.cmd -n 127.0.0.1:9876 autoCreateTopicEnable=true

2.2 java访问Rocketmq工程

配置依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-client</artifactId>
    <version>5.3.2</version>
</dependency>

创建消息生产者

public class Producer {
    public static void main(String[] args) throws Exception {
        // 创建一个消息生产者,并设置一个消息生产者组
        DefaultMQProducer producer = new DefaultMQProducer("producer_group");

        // 消息发送失败重试次数
        producer.setRetryTimesWhenSendFailed(3);
        // 消息没有存储成功是否发送到另外一个broker
        producer.setRetryAnotherBrokerWhenNotStoreOK(true);

        // 指定 NameServer 地址
        producer.setNamesrvAddr("localhost:9876");

        // 初始化 Producer,整个应用生命周期内只需要初始化一次
        producer.start();

        // 以下代码是示例,用于发送一条消息
        try {
            for (int i = 0; i < 100; i++) {
                // 创建消息实例,指定主题、标签和消息体
                Message msg = new Message(
                        "TopicTest",// topic
                        "TagA",//  tag
                        ("Hello RocketMQ " + i).getBytes(RemotingHelper.DEFAULT_CHARSET));
                //  设置消息持久化
                msg.setWaitStoreMsgOK(true);
                // 发送消息
                SendResult sendResult = producer.send(msg);
                System.out.printf("%s%n", sendResult);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            // 关闭生产者
            producer.shutdown();
        }
    }
}

创建消息消费者

public class Consumer {

    public static void main(String[] args) throws Exception {
        // 创建一个消息消费者,并设置一个消息消费者组
        DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("consumer_group");

        // 指定 NameServer 地址
        consumer.setNamesrvAddr("localhost:9876");

        // 设置Consumer第一次启动是从队列头部开始消费还是队列尾部开始消费
        consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_FIRST_OFFSET);

        // 订阅指定 Topic 下的所有消息
        consumer.subscribe("TopicTest", "*");
        consumer.setMessageModel(MessageModel.BROADCASTING); // 广播消费

        // 注册消息监听器
        consumer.registerMessageListener((List<MessageExt> list, ConsumeConcurrentlyContext context) -> {
            // 默认 list 里只有一条消息,可以通过设置参数来批量接收消息
             System.out.println("Receive New Messages: " + list.size());
            if (list != null) {
                for (MessageExt ext : list) {
                    try {
                        System.out.println(new Date() + " " + new String(ext.getBody(), "UTF-8"));
                    } catch (UnsupportedEncodingException e) {
                        e.printStackTrace();
                    }
                }
            }
            return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
        });

        // 消费者对象在使用之前必须要调用 start 初始化
        consumer.start();
        System.out.println("消息消费者已启动");
    }
}

consumer.setConsumeFromWhere(ConsumeFromWhere.CONSUME_FROM_LAST_OFFSET);

  1. CONSUME_FROM_FIRST_OFFSET:初次从消息队列头部开始消费,即历史消息(还存在broker的),全部消费一遍,后续再启动接着上次消费的进度开始消费
  2. CONSUME_FROM_LAST_OFFSET:默认策略,初次从该队列最尾开始消费,即跳过历史消息,后续再启动接着上次消费的进度开始消费
  3. CONSUME_FROM_TIMESTAMP:从某个时间点开始消费,默认是半个小时以前,后续再启动着上次消费的进度开始消费

2.3 Spring Boot集成Rocketmq

第一步,引入依赖,完整pom如下

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>3.4.1</version>
        <relativePath/> <!-- lookup parent in repository -->
    </parent>
    <artifactId>spring_boot_rocketmq_demo</artifactId>
    <packaging>jar</packaging>
    <name>spring_boot_rocketmq_demo Maven Webapp</name>
    <dependencies>
        <!-- Spring Boot Starter -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <!-- RocketMQ Spring Boot Starter -->
        <dependency>
            <groupId>org.apache.rocketmq</groupId>
            <artifactId>rocketmq-spring-boot-starter</artifactId>
            <version>2.3.2</version>
        </dependency>
    </dependencies>
    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
            </plugin>
        </plugins>
    </build>
</project>

第二步,在resources下编写application.yml

rocketmq:
  producer:
    group: my-group
  name-server: localhost:9876

第三步,编写生产者

@Service
public class MessageProducer {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendMessage(String topic, String message) {
        rocketMQTemplate.convertAndSend(topic, message);
    }
    @PostConstruct
     public void init() {
        sendMessage("my-topic", "Hello, RocketMQ!");
    }
}

第四步,编写消费者

@Service
@RocketMQMessageListener(topic = "my-topic", consumerGroup = "my-group" )
public class MessageConsumer implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        System.out.println("接收到消息: " + message);
    }
}

第五步,编写启动类

@SpringBootApplication
public class RocketMQApplication {

    public static void main(String[] args) {
        SpringApplication.run(RocketMQApplication.class, args);

    }
}

2.4 Rocketmq的顺序消息消费

顺序消费者配置

顺序消息消费者:RocketMQ提供了顺序消息消费者(Orderly Message Consumer),通过指定消费模式为Orderly,可以确保消息按照发送的顺序进行消费。

消费者配置:在消费者端,需要配置为顺序消费者,并确保每个队列只由一个消费者线程消费。这通常是通过设置消费者组的实例数量与Topic的消息队列数量相等来实现的,即每个消费者实例对应一个消息队列。

消息消费控制

单线程消费:在顺序消费者模式下,RocketMQ会保证同一个队列中的消息按照发送的顺序被同一个消费者线程顺序消费。这意味着在消费过程中,前一个消息被完全处理之前,后一个消息不会被消费。

消费状态管理:RocketMQ通过维护消费进度(Consume Offset)来跟踪每个队列的消费情况,确保消息按顺序被消费且不会丢失。

使用spring boot开发顺序消息

第一步,建立生产者,使用syncSendOrderly发送顺序消息

@Service
public class MessageProducer_order {

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    public void sendMessage(String topic, String message) {
        rocketMQTemplate.syncSendOrderly(topic, message, "order-key");
    }
    @PostConstruct
     public void init() {
        for (int i = 0; i < 100; i++) {
            sendMessage("my-topic-order", "Hello, RocketMQ-order!" + i);
        }
    }
}

第二步,建立消费者,设置consumeMode = ConsumeMode.ORDERLY顺序消费

@Service
@RocketMQMessageListener(
        topic = "my-topic-order",
        consumerGroup = "my-group-order",
        consumeMode = ConsumeMode.ORDERLY
)
public class MessageConsumer_order implements RocketMQListener<String> {

    @Override
    public void onMessage(String message) {
        System.out.println("接收到消息: " + message);
    }
}

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

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

相关文章

使用osqp求解简单二次规划问题

文章目录 一、问题描述二、数学推导1. 目标函数处理2. 约束条件处理 三、代码编写 一、问题描述 已知&#xff1a; m i n ( x 1 − 1 ) 2 ( x 2 − 2 ) 2 s . t . 0 ⩽ x 1 ⩽ 1.5 , 1 ⩽ x 2 ⩽ 2.5 min(x_1-1)^2(x_2-2)^2 \qquad s.t. \ \ 0 \leqslant x_1 \leqslant 1.5,…

【C语言】通用统计数据结构及其更新函数(最值、变化量、总和、平均数、方差等)

【C语言】通用统计数据结构及其更新函数&#xff08;最值、变化量、总和、平均数、方差等&#xff09; 更新以gitee为准&#xff1a; gitee 文章目录 通用统计数据结构更新函数附录&#xff1a;压缩字符串、大小端格式转换压缩字符串浮点数压缩Packed-ASCII字符串 大小端转换什…

Spring AI(10)——STUDIO传输的MCP服务端

Spring AI MCP&#xff08;模型上下文协议&#xff09;服务器Starters提供了在 Spring Boot 应用程序中设置 MCP 服务器的自动配置。它支持将 MCP 服务器功能与 Spring Boot 的自动配置系统无缝集成。 本文主要演示支持STDIO传输的MCP服务器 仅支持STDIO传输的MCP服务器 导入j…

Sklearn 机器学习 缺失值处理 填充数据列的缺失值

💖亲爱的技术爱好者们,热烈欢迎来到 Kant2048 的博客!我是 Thomas Kant,很开心能在CSDN上与你们相遇~💖 本博客的精华专栏: 【自动化测试】 【测试经验】 【人工智能】 【Python】 💡使用 Scikit-learn 处理数据缺失值的完整指南 在机器学习项目中,数据缺失是不可避…

猜字符位置游戏-position gasses

import java.util.*;public class Main {/*字符猜位置游戏;每次提交只能被告知答对几个位置;根据提示答对的位置数推测出每个字符对应的正确位置;*/public static void main(String[] args) {char startChar A;int gameLength 8;List<String> ballList new ArrayList&…

宝塔安装配置FRP

FRP&#xff08;Fast Reverse Proxy&#xff09;作为一款高性能的反向代理应用&#xff0c;能够帮助我们轻松实现内网穿透&#xff0c;将内网服务暴露到公网&#xff0c;满足远程访问、开发调试等多种需求。宝塔面板以其简洁易用的界面和强大的功能&#xff0c;成为众多站长和开…

元器件基础学习笔记——结型场效应晶体管 (JFET)

场效应晶体管&#xff08;Field Effect Transistor&#xff0c;FET&#xff09;简称场效应管&#xff0c;是一种三端子半导体器件&#xff0c;它根据施加到其其中一个端子的电场来控制电流的流动。与双极结型晶体管 &#xff08;BJT&#xff09; 不同&#xff0c;场效应晶体管 …

tableau 实战工作场景常用函数与LOD表达式的应用详解

这是tableau实战工作场景图表制作第七期--常用函数与LOD表达式的应用 数据资源已经与这篇博客捆绑&#xff0c;有需要者可以下载通过网盘分享的文件&#xff1a;3.2-8月成交数据.xlsx等3个文件 链接: https://pan.baidu.com/s/17WtUoZTqzoNo5kTFjua4hw?pwd0623 提取码: 06…

《PyTorch:开启深度学习新世界的魔法之门》

一、遇见 PyTorch:深度学习框架新星登场 在当今的技术领域中,深度学习已然成为推动人工智能发展的核心动力,而深度学习框架则是这场技术革命中的关键工具。在众多深度学习框架里,PyTorch 以其独特的魅力和强大的功能,迅速崛起并占据了重要的地位,吸引着无数开发者和研究者…

分布式光纤传感(DAS)技术应用解析:从原理到落地场景

近年来&#xff0c;分布式光纤传感&#xff08;Distributed Acoustic Sensing&#xff0c;DAS&#xff09;技术正悄然改变着众多传统行业的感知方式。它将普通的通信光缆转化为一个长距离、连续分布的“听觉传感器”&#xff0c;对振动、声音等信号实现高精度、高灵敏度的监测。…

Spring事务回滚在系统中的应用

以文章发布为例&#xff0c;介绍Spring事务回滚在系统中的应用 事务回滚的核心概念 事务回滚是数据库管理系统中的关键机制&#xff0c;它确保数据库操作要么全部成功&#xff0c;要么全部失败。在Spring框架中&#xff0c;我们可以通过Transactional注解轻松实现事务管理。 …

ASP.NET Core使用Quartz部署到IIS资源自动被回收解决方案

iis自动回收的原因 回收机制默认配置&#xff0c;间隔时间是1740分钟&#xff0c;意思是&#xff1a;默认情况下每1740分钟(29小时)回收一次&#xff0c;定期检查应用程序池中的工作进程&#xff0c;并终止那些已经存在很长时间或已经使用了太多资源的工作进程 进程模型默认配…

调用.net DLL让CANoe自动识别串口号

1.前言 CANoe9.0用CAPL控制数控电源_canoe读取程控电源电流值-CSDN博客 之前做CAPL通过串口控制数控电源&#xff0c;存在一个缺点&#xff1a;更换电脑需要改串口号 CSDN上有类似的博客&#xff0c;不过要收费&#xff0c;本文根据VID和PID来自动获取串口号&#xff0c;代码…

算法(蓝桥杯学习C/C++版)

up: 溶金落梧桐 溶金落梧桐的个人空间-溶金落梧桐个人主页-哔哩哔哩视频 蓝桥杯三十天冲刺系列 BV18eQkY3EtP 网站&#xff1a; OI Wiki OI Wiki - OI Wiki 注意 比赛时&#xff0c;devc勾选c11&#xff08;必看&#xff09; 必须勾选c11一共有两个方法&#xff0c;任用…

Docker镜像无法拉取问题解决办法

最近再学习RabbitMQ&#xff0c;需要从Docker镜像中拉取rabbitMQ&#xff0c;但是下拉失败 总的来说就是无法和docker镜像远程仓库建立连接 我又去尝试ping docker.io发现根本没有反应&#xff0c;还是无法连接找了许多办法还是没有办法解决&#xff0c;最后才发现是镜像问题&a…

ZephyrOS 嵌入式开发Black Pill V1.2之Debug调试器

版本和环境信息如下&#xff1a; PC平台&#xff1a; Windows 11 专业版 Zephyr开发环境&#xff1a;v4.1.0 Windows 下搭建 Zephyr 开发环境 WeAct BlackPill V1.2开发板&#xff1a; WeAct STM32F411CEU6 BlackPill 核心板 Debug调试器&#xff1a; ST-LINK V2: ST-LINK V2 S…

服务器磁盘空间被Docker容器日志占满处理方法

事发场景&#xff1a; 原本正常的服务停止运行了&#xff0c;查看时MQTT服务链接失败&#xff0c;查看对应的容器服务发现是EMQX镜像停止运行了&#xff0c;重启也是也报错无法正常运行&#xff0c;报错如下图&#xff1a; 报错日志中连续出现两个"no space left on devi…

c++学习-this指针

1.基本概念 非静态成员函数都会默认传递this指针&#xff08;静态成员函数属于类本身&#xff0c;不属于某个实例对象&#xff09;&#xff0c;方便访问对象对类成员变量和 成员函数。 2.基本使用 编译器实际处理类成员函数&#xff0c;this是第一个隐藏的参数&#xff0c;类…

交易所系统攻坚:高并发撮合引擎与合规化金融架构设计

交易所系统攻坚&#xff1a;高并发撮合引擎与合规化金融架构设计 ——2025年数字资产交易平台的性能与合规双轮驱动 一、高并发撮合引擎&#xff1a;从微秒级延迟到百万TPS 核心架构设计 订单簿优化&#xff1a;数据结构创新&#xff1a;基于红黑树与链表混合存储&#xff0c…

OpenCV计算机视觉实战(10)——形态学操作详解

OpenCV计算机视觉实战&#xff08;10&#xff09;——形态学操作详解 0. 前言1. 腐蚀与膨胀1.1 为什么要做腐蚀与膨胀1.2 OpenCV 实现 2. 开运算与闭运算2.1 开运算与闭运算原理2.2 OpenCV 实现 3. 形态学梯度与骨架提取3.1 形态学梯度3.2 骨架提取 小结系列链接 0. 前言 形态…