http://events-docs.devops.xiaohongshu.com/guide/rocketmq.html
一.metaq调用链路
特点:
1.支持严格的消息顺序
2.支持Topic与Queue两种模式
3.亿级消息堆积能力
4.比较友好的分布式特性
5.同时支持Push与Pull方式消费消息
消息生产者负责创建消息并发送到Meta服务器(Broker),Meta服务器会将消息持久化到磁盘,消息消费者从Meta服务器拉取消息并提交给应用消费
二.消息持久性
metaq 接收到消息之后,会先把消息持久化到本地。
常用的持久化方式:
- 持久化到DB
- 持久化到KV存储,如levelDB,伯克利DB
- 持久化到文件
metaq使用的是 持久化到文件 ,并充分利用Linux文件系统内存cache来提高性能。
注: 持久化部分的性能会直接影响消息中间件的性能。
消息堆积能力:metaq每台服务器提供大约亿级的消息堆积能力(多个业务方共用),超过堆积阈值,订阅消息吞吐量会下降。
三.metaq架构&消息的收发
Broker分为master和slave。每个Broker与nameserver集群中的所有节点建立长连接,定时注册topic信息到所有的nameServer。
Producer与nameServer集群中的一个节点(随机)建立长连接,定期从nameServer 取topic路由信息,并向提供topic服务的master broker建立长连接,且定时向master发送心跳。Producer发布消息是发布到master,在由master同步到所有broker。
Consumer与nameServer集群中的一个节点建立长连接,定期从nameServer取topic的路由信息,并向提供topic服务的master、slave broker建立长连接,并定时向master、slave发送心跳。Comsumer既可以从slave订阅消息,也可以从master订阅消息。
metaq采用发布-订阅模型,发布者发布消息到metaq,订阅者向metaq订阅消息。
消息的消费方式是pull方式,由消费者主动从metaq服务器拉取数据,解析成消息并消费。
消息中间件中有两个角色: "消息生产者(Producer)"和"消息消费者(Consumer)"。Meta里同样有这两个概念,消息生产者负责创建消息并发送到Meta服务器(Broker),Meta服务器会将消息持久化到磁盘,消息消费者从Meta服务器拉取消息并提交给应用消费
四.具体使用
目前很多公司并不会直接使用metaq,都是在metaq的基础上进行封装,公司内部有一套非常详细的使用文档。
@Data
@Configuration
public class ProducerConfig {
@Value("${rocketmq.address:xxxxx:xxxx}")
private String namesrvAddr;
@Value("${rocketmq.xxx.producer:xxx}")
private String pubProducerGroup;
@Resource
private RocketMQConfig rocketMQConfig;
@Bean("pubMqClient")
RocketMQProducer pubMqClient() throws MQClientException {
return rocketMQConfig.createProducer(namesrvAddr, pubProducerGroup);
}
}
@Slf4j
@Service
public class PubProducer {
@Resource
private RocketMQProducer pubtMqClient;
@Value("${rocketmq.xxx.topic:xxx}")
private String pubTopic;
public SendResult pubMsg(String keys, String tag, String body) {
try {
Message message = new Message();
message.setTopic(pubTopic);
message.setTags(tag);
message.setKeys(keys);
message.setBody(body.getBytes());
return pubMqClient.pub(message);
} catch (Exception e) {
log.error("pubMsg error. keys:{} body:{}", keys, body, e);
}
return null;
}
}