请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

消息队列投递

老师,当我登录或者发送单聊消息时,消息先到TCP层,然后分别分发到Mq的IM2Userservice和Im2MessageService,逻辑层分别监听这两个队列,然后拿到对应的自己的其他端的userSession和要发送所有端的userSession,拿出brokerId,登录和单聊消息发到都Mq的Message2Im,路由键是brokerid,其他端监听的就是brokerId的队列,对应的机子能拿到消息,然后发给对应的channle,这里TCP分发到Mq的IM2UserService和Im2MessageService,分布式场景下是不止有本机上的逻辑层能监听到么,其他机器的逻辑层也能够监听到么,这样的话不是所有的逻辑层都要找对应的Session的brokerId然后投递到Mq么?

正在回答 回答被采纳积分+3

1回答

conan老师 2023-04-18 21:57:13

我简化一下你的问题,你是不是想问在集群场景下我们部署了n个逻辑层的服务,这n个服务都会收到tcp发来的消息?

如果你的问题是这个的话,你可以去了解下rabbitmq的负载均衡策略。如果有多个消费者监听同一个队列(没有使用routekey)会使用自带的负载均衡。

0 回复 有任何疑惑可以回复我~
  • 老师,我了解了下是轮询实现,那同一个时刻只有一个逻辑层的服务能收到,也就是说不是每次都是本机的逻辑层服务能收到吧?这样就每次都只有一个逻辑层服务开始转发;还有个可能很简单的问题我不是很明白,为什么有时候用basicAndPush有时候用convertAndSend,以及为什么有一部分交换机和队列是通过语句建立的么?为什么有些又要手动建立呢
    回复 有任何疑惑可以回复我~ 2023-04-18 22:25:21
  • tcp发往逻辑层的是没有指定routekey的哪一台服务器收到由mq的负载均衡决定,但是逻辑层发给tcp层的是有指定的routekey的 只有特定的机器可以收到,你第二个问题就是spring整合rabbitmq 和 使用原生rabbitmq client的一些差异了。使用spring整合会简单一些,因为网关层没有整合spring所以和逻辑层有点不同
    回复 有任何疑惑可以回复我~ 2023-04-18 22:28:46
  • 提问者 weixin_慕无忌5099718 回复 conan老师 #3
    老师,不好意思,关于rabbitMq还有点困惑, @RabbitListener(bindings = @QueueBinding(
                value = @Queue(value = Constants.RabbitConstants.Im2UserService, durable = "true"),
                exchange = @Exchange(value = Constants.RabbitConstants.Im2UserService, durable = "true")
        ), concurrency = "1"),在这段代码中,声明交换机,声明队列,然后绑定,这个交换机默认是direct,routeKey默认是这个队列的名字,在多个集群中多个实例一起监听,第一个问题是,这样是工作队列模式还是发布订阅模式,因为我看发布订阅是一个消费者一个队列,工作队列模式是多个消费者一个队列并且没有交换机,我理解的是这是发布订阅模式,但是也可以多个消费者监听一个队列,不知道这样对不对?channel.basicPublish(channelName,"",
                        null, o.toJSONString().getBytes());另外发消息过程中,指定了交换机,交换机为direct,但是routekey为"",因为模式是direct,当routeKey为""时这样会分发到所有绑定该交换机的队列,也就是Im2UserService队列,这个队列只有一个,但是多个实例监听,第二个问题是老师您说的负载均衡分发应该是这个时候实现的吧?就是实例读消息的过程,最终只有一个实例能够收到消息
    回复 有任何疑惑可以回复我~ 2023-04-19 10:36:14
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信