RoketMq架构:
- NameServer:
Topic 的路由注册中心,为客户端根据 Topic 提供路由服务。NameServer是去中心化的,每个NameServer都保存了完整的路由信息。
- Broker:
消息存储。
- client:
producer:消息发送
consumer:消息消费
-
消息消费模式:广播,集群
-
负载均衡算法
MessageQueueSelector (org.apache.rocketmq.client.producer)
java
producer.send(msg, new MessageQueueSelector() {
@Override
public MessageQueue select(List<MessageQueue> mqs, Message msg, Object arg) {
int index = arg.hashCode() % mqs.size();
return mqs.get(index);
}
}, "orderId123");
MessageQueueSelector (org.apache.rocketmq.proxy.service.route) 在RocketMQ集群部署中,代理服务可能需要根据消息属性或集群状态动态选择目标Broker或队列。
MessageSelector (org.apache.rocketmq.client.consumer) 消费者端的消息选择器,用于通过SQL表达式过滤消息(基于消息属性或Tag)。
java
consumer.subscribe("TopicTest", MessageSelector.bySql("a > 5 AND b = 'hello'"));
QueueSelector (org.apache.rocketmq.proxy.processor) 代理处理器(Processor)中的队列选择接口,可能用于代理内部处理消息时的队列分配逻辑。
- 生产者侧 :
MessageQueueSelector
提供自定义队列选择能力,确保消息有序性或分区。 - 消费者侧 :
MessageSelector
实现消息过滤,提升消费效率。 - 代理层 :同名的
MessageQueueSelector
和QueueSelector
服务于代理的路由和负载均衡逻辑,对用户透明。
这些类共同构成了RocketMQ灵活的消息路由和过滤机制,适用于不同场景下的消息处理需求。
-
消费模型:并发,顺序
-
事务消息:
-
定时消息:16个延时级别
RocketMQ可以通过ack保证消息至少被消费一次,但是不能保证消息只被消费一次。