RabbitMQ学习
当不同的微服务之间存在调用时,比如支付业务必须等待扣除余额业务的结果,然后再调用其他业务,这里扣除余额必须同步,其他的可以异步,同步好处是时效性好,但是性能很差
使用同步会导致一个服务内部耦合性太高(使用Feign向其他微服务发请求) 不符合开闭原则
而使用异步则可以提高性能和拓展性,即使时效性不那么好。
在异步调用中,Broker(代理)是一个中间件,它连接了消息的生产者和消费者,用于分发消息并确保消息到达目标。当一个应用程序需要向另一个应用程序发送一个请求或通知时,它会将消息发送到 Broker 中,并且 Broker 会确保将该消息传递给正确的接收者。
在异步调用中,Broker 通常被用作消息队列,例如 Apache Kafka、RabbitMQ、ActiveMQ 等。这些消息队列是高效的分布式系统,能够处理大量的消息传输,并且提供了可靠性和可伸缩性。
具体来说,在异步调用中,当一个应用程序发送一个请求或通知时,它会将消息发送到 Broker 中,而不是直接发送给接收者。接收者通过订阅 Broker 中的特定主题或队列来接收消息。当有新的消息到达 Broker 时,Broker 将消息分发给所有订阅该主题或队列的接收者。这样一来,即使接收者不在线,Broker 也可以保存消息,并在接收者重新连接后将其发送给接收者。
总之,Broker 在异步调用中扮演了非常重要的角色,它为消息的传递提供了可靠的中间件,使得分布式系统更加健壮和高效。
RabbitMq 交换机只负责消息的路由转发,不负责存储,队列要想接收到消息,首先需要交换机绑定队列
所谓的数据隔离,指RabbitMQ消息队列,主体角色: 发送者 消费者 交换机 队列 虚拟主机
消息先经过交换机进行路由转发,然后传递给队列(前提是绑定好) 然后一个虚拟主机内部可以有多个交换机和若干个消息队列,不同的虚拟主机具有隔离性。
其次是fanout模型
这里的交换机类型是fanout,它会广播消息,然后路由到不同的队列,这里每一个队列就可以对应一个微服务,比如pulisher是支付服务,订单 积分服务,每一个微服务对应一个队列,
当然微服务做集群的话,也就是一个队列也可以有多个消费者。
topic交换机,队列和交换机绑定的时候,可以使用通配符,比direct更灵活,direct交换机,队列与之绑定的话,一次只能使用一个具体的routeingKey
在java代码中声明交换机和队列的两种方法
第一种方法是在配置类里面使用@Bean注解
第二种方法是使用@RabbitListener注解