1、RocketMQ 简介:
RocketMQ前身是阿里研发的一个队列模型的消息中间件,后开源给apache基金会成为了apache的顶级开源项目,具有高性能、高可靠、高实时、分布式特点。
2、RocketMQ基本架构:
如图所示RocketMQ架构上主要分为四部分:
Producer:
充当消息发布的角色,支持分布式集群方式部署。producer通过MQ的负载均衡模块选择相应的Broker集群队列进行消息投递。投递的过程支持快速失败并且低延迟。
Consumer:
充当消息消费者的角色,支持分布式集群方式部署。支持以push推,pull拉两种模式对消息进行消费。同时也支持集群方式和广播形式的消费,它提供实时消息订阅机制,可以满足大多数用户的需求。
NameServer:
NameServer是一个功能齐全的服务器,其角色类似dubbo中的zookeeper,支持Broker的动态注册与发现。主要包括两个功能:
NameServer通常也是集群的方式部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,Broker仍然可以向其它NameServer同步其路由信息,Produce,Consumer仍然可以动态感知Broker的路由的信息。
配置NameServer:代码方式:producer.setNamesrvAddr("ip:port"); consumer.setNamesrvAddr("ip:port");多个实例的NameServer以";'分割。
java 配置:rocketmq.namesrv.addr
操作系统环境变量:NAMESRV_ADDR
HTTP Endpoint.
Broker Server:
broker主要负责消息的存储、投递和查询以及服务高可用保证。为了实现这些功能broker包含了以下几个重要子模块。
Remoting Module:整个broker的实体,负责处理来自clients端的请求。
Client Manager:负责管理客户端(Producer/Consumer)和维护Consumer的topic订阅信息
Store Service:提供方便简单的API接口处理消息存储到物理硬盘和查询功能。
HA Service:高可用服务,提供master broker 和 slave broker之间的数据同步功能。
Index Service:根据特定的Message key对投递到broker的消息进行索引服务,以提供消息的快速查询。
org.hongxi
rocketmq-spring-boot-starter
复制
rocketmq:
name-server: 192.168.0.84:9876
producer:
group: test-group
sendMsgTimeoutMillis: 3000
reconsumeTimes: 3
复制
@Autowired
RocketMQTemplate rocketMQTemplate;
@Test
public void sendHelloWorld() {
SendResult result = rocketMQTemplate.syncSend("operation-topic", "hello world");
log.info("发送结果:{}", JSON.toJSONString(result));
}
复制
@Component
@RocketMQMessageListener(topic = "operation-topic", //topic主题
consumerGroup = "consumer-group", //消费组
messageModel = MessageModel.CLUSTERING,
consumeMode = ConsumeMode.ORDERLY)
@Slf4j
public class MqTestListener implements RocketMQListener {
@Override
public void onMessage(String message) {
log.info("接受到消息:{}", message);
}
}
复制
如何使用tag
/**
* Same to {@link #syncSend(String, Message)}.
*
* @param destination formats: `topicName:tags`
* @param payload the Object to use as payload
* @return {@link SendResult}
*/
public SendResult syncSend(String destination, Object payload) {
return syncSend(destination, payload, producer.getSendMsgTimeout());
}
复制
这里可以看到 destination = topicName:tags