RocketMQ的进阶问题

消息队列RocketMQ入门实践(二) 上一篇文章中我们介绍了RocketMQ的相关概念,以及安装部署。 今天我们就来具体操作一下,在代码里面如何实现发送消息,消费消息。 阅读详情

重试队列 死信队列 是不是自动进的 ?

在@RocketMQMessageListener注解方式下实现‌多消费者多线程顺序消费‌,需结合ConsumeMode.ORDERLY模式与自定义线程池控制。以下是完整方案:


‌1. 核心逻辑‌

  • ‌顺序消费‌:通过ConsumeMode.ORDERLY保证同一队列(MessageQueue)的消息按顺序处理。
  • ‌多消费者‌:部署多个相同consumerGroup的实例(不同JVM进程),RocketMQ会自动分配队列。
  • ‌线程池控制‌:每个消费者实例内部使用单线程处理单个队列,避免多线程破坏顺序性。

‌2. 完整代码实现


@Component
@RocketMQMessageListener(
    topic = "OrderlyTopic",
    consumerGroup = "orderly-group",
    consumeMode = ConsumeMode.ORDERLY,  // 关键:顺序模式
    consumeThreadMax = 1,  // 每个队列单线程处理
    messageModel = MessageModel.CLUSTERING  // 集群模式(多实例负载均衡)
)
public class OrderlyConsumer implements RocketMQListener<MessageExt> {
    private final Logger logger = LoggerFactory.getLogger(getClass());

    @Override
    public void onMessage(MessageExt message) {
        try {
            String queueId = String.valueOf(message.getQueueId());
            String body = new String(message.getBody(), StandardCharsets.UTF_8);
            
            // 模拟业务处理(同一队列的消息严格顺序执行)
            logger.info("队列ID: {} | 消息: {}", queueId, body);
            Thread.sleep(100);  // 模拟处理耗时
            
        } catch (Exception e) {
            logger.error("消费失败,触发重试", e);
            throw new RuntimeException(e);  // 抛出异常会触发顺序重试
        }
    }
}

3. 部署与验证‌

  1. ‌多实例部署‌:将上述服务打包后,启动多个实例(如通过K8s或Docker)。
  2. ‌队列分配验证‌:观察日志输出,确认不同队列的消息由不同实例处理,且同一队列的消息顺序执行。

ack手动提交自动提交哪个好? 因为springboot是正常返回就自动ack,这点不能改变,只能通过控制抛异常还是返回来实现手动ack效果,肯定是手动ack好,不会丢失数据,代码如下:


import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyStatus;
import org.apache.rocketmq.common.message.MessageExt;
import org.springframework.stereotype.Component;

@Component
@RocketMQMessageListener(
    topic = "ManualAckTopic",
    consumerGroup = "manual-ack-group",
    consumeMode = ConsumeMode.CONCURRENTLY  // 并发消费模式
)
public class ManualAckConsumer implements RocketMQListener<MessageExt> {

    @Override
    public void onMessage(MessageExt message) {
        try {
            // 1. 业务处理逻辑
            String body = new String(message.getBody());
            System.out.println("收到消息: " + body);

            // 2. 模拟手动ACK条件判断
            if (businessProcessSuccess(body)) {
                // 业务成功:等效于手动提交ACK
                System.out.println("消息处理成功,提交ACK");
                // 实际无需显式调用,正常返回即自动ACK
            } else {
                // 业务失败:强制触发重试(等效于不ACK)
                throw new RuntimeException("业务处理失败,触发重试");
            }
        } catch (Exception e) {
            // 3. 异常时触发重试(等效于NACK)
            System.out.println("消费异常,消息将重试: " + e.getMessage());
            throw e; // 抛出异常会触发重试
        }
    }

    private boolean businessProcessSuccess(String message) {
        // 模拟业务逻辑校验
        return !message.contains("force_retry");
    }
}

consumeMode = ConsumeMode.CONCURRENTLY指定了并发模式,会创建多少个消费者实例

在@RocketMQMessageListener注解中指定ConsumeMode.CONCURRENTLY并发模式时,‌默认情况下只会创建1个消费者实例‌,但会通过多线程实现消息的并发处理。以下是关键细节:


‌1. 消费者实例与线程的关系‌

‌配置项‌‌说明‌
‌消费者实例数量‌固定为1个(由consumerGroup唯一标识)
‌并发线程数‌由consumeThreadMax参数控制(默认20线程)
‌消息处理方式‌单实例多线程并发消费,线程间共享TCP连接

‌2. 验证方式‌

可通过以下代码观察线程行为(需在消费逻辑中打印线程ID):


javaCopy Code

@Component @RocketMQMessageListener( topic = "TestTopic", consumerGroup = "test-group", consumeMode = ConsumeMode.CONCURRENTLY, consumeThreadMax = 10 // 显式设置并发线程数 ) public class ConcurrentConsumer implements RocketMQListener<String> { @Override public void onMessage(String message) { System.out.println("线程ID: " + Thread.currentThread().getId() + " 处理消息: " + message); } }


‌3. 扩展控制‌

若需真正多实例消费(如水平扩展)‌消费者实例数 ≤ 队列数‌:避免队列被多个实例竞争导致顺序混乱。需通过以下方式实现:

  • ‌独立部署‌:在不同JVM进程中启动相同consumerGroup的消费者(RocketMQ会自动负载均衡)
  • ‌动态调整‌:通过setConsumeThreadMax()方法运行时修改线程数(需继承DefaultRocketMQListenerContainer)

‌4. 与顺序消费对比‌

‌模式‌CONCURRENTLYORDERLY
实例数量1个1个
线程行为多线程并行处理单线程按队列顺序处理
适用场景无顺序要求的业务需严格顺序的场景(如订单状态变更)

1. 队列分布与顺序消费原理‌

‌机制‌‌说明‌
‌队列分布‌一个Topic的多个队列均匀分布在集群的不同Broker节点上(如4队列3节点)
‌顺序性保证‌同一队列的消息严格由同一消费者实例的‌单线程‌处理
‌负载均衡‌不同队列可被不同消费者实例并行消费(队列间并行,队列内串行)

‌2. 顺序消费实现关键点‌

(1)Broker端保证
  • ‌队列独占‌:每个队列在Broker上以顺序写盘(CommitLog)存储,确保物理顺序。
  • ‌同步复制‌:主从节点间通过同步复制(SYNC_MASTER)保证消息顺序不丢失。
(2)消费者端配置

javaCopy Code

@RocketMQMessageListener( topic = "OrderlyTopic", consumerGroup = "orderly-group", consumeMode = ConsumeMode.ORDERLY, // 关键配置 messageModel = MessageModel.CLUSTERING, consumeThreadMax = 1 // 每个队列单线程消费 ) public class OrderlyConsumer implements RocketMQListener<MessageExt> { @Override public void onMessage(MessageExt message) { // 同一队列的消息严格按顺序执行 System.out.println("队列ID:" + message.getQueueId() + " 消息:" + new String(message.getBody())); } }

(3)部署要求
  • ‌消费者实例数 ≤ 队列数‌:避免队列被多个实例竞争导致顺序混乱。
  • ‌异常处理‌:消费失败时抛出异常,RocketMQ会自动按顺序重试(同一队列的消息会阻塞直到当前消息处理完成)。

‌3. 多节点下的顺序流程示例‌

  1. ‌生产者发送‌:消息按ShardingKey(如订单ID)哈希到特定队列。
  2. ‌Broker存储‌:队列3的消息始终写入Broker-A的队列3。
  3. ‌消费者分配‌:消费者实例1独占队列3,单线程顺序处理消息。

‌4. 注意事项‌

  • ‌并行度限制‌:顺序消费的吞吐量受队列数量限制(可通过增加队列数提升)。
  • ‌严格顺序场景‌:如金融交易,需配合业务幂等设计。

在实际生产中,mq集群如何保证消费的严格有序?

在RocketMQ集群环境下,一个Topic的队列(MessageQueue)会分布在多个Broker节点上,但‌单个队列只会存在于一个主节点‌(Master)。顺序消费的保证机制如下:


‌1. 队列分布与顺序消费原理‌

‌机制‌‌说明‌
‌队列分布‌一个Topic的多个队列均匀分布在集群的不同Broker节点上(如4队列3节点)
‌顺序性保证‌同一队列的消息严格由同一消费者实例的‌单线程‌处理
‌负载均衡‌不同队列可被不同消费者实例并行消费(队列间并行,队列内串行)

‌2. 顺序消费实现关键点‌

(1)Broker端保证
  • ‌队列独占‌:每个队列在Broker上以顺序写盘(CommitLog)存储,确保物理顺序。
  • ‌同步复制‌:主从节点间通过同步复制(SYNC_MASTER)保证消息顺序不丢失。
(2)消费者端配置

javaCopy Code

@RocketMQMessageListener( topic = "OrderlyTopic", consumerGroup = "orderly-group", consumeMode = ConsumeMode.ORDERLY, // 关键配置 messageModel = MessageModel.CLUSTERING, consumeThreadMax = 1 // 每个队列单线程消费 ) public class OrderlyConsumer implements RocketMQListener<MessageExt> { @Override public void onMessage(MessageExt message) { // 同一队列的消息严格按顺序执行 System.out.println("队列ID:" + message.getQueueId() + " 消息:" + new String(message.getBody())); } }

(3)部署要求
  • ‌消费者实例数 ≤ 队列数‌:避免队列被多个实例竞争导致顺序混乱。
  • ‌异常处理‌:消费失败时抛出异常,RocketMQ会自动按顺序重试(同一队列的消息会阻塞直到当前消息处理完成)。

‌3. 多节点下的顺序流程示例‌

  1. ‌生产者发送‌:消息按ShardingKey(如订单ID)哈希到特定队列。
  2. ‌Broker存储‌:队列3的消息始终写入Broker-A的队列3。
  3. ‌消费者分配‌:消费者实例1独占队列3,单线程顺序处理消息。

‌4. 注意事项‌

  • ‌并行度限制‌:顺序消费的吞吐量受队列数量限制(可通过增加队列数提升)。
  • ‌严格顺序场景‌:如金融交易,需配合业务幂等设计。

一个Topic的多个队列均匀分布在集群的不同Broker节点上(如4队列3节点),是不是每个broker上队列的内容都是一致的?

DeepSeek-R1 回答完成

在RocketMQ集群中,‌一个Topic的多个队列分布在不同的Broker节点上,但每个Broker上的队列内容是不一致的‌。以下是关键逻辑:


‌1. 队列内容分布规则‌

‌场景‌‌说明‌
‌队列分布‌每个队列(如Queue0、Queue1)仅存在于一个主Broker节点,内容独立
‌消息路由‌生产者根据消息的ShardingKey(如订单ID)哈希到特定队列,不同队列存储不同消息
‌副本同步‌从节点(Slave)会复制主节点队列数据,但主从节点间是同一队列的副本,内容一致

‌2. 为什么内容不一致?‌

  • ‌队列是并行单元‌:每个队列独立存储不同消息(如Queue0存订单A,Queue1存订单B)。
  • ‌负载均衡设计‌:通过多队列分布实现横向扩展,避免单节点瓶颈。

‌3. 顺序消费如何保证?‌

  • ‌队列内顺序‌:同一队列的消息由单线程顺序处理(ConsumeMode.ORDERLY)。
  • ‌队列间并行‌:不同队列的消息可被不同消费者并行处理,互不影响。

‌4. 示例说明‌

假设Topic有4个队列(0-3),3个Broker节点:


textCopy Code

Broker-A: Queue0 (存订单A1, A2, A3...) Broker-B: Queue1 (存订单B1, B2, B3...) Broker-C: Queue2, Queue3 (存其他订单)

  • ‌顺序性‌:订单A1→A2→A3在Queue0上严格顺序消费。
  • ‌不一致性‌:Queue0和Queue1的内容完全不同。

在RocketMQ集群中,‌一个Topic的多个队列分布在不同的Broker节点上,但每个Broker上的队列内容是不一致的‌,这个时候要保证消费者对这个topic是严格有序的,怎么做

DeepSeek-R1 回答完成

在RocketMQ集群中,若需保证‌整个Topic的严格全局顺序消费‌(所有消息按发送顺序处理),需结合‌单队列顺序性‌和‌业务层协调‌。以下是完整方案:


‌1. 核心限制与妥协‌

  • ‌RocketMQ原生限制‌:仅支持‌单队列顺序消费‌(ConsumeMode.ORDERLY),无法跨队列全局有序。
  • ‌妥协方案‌:通过‌单队列+业务层排序‌实现伪全局有序(需权衡性能)。

‌2. 实现方案‌

‌方案一:单队列强制全局有序(性能最低)‌

javaCopy Code

@RocketMQMessageListener( topic = "GlobalOrderTopic", consumerGroup = "global-order-group", consumeMode = ConsumeMode.ORDERLY, consumeThreadMax = 1, // 单线程消费唯一队列 messageModel = MessageModel.CLUSTERING ) public class GlobalOrderConsumer implements RocketMQListener<MessageExt> { @Override public void onMessage(MessageExt message) { // 所有消息强制发到Queue0,全局顺序消费 System.out.println("严格顺序: " + new String(message.getBody())); } }

‌特点‌:

  • Topic仅设置‌1个队列‌,所有消息发到同一队列。
  • 缺点:完全丧失并行能力,吞吐量极低。

‌方案二:业务层分片排序(推荐折中方案)‌

javaCopy Code

// 生产者:按业务ID哈希到同一队列(如订单ID) DefaultMQProducer producer = new DefaultMQProducer("producer-group"); producer.start(); Message msg = new Message("OrderTopic", "OrderTag", orderId.getBytes(StandardCharsets.UTF_8), // 业务ID作为ShardingKey ("订单数据:" + orderId).getBytes()); // 相同orderId的消息会进入同一队列 producer.send(msg, (mqs, msg, arg) -> { String key = (String) arg; return mqs.get(Math.abs(key.hashCode()) % mqs.size()); }, orderId); // 消费者:按队列顺序处理 @RocketMQMessageListener( topic = "OrderTopic", consumerGroup = "order-group", consumeMode = ConsumeMode.ORDERLY, consumeThreadMax = 1 // 每个队列单线程 ) public class OrderConsumer implements RocketMQListener<MessageExt> { @Override public void onMessage(MessageExt message) { // 同一订单ID的消息严格顺序处理 System.out.println("订单ID-" + message.getKeys() + ": " + new String(message.getBody())); } }

‌特点‌:

  • ‌业务分片有序‌:相同业务ID(如订单ID)的消息哈希到同一队列,保证局部有序。
  • ‌并行能力‌:不同业务ID的消息可并行处理。

‌3. 严格全局有序的替代方案‌

若必须实现跨队列全局有序,需引入外部协调:

  1. ‌单写单消费‌:所有消息写入一个队列(牺牲扩展性)。
  2. ‌外部时序数据库‌:生产者附加全局递增序号,消费者按序号排序处理(如Apache Pulsar的Key_Shared模式)。
  3. ‌分布式锁‌:消费者处理前获取全局锁,严重降低性能。

‌4. 最佳实践建议‌

  • ‌优先业务分片有序‌:99%的场景无需全局有序,只需保证关键业务ID(如订单)有序。
  • ‌监控队列热点‌:避免单一业务ID流量倾斜导致队列负载不均。

拓展一下

在分布式系统中,‌严格的消息顺序消费‌通常是针对特定业务场景的需求,而非整个系统。以下是RocketMQ中需要严格控制消费顺序的典型业务场景及实现原理:


‌1. 金融交易场景‌

‌场景案例:证券交易‌
  • ‌顺序要求‌:委托下单 → 撮合 → 成交确认
  • ‌乱序风险‌:若成交确认先于委托下单被处理,系统会认为无效交易
  • ‌解决方案‌:
    
    

    javaCopy Code

    // 按股东账户ID分片到同一队列 Message msg = new Message("StockTrade", accountId.getBytes(), // 关键:账户ID作为ShardingKey ("委托单:" + orderNo).getBytes());

‌场景案例:转账操作‌
  • ‌顺序要求‌:扣减A账户 → 增加B账户
  • ‌乱序风险‌:若先增加B账户再扣减A账户,会导致资金凭空产生
  • ‌关键点‌:同一事务ID的消息需顺序处理

‌2. 电商核心链路‌

‌场景案例:订单状态流转‌

mermaidCopy Code

graph LR A[下单] --> B[支付] B --> C[发货] C --> D[确认收货]

  • ‌乱序后果‌:若发货消息早于支付消息,会导致未付款订单被发出
  • ‌实现方案‌:
    
    

    javaCopy Code

    // 生产者:按订单ID哈希 producer.send(msg, (queues, msg, arg) -> { String orderId = (String)arg; int index = orderId.hashCode() % queues.size(); return queues.get(Math.abs(index)); }, orderId); // 相同订单ID进入同队列

‌场景案例:库存扣减‌
  • ‌顺序要求‌:
    1. 预占库存 → 2. 支付成功扣减库存
    2. 支付失败释放库存
  • ‌乱序风险‌:若释放库存先于预占库存,会导致超卖

‌3. 分布式事务场景‌

‌场景案例: Saga事务补偿‌

mermaidCopy Code

sequenceDiagram participant A as 服务A participant MQ as RocketMQ participant B as 服务B A->>MQ: T1-服务A执行 MQ->>B: T2-服务B执行 B-->>MQ: T2执行失败 MQ->>A: T1补偿操作 // 必须保证补偿在正向操作之后!

  • ‌顺序要求‌:正向操作消息必须先于补偿消息被消费
  • ‌解决方案‌:使用同一事务ID作为ShardingKey

‌4. 数据同步场景‌

‌场景案例:MySQL→Elasticsearch同步‌
  • ‌操作序列‌:
    INSERT → UPDATE → DELETE
  • ‌乱序后果‌:若DELETE先于INSERT执行,导致数据丢失
  • ‌关键设计‌:
    
    

    sqlCopy Code

    /* 生产者捕获Binlog时附加主键 */ message.putUserProperty("row_id", row.getPrimaryKey());

‌场景案例:缓存更新‌
  • ‌顺序要求‌:DB更新 → 缓存失效
  • ‌乱序风险‌:缓存先失效后DB更新,导致脏读

‌5. 物联网时序数据‌

‌场景案例:设备控制指令‌
  • ‌顺序要求‌:
    1. 启动设备 → 2. 设置参数 → 3. 开始运行
  • ‌乱序后果‌:若先发送"开始运行"再"启动设备",导致指令失效
  • ‌路由策略‌:按设备ID分片到同队列

‌顺序消费实现关键点‌

  1. ‌生产者路由‌:

    
    

    javaCopy Code

    // 关键代码:相同ShardingKey到同队列 SendResult sendResult = producer.send(msg, new MessageQueueSelector() { @Override public MessageQueue select(List<MessageQueue> queues, Message msg, Object arg) { String shardingKey = (String) arg; int index = Math.abs(shardingKey.hashCode()) % queues.size(); return queues.get(index); } }, "业务ID" // 如订单ID/设备ID );

  2. ‌消费者配置‌:

    
    

    javaCopy Code

    @RocketMQMessageListener( consumeMode = ConsumeMode.ORDERLY, // 顺序消费模式 consumeThreadMax = 1, // 单线程消费队列 messageModel = MessageModel.CLUSTERING )

  3. ‌异常处理‌:消费失败时抛出异常,RocketMQ会自动重试当前消息(阻塞后续消息)


‌何时不需要顺序消费?‌

  1. 日志收集与分析
  2. 统计类业务(如PV/UV统计)
  3. 通知类消息(短信/邮件发送)
  4. 数据备份操作

‌最佳实践‌:80%的场景只需保证‌局部有序‌(如按订单ID),全局有序会严重限制系统扩展性。在设计时需明确业务真正需要的顺序粒度。

RocketMQ常见问题与深度解析 通俗来说一个消息消费失败并重试达到最大次数后,MQ就会将其放到死信队列中。超过三天该消息就会被销毁。需要补充的时死信队列是针对一个group id为单位创建的队列,如果一个gourp中都没有死信的话,那么MQ就不会为这个组创建死信队列。 阅读详情

相关推荐

在Qt中使用EtherCAT-SOEM的初始化中,状态机卡在PreOp->Save-Op过程中,出现State=0x12, Error=0x001e错误的解决办法

1.在调试EtherCAT软件过程中,一直出现配置从站进不了Save_op状态,通过下函数检查从站状态: //使用的从站编号为1 只有1个从站 ec_slave[1].state = EC_STATE_SAFE_OP; ec_writestate(1); //设置到安全模式 ec_statecheck(1, EC_STATE_SAFE_OP, EC_TIMEOUTSTATE * 4); printf("Slave %d State=0x%2.2x StatusCode=0x%4

zeal_for_rov的博客 6828

RocketMQ 应用入门

RocketMQ 应用入门 topic 、Message Queue、NameServer

杨宇昌的博客 1128

计算机视觉三大顶会(ICCV/CVPR/ECCV)投稿指南与趋势解析

本文详细解析计算机视觉三大顶会(ICCV/CVPR/ECCV)的投稿指南与最新趋势。从基础认知到实战经验,涵盖时间线管理、选题策略、论文写作技巧及实验设计要点,帮助研究者提升投稿成功率。特别关注2024年技术融合、评估维度和伦理要求等前沿趋势,为计算机视觉领域的研究者提供实用建议。

weixin_29165725的博客 1834

rocketmq的有序消费模式和并发消费模式的区别

rocketmq消费者注册监听有两种模式,有序消费MessageListenerOrderly和并发消费MessageListenerConcurrently,这两种模式返回值不同。 MessageListenerOrderly正确消费返回ConsumeOrderlyStatus.SUCCESS, 稍后消费返回ConsumeOrderlyStatus.SUSPEND_CURRENT_QUEUE_A_MOMENT MessageListenerConcurrently正确消费返回ConsumeConcu

C18298182575的博客 6049

从Podfile到分享成功:ShareSDK小红书模块集成全流程实战(附视频分享代码)

本文详细介绍了iOS应用如何通过ShareSDK集成小红书分享功能的全流程,包括环境配置、SDK初始化、图片和视频分享实现,以及常见问题排查和性能优化策略。特别针对视频分享这一高频需求场景,提供了完整的代码示例和实战技巧,帮助开发者快速实现社交分享功能。

weixin_42540248的博客 226

APM32F103 配置CAN

摘要: 本文介绍了基于APM32F103RCT6的CAN通信实现,包含GPIO初始化、CAN配置、数据收发功能。通过配置CAN1的GPIO引脚(PB8/PB9)和波特率(500Kbps),实现标准帧格式的数据传输。发送函数支持8字节数据包,接收函数通过FIFO0处理消息,并根据接收ID触发响应发送(如ID 0x1回复0x2)。代码还包含错误状态检测(如总线关闭处理)和过滤器配置(32位掩码模式)。整体实现了基础的CAN通信与错误管理功能。

weixin_43676660的博客 862

日常梳理-RocketMQ

文章目录 消费者: 1)消息丢失:at least once+重试机制 at least once :ack机制 1.先提交后消费 2.先消费,消费成功后再提交(rocketmq默认这种模式) rocketmq自带的重试机制+死信队列 重试分为:异常重试和超时重试 1.异常重试:由于Consumer端逻辑出现了异常,导致返回了RECONSUME_LATER状态,那么Broker就会在一段时间后尝试重试。 https://blog.youkuaiyun.com/u013099854/article/details/111

amunamuna的博客 4617

别再死磕U-Net了!用PyTorch手把手教你搭建ResUnet,搞定医学图像分割(附完整代码)

本文详细介绍了如何利用PyTorch搭建ResUnet模型,通过引入残差连接解决医学图像分割中的梯度消失、特征退化和细节丢失问题。与传统U-Net相比,ResUnet在Dice系数和收敛速度上均有显著提升,特别适合处理脑部MRI等复杂医学图像。文章还提供了完整的代码实现和关键训练技巧,帮助开发者快速掌握这一先进技术。

weixin_42552637的博客 327

Spring Rocketmq 事务消息 @RocketMQMessageListener注解的使用

RocketMQMessageListener事务消息监听器。

weixin_51442090的博客 1万+

学Simulink--基于电力电子变换器的建模与仿真实例:LLC谐振变换器在高频AC-DC转换中的建模

本文详细介绍了使用Simulink+Simscape Electrical对LLC谐振变换器进行建模与仿真的完整流程。LLC谐振变换器因其高效率、低噪声的特点,广泛应用于高频AC-DC转换场景。文章从背景原理出发,逐步讲解系统结构设计、建模步骤(包括AC源、整流器、LLC变换器、负载等模块搭建)、控制策略实现(固定频率/变频/PID控制)和仿真设置。通过分析仿真结果的关键指标,提出参数整定和算法优化建议。该建模方法为电力电子设计人员提供了实用的仿真工具,有助于优化LLC变换器性能,缩短开发周期。

xiaoheshang_123的博客 298

YOLO26涨点改进 | Conv篇/小目标改进 | AAAI 2025 FBRT-YOLO 两个轻量级FCM和MKP模块, 助力无人机航拍任务VisDrone、UAVDT和AI-TOD高效涨点

本文提出FBRT-YOLO26模型,通过引入两个轻量级模块FCM和MKP优化航拍图像检测性能。FCM模块通过特征互补映射解决小目标信息丢失问题,MKP模块利用多尺度卷积核增强目标感知能力。在VisDrone等数据集上的实验表明,该方法在精度和速度上均优于现有实时检测器。文章详细介绍了模块结构、核心代码实现及YAML配置文件修改方法,为航拍图像中的小目标检测提供了高效解决方案。该模型实现了检测精度与效率的良好平衡,具有实际应用价值。

Ai缝合怪、助力小伙伴高效发论文 369

【Rocketmq进阶-实战问题】

本文从问题、场景和解决方案三部分展示。

lixiaoyi01的博客 466

iOS应用突然无法从App Store获取到内购(IAP)产品列表的解决

问题现象 Apple开发中,在应用中嵌入内购(IAP)功能的小伙伴们可能会发现,吃着火锅唱着歌,突然App就无法获取到产品列表了,而且产品请求操作并不会返回任何错误。 此时检查发现,并没有对App的内购逻辑做任何改动。 那么,这是什么原因导致的呢? Let’s find out!???? 问题分析 1. 排除其它原因 首先,你先得排除不是你IAP内购逻辑变更或其他原因导致的。 在SKProductsRequestDelegat代理实现的productsRequest方法里下断点: func produc

享受开发,颠倒银河 6141

41.RocketMQ常见面试题有哪些?

准备这些问题时,建议结合实际案例和项目经验进行回答,以便在面试中展示你的深入理解和实践能力。

ADbyCool的博客 665

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

【RocketMQ面试题(23道)】

介绍RocketMQ的基本原理、优缺点、消费模式、消费模型、基本架构、如何保证消息的可用性、顺序消费的实现、如何保证高可用等面试问题

独上高楼,望尽天涯路。 2万+

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

【每日八股】学习 RocketMQ Day2:进阶(一)

重点复习 RocketMQ 的基础知识,比如消息队列的相关基本概念以及 RocketMQ 的主要构成组件,并对 RocketMQ 的进阶部分知识进行学习。

YGGP的博客 1154

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

RocketMQ知识整理

一、基本原理及特性 1.文档、资料地址 RocketMQ官网地址:Apache RocketMQ RocketMQ阿里云地址:什么是消息队列RocketMQ版? - 消息队列RocketMQ版 - 阿里云 RocketMQ gitHub地址:https://github.com/apache/rocketmq 2.架构设计 1)结合部署架构图,描述集群工作流程: 启动NameServer,NameServer起来后监听端口,等待Broker、Producer、Consumer连上来,相.

NY_Forever的博客 819

夺命连环问之玩转-RocketMQ

一文解决RocketMQ夺命连环问,RocketMQ面试题

yinbaoli的博客 1082

消息队列相关问题之RocketMQ篇

其中,利用了 NIO 中的 FileChannel 模型将磁盘上的物理文件直接映射到用户态的内存地址中(这种 Mmap 的方式减少了传统 IO,将磁盘文件数据在操作系统内核地址空间的缓冲区,和用户应用程序地址空间的缓冲区之间来回进行拷贝的性能开销),将对文件的操作转化为直接对内存地址进行操作,从而极大地提高了文件的读写效率(正因为需要使用内存映射机制,故 RocketMQ 的文件存储都使用定长结构来存储,方便一次将整个文件映射至内存)。发布者将消息发送到主题中,订阅者在接收消息之前需要先“订阅主题”。

fbbqt的博客 1130

RocketMQ介绍

Apache Alibaba RocketMQ是阿里巴巴开源的一个消息中间件,在阿里内部历经了双十一等很多高并发场景的考验,能够处理亿万级别的消息。2016年开源后捐赠给Apache,现在是Apache的一个顶级项目。 由Java语言开发,底层采用Netty通信。 目前客户端支持Java, C++, Go。

迷失蒲公英 1359

RocketMQ 面试高频问题与解答

作用:积累消费失败且达最大重试次数的消息。处理:定期分析失败原因、手动重发或修复后重新消费。

weixin_43076660的博客 1015

RocketMQ面试题:进阶部分

在生产阶段,主要通过请求确认机制,来保证消息的可靠传递。 1、同步发送的时候,要注意处理响应结果和异常。如果返回响应 OK,表示消息成功发送到了 Broker,如果响应失败,或者发生其它异常,都应该重试。 2、异步发送的时候,应该在回调方法里检查,如果发送失败或者异常,都应该进行重试。 3、如果发生超时的情况,也可以通过查询日志的 API,来检查是否在 Broker 存储成功。

在技术的广袤天地里,本博客如精准罗盘。剖析前沿科技,深掘代码奥秘,以精炼笔触,带您穿越复杂技术迷宫,速达知识彼岸。 1061

RocketMQ面试题

类比一下我们生活的邮政系统——邮政系统要正常运行,离不开下面这四个角色, 一是发信者,二 是收信者, 三是负责暂存传输的邮局, 四是负责协调各个地方邮局的管理机构。对应到 RocketMQ 中,这四个角色就是 Producer、 Consumer、 Broker 、NameServer。在操作系统中,使用传统的方式,数据需要经历几次拷贝,还要经历用户态/内核态切换。从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;然后从用户态内存复制到网络驱动的内核态内存;

可小辉的博客 913

RocketMQ教程(四) - 常见问题

目录 (一)基础(二)进阶(三)高可用部署(四)常见问题 正文 1 MQClientException: No route info of this topic, test() 发生场景 Producer发送消息 可能原因 A. Broker没有成功连接NameServer -> 通过telnet命令检查从Broker Server到NameServer的网络连接是否正常 B...

分享知识、分享进步 6359

一文彻底搞懂RocketMQ

类比一下我们生活的邮政系统。邮政系统要正常运行,离不开下面这四个角色, 一是发信者,二 是收信者, 三是负责暂存传输的邮局, 四是负责协调各个地方邮局的管理机构。对应到 RocketMQ 中,这四个角色就是 Producer、 Consumer、 Broker 、NameServer。在操作系统中,使用传统的方式,数据需要经历几次拷贝,还要经历用户态/内核态切换。从磁盘复制数据到内核态内存;从内核态内存复制到用户态内存;然后从用户态内存复制到网络驱动的内核态内存;

爱琴孩的博客 503

SpringBoot集成RocketMQ(进阶版)

上一篇文章我们讲了如何简单的springboot集成rocketmq(建议先看上一篇,此篇实在上一篇的基础上改进的),但在实际应用中,往往不会只有一个消息处理类,MessageProcessorImpl。消费者会收到不同topic,不同tag的的消息,这里我们来对我们的consumer类和消息处理类进行扩展一下。 一、修改我们的MessageProcessor接口。 改造一下: package c...

Soda_lw的博客 1万+
上一篇: RocketMQ重试队列与死信队列以及流程原理
下一篇: Java8-21的核心特性以及用法
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值