订阅模式
最近更新时间: 2024-10-17 17:10:00
为了适用不同场景的需求,TDMQ 提供多种订阅方式。订阅可以灵活组合出很多可能性:
如果您想实现传统的 “发布-订阅消息”形式 ,可以让每个消费者都有一个唯一的订阅名称(独占)。
如果您想实现传统的“消息队列” 形式,可以使多个消费者使用同一个的订阅名称(共享、灾备)。
如果您想同时实现以上两点,可以让一些消费者使用独占方式,剩余消费者使用其他方式。
独占模式(Exclusive)
如果两个及以上的消费者尝试以同样方式去订阅主题,消费者将会收到错误,适用于全局有序消费的场景。
Consumer<byte[]> consumer1 = client.newConsumer()
.subscriptionType(SubscriptionType.Exclusive)
.topic(topic)
.subscriptionName(groupName)
.subscribe();
//consumer1启动成功
Consumer<byte[]> consumer2 = client.newConsumer()
.subscriptionType(SubscriptionType.Exclusive)
.topic(topic)
.subscriptionName(groupName)
.subscribe();
//consumer2启动失败
灾备模式(Failover)
consumer 将会按字典顺序排序,第一个 consumer 被初始化为唯一接受消息的消费者。
Consumer<byte[]> consumer1 = client.newConsumer()
.subscriptionType(SubscriptionType.Failover)
.topic(topic)
.subscriptionName(groupName)
.subscribe();
//consumer1启动成功
Consumer<byte[]> consumer2 = client.newConsumer()
.subscriptionType(SubscriptionType.Failover)
.topic(topic)
.subscriptionName(groupName)
.subscribe();
//consumer2启动成功
当 master consumer 断开时,所有的消息(未被确认和后续进入的)将会被分发给队列中的下一个 consumer。
共享模式(Shared)
消息通过 round robin 轮询机制(也可以自定义)分发给不同的消费者,并且每个消息仅会被分发给一个消费者。当消费者断开连接,所有被发送给他,但没有被确认的消息将被重新安排,分发给其它存活的消费者。
Consumer<byte[]> consumer = client.newConsumer()
.subscriptionType(SubscriptionType.Shared)
.topic(topic)
.subscriptionName(groupName)
.subscribe();