@Component("rocketMQConsumerService")
public class RocketMQConsumerService implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
startConsumer();
}
private void startConsumer() throws MQClientException {
DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(consumerGroup);
consumer.setNamesrvAddr(namesrvAddr);
// 订阅第一个Topic
consumer.subscribe("OrderTopic", "*");
// 订阅第二个Topic
consumer.subscribe("InventoryTopic", "UPDATE||DELETE");
// 可以继续订阅更多Topic
consumer.subscribe("PaymentTopic", "SUCCESS");
consumer.registerMessageListener(new MessageListenerOrderly() {
@Override
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs) {
String topic = msg.getTopic();
String tag = msg.getTags();
// 根据不同的Topic执行不同的业务逻辑
switch(topic) {
case "OrderTopic":
orderService.process(msg);
break;
case "InventoryTopic":
inventoryService.process(msg);
break;
case "PaymentTopic":
paymentService.process(msg);
break;
}
}
return ConsumeOrderlyStatus.SUCCESS;
}
});
consumer.start();
}
}
多Topic订阅的业务逻辑处理
在实际业务场景中,您可以根据消息的Topic和Tag进行精确的业务分发
public ConsumeOrderlyStatus consumeMessage(List<MessageExt> msgs, ConsumeOrderlyContext context) {
for (MessageExt msg : msgs) {
String topic = msg.getTopic();
String tag = msg.getTags();
try {
// 订单相关消息处理
if ("OrderTopic".equals(topic)) {
if ("CREATE".equals(tag)) {
orderCreateService.handle(msg);
} else if ("UPDATE".equals(tag)) {
orderUpdateService.handle(msg);
}
}
// 库存相关消息处理
else if ("InventoryTopic".equals(topic)) {
inventoryService.process(msg);
}
// 支付相关消息处理
else if ("PaymentTopic".equals(topic)) {
paymentService.handle(msg);
}
} catch (Exception e) {
// 统一的异常处理逻辑
handleConsumeException(msg, e);
}
}
return ConsumeOrderlyStatus.SUCCESS;
}
性能优化配置建议
当单个消费者订阅多个Topic时,建议进行适当的性能调优:
- 消费线程配置:
consumer.setConsumeThreadMin(10)和consumer.setConsumeThreadMax(30) - 拉取批量大小:
consumer.setPullBatchSize(32) - 消息处理超时:
consumer.setConsumeTimeout(30000)
何时需要创建多个消费者服务
虽然单个消费者可以订阅多个Topic,但在以下特定场景下,可能需要创建多个消费者服务类:
- 不同的消费模式:当某些Topic需要顺序消费,而其他Topic可以并发消费时
- 不同的业务隔离需求:当不同Topic的消息处理逻辑差异很大,需要完全隔离时
- 不同的集群环境:需要连接不同的NameServer集群时
- 不同的异常处理策略:某些Topic的消息允许重试多次,而其他Topic的消息需要立即失败时
企业级最佳实践总结
多Topic订阅的最佳实践包括:
- 使用单个消费者实例订阅相关的多个Topic,减少资源消耗
- 在消费逻辑中进行业务分发,根据Topic和Tag执行不同的处理
- 配置统一的异常处理机制,确保所有Topic的消息都能得到正确处理
- 监控所有Topic的消费情况,及时发现消息堆积或消费失败问题
通过这种设计,您的RocketMQ消费者服务既能保持代码的简洁性,又能满足复杂的业务需求,实现高效的消息处理架构
959

被折叠的 条评论
为什么被折叠?



