首页 > 编程知识 正文

关于风电叶片的疑问,关于流星的疑问

时间:2023-05-03 23:08:30 阅读:180216 作者:4458

问题是由AlibabaCloud (阿里巴巴云)服务提供的消息排队服务(RocketMQ ),展示了订阅关系一致性的最佳实践,同一GroupID内的所有消费者实例都是同一topic tapic 这让人怀疑,为什么一个GroupID只能生成一个订阅。 这样的话,不是就需要用同一个APP订阅不同的Topic吗? 这样一来,每次都需要申请一个GroupID,从而使GroupID和Topic产生一定的耦合关系,看起来不合理。 那么,RocketMQ为什么要这么做呢?

解答通过阅读源代码找到了这个问题的部分答案。

如果在同一GroupID下的不同消费者实例中订阅不同的Topic Tag,则在负载平衡Topic消耗队列时会产生错误的结果,最终导致消息丢失。

用户客户端有一个名为Rebalance的类,它定期在用户和订阅的Topic的用户队列(类似于Kafka的Partition )中平衡负载。 在进行负载均衡的过程中,通过mqclientfactory.findconsumeridlist (topic,consumerGroup )方法,在此GroupId下获取订阅此topic的所有clientId

看这个地方很有疑问,在这里以GroupID和Topic为参数获取ClientID怎么会产生问题呢? 继续往下看。

可以看到,findConsumerIdList方法没有继续传递Topic,只是使用Topic作为获取Broker地址的参数,而实际上获取ClientId的方法没有传递Topic 因此,此调用返回当前GroupID下的所有消费者实例,无论是否订阅了当前Topic。 返回的ClientID参与当前Topic的消费对类的负载平衡,如果未订阅此Topic的消费者实例分配给消息队列,则消耗队列中的消息消耗将失败。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。