持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第6天,点击查看活动详情
前言
MQ是我们都在使用的一个中间件,其中中间件有RocketMQ,kafukaMQ,rabitMQ等等,其主要为了实现消息订阅,消息发送上去到中间件,由中间件下发消息给予服务。
事故点
这个事故是我在写To-C时出现的一个问题,当时在完善一个功能是设备服务的控制,主要逻辑就是用户访问C端服务,由C端服务进行接口请求接收,前端小程序调用C端接口后,C端业务逻辑是查询数据库中的控制器id根据控制器id进行下发控制,下发到另一个服务去进行Mqtt下发。中间过程使用的就是RocketMQ,RocketMq使用的是开源版本。版本号均为4.9.1版本的最新版。事故是生产者生产消息后,消费者不会立马去消费消息而是等待几十秒或之后在消费,反正就是不能立马消费。
起初怀疑
有一个RocketMQ社区提供的一个快速使用RocketMQ的start包,这不是官方的包所以我怀疑到了他的头上,进入他的源码它的实现很简单,他有一个消费者容器类,容器类顾名思义里面装满了消费者,许多的消费者通过这个容器去注册进去,然后根据不同的topic去消费,他的逻辑没有问题,但是事故没有解决我便采取了官网的rocket原始写法。
原始写法
由于源码看不出start包的端倪,我照抄了官网的原生写法,基于以下写法后比起start包消费更快了一些,但是消费慢的问题并未解决,还是是不是会出现消费卡顿现象,目前仍在排查中。
public class Consumer {
public static void main(String[] args) throws InterruptedException, MQClientException {
// 实例化消费者
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("test_group_name");
// 设置NameServer的地址
consumer.setNamesrvAddr("localhost:9876");
// 订阅一个或者多个Topic,以及Tag来过滤需要消费的消息
consumer.subscribe("TopicTest", "*");
// 注册回调实现类来处理从broker拉取回来的消息
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
//业务代码 处理msgs
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
// 启动消费者实例
consumer.start();
}
}