限时福利领取


消息中间件架构

背景痛点

在电商秒杀等高并发场景下,消息中间件面临三大核心挑战:

  1. 消息重复消费:由于网络重试或消费者重启,可能导致订单重复扣减库存
  2. 顺序错乱:订单状态变更消息(创建→支付→发货)若乱序处理,将引发业务逻辑错误
  3. 集群脑裂:网络分区时出现多个Master节点,导致消息数据不一致

技术选型

RocketMQ 5.0 vs Kafka 3.6 关键差异

架构对比图

  • 事务消息:
  • RocketMQ采用二阶段提交+XA模式,事务状态存储于OP队列
  • Kafka通过Transactional Producer实现原子性写入
  • 延迟队列:
  • RocketMQ原生支持18个延迟级别(1s~2h),基于ScheduleTopic
  • Kafka需自行实现时间轮或外部分布式调度

核心实现

Spring Boot集成示例

@Slf4j
@RocketMQMessageListener(
    topic = "ORDER_TOPIC",
    consumerGroup = "inventory_group",
    selectorType = SelectorType.TAG,
    selectorExpression = "stock",
    consumeThreadMax = 32 // 动态线程池配置
)
public class StockConsumer implements RocketMQListener<MessageExt> {
    @Override
    public void onMessage(MessageExt message) {
        String msgId = message.getMsgId();
        try {
            StockDTO dto = JSON.parseObject(message.getBody(), StockDTO.class);
            // 幂等处理
            if(redisTemplate.opsForValue().setIfAbsent("dedup:"+msgId, "1", 24, HOURS)) {
                inventoryService.reduceStock(dto);
            }
        } catch (Exception e) {
            log.error("消费失败 msgId={}", msgId, e);
            throw new RuntimeException("重试");
        }
    }
}

线程池优化公式

corePoolSize = QPS × avgProcessTime(ms) / 1000
maxPoolSize = corePoolSize × 2
queueCapacity = QPS × maxProcessTime(ms) / 1000

性能测试

G1 GC关键参数

-XX:+UseG1GC 
-XX:MaxGCPauseMillis=200 
-XX:InitiatingHeapOccupancyPercent=45

TC网络模拟命令

tc qdisc add dev eth0 root netem loss 30% delay 100ms

避坑指南

  1. 消息轨迹优化:
  2. 关闭生产环境的消息轨迹开关(enableMsgTrace=false)
  3. 采用采样率配置(traceSampleRate=0.01)

  4. 时钟同步方案:

  5. 部署NTP服务(chrony)
  6. 设置时间偏差阈值(serverMaxTimeDiffMillis=3000)

面试题设计

场景:支付系统需要保证退款消息的幂等性,请设计实现方案。要求:

  1. 说明业务判断逻辑
  2. 给出Redis+Lua的原子性实现代码
  3. 分析MySQL唯一索引方案的优缺点
Logo

音视频技术社区,一个全球开发者共同探讨、分享、学习音视频技术的平台,加入我们,与全球开发者一起创造更加优秀的音视频产品!

更多推荐