一、生产者端

1.比如遇到各种流量冲击的活动:618、双11大促、竞拍、抢购、秒杀业务。(这种需要做好容量预估管理)

2.程序缺陷;死循环调用、批量请求、内存泄漏导致的流量飙升问题。(这种需要做好)

二、消费者端

1.消费失败时大量重试导致消息堆积

2.消费者程序的故障:如 程序死锁,io阻塞等。

三、解决方案

1.通过增加消费者的数量来提升消息的处理能力。增加消费者可以分担消息消费的负载,缓解消息队列的堆积问题。

2.提高单个消费者的消费并行线程。RocketMQ 支持批量消费消息,可以通过修改DefaultMQPushConsumer 消费者类的consumeThreadMin(最少消费线程数),以及consumeThreadMax(最大消费线程数)来提高单个消费者的消费能力。

①监听器代码

package com.powernode.yktest;

import org.apache.rocketmq.common.message.MessageExt;

import org.apache.rocketmq.spring.annotation.ConsumeMode;
import org.apache.rocketmq.spring.annotation.MessageModel;
import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.springframework.stereotype.Component;

import java.sql.SQLOutput;

/**
 * @description:
 * @author: 袁凯
 * @time: 2024/4/11 11:52
 */
@Component
@RocketMQMessageListener(topic = "boot-simple", consumerGroup = "powernode-group",consumeMode = ConsumeMode.ORDERLY)
public class SimpleMsgListener implements RocketMQListener<MessageExt> {
    private long totalConsumeTime = 0; // 记录所有消息的总消费时间
    private int messageCount = 0; // 记录已经消费的消息数量

    private final Object lock = new Object(); // 锁对象
    @Override
    public void onMessage(MessageExt messageExt) {
        long startTime = System.currentTimeMillis();
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            throw new RuntimeException(e);
        }
        long endTime = System.currentTimeMillis();
        long consumeTime = endTime - startTime;

        synchronized (lock) {
            // 累加消费时间和消息数量
            totalConsumeTime += consumeTime;
            messageCount++;

            // 打印消费消息的时间戳和消费耗时
            System.out.println("Message ID: " + messageExt.getMsgId() + ", Consume Time: " + consumeTime + "ms" + "messageCount:" + messageCount);

            // 如果所有消息都已经消费完成,打印总的消费时间和平均消费时间
            if (messageCount == 100) { // 假设总共有 100 条消息
                System.out.println("Total Consume Time: " + totalConsumeTime + "ms");
                System.out.println("Average Consume Time: " + totalConsumeTime / messageCount + "ms");
            }
        }
    }


}

②顺序消费时,消耗100条1ms的消息耗费时长

0H~PYE2UFB`X(SY[{1SMTHY.png

③修改为并发消费

@RocketMQMessageListener(topic = "boot-simple", consumerGroup = "powernode-group", consumeThreadNumber = 3)

3.某些业务流程如果支持批量方式消费,则可以很大程度上提高消费吞吐量,例如订单扣款类应用,一次处理一个订单耗时 1 s,一次处理 10 个订单可能也只耗时 2 s,这样即可大幅度提高消费的吞吐量。建议使用5.x SDK的SimpleConsumer,每次接口调用设置批次大小,一次性拉取消费多条消息。

PQHZP_TU9B(XI1$E7OD~G11.png


原来是小袁呐
1 声望0 粉丝

引用和评论

0 条评论