RabbitMQ基础

RabbitMQ

整体机构及核心概念

  • publisher:消息发送者

  • consumer:消息的发送者

  • queue:队列,存储消息

  • exchange:交换机

通过 生产者交换机队列消费者

数据隔离,只能用户只能操作自己的虚拟主机

SpringAMQP

AMQP一种消息通讯协议,该协议与语言和平台无关

消费者消息推送限制

默认情况下,RabbitMQ的会将消息依次轮询给绑定在队列上的每一个消费者。但这并没有考虑消费者是否已经处理完消息(因为每个消费者的消费能力并不一定相同),可能会出现消息堆积。

因此需要修改application。yml,设置preFetch的值为1,确保同一时刻最多投递给消费者一条消息

Work模型

  • 多个消费者绑定到一个队列,可以加快消息处理速度

  • 同一条消息只会被一个消费者处理

  • 通过设置prefetch来控制消费者预取的消息数量,处理完一条在处理下一条(能者多劳),通过配置文件中的prefetch

如何解决消息堆积的问题

  1. work模型:一个队列绑定多个消费者,加快对信息的处理

  2. 优化代码,提高信息处理速度。(使用缓存或异步(线程池等)等)【这里不做详细讲述】

交换机

真正的生产环境都会经过exchange来发送消息,而不是直接发送到队列

交换机的作用

接受publisher发送的消息

将消息按照股则路由到与之绑定的队列

  • Fanout:广播

    Fanout Exchange会将收到的消息广播到每一个跟其绑定的queue,所以也叫广播模式

  • Direct:定向

    Direct Exchange会将接收到的消息根据规则路由到指定的Queue,因此称为定向路由。

    1. 每一个Queue都与Exchange设置一个BindingKey

    2. 发布者发送消息时,指定消息的RoutingKey

    3 .Exchange将消息路由到BindingKey与消息RoutingKey一致的队列

  • Topic:话题

    与DirectExchange类似,区别在于routingKey可以是多个单词的列表,并以.分割

声明队列和交换机

SpringAMQP提供了几个类,用来声明队列,交换机及其绑定关系:

  • Queue:用于声明队列,可以用工厂类QueueBuilder构建

  • Exchange:用于声明交换机,可以用工厂类ExcahngeBuilder构建

  • Binding:用于声明队列和交换机的绑定关系,可以用工厂类BindingBuilder构建

 @Configuration
 public class FanoutConfig{
     //声明FanoutExchange交换机
     @Bean
     public FanoutExchange fanoutExchange(){
         return new FanoutExchange("hmall.fanout");//交换机名称
     }
     //声明第1个队列
     @Bean
     public Queue fanoutQueue1{
         return new Queue("fanout.queue1")//队列名称
     }
     //绑定队列1和交换机
     @Bean
     public Bindling bindingQueue1(Queue fanoutQueue1,FanoutExchange fanoutchange){
     return Bindingbuilder.blind(fanout.queue1).to(fanout.Exchange);
     }
 }

@RabbitListener更便于声明队列和交换机,无需写多次@Bean,更简洁好用

具体格式:

 @RabbitListener(bindings = @QueueBinding(
     value = @Queue(name="direct.queue1",durable = "true"),
     exchange = @Exchange(name = "hmall.direct", type = Exchange。DIRECT)
     key = {"red","blue"}
 ))

消息转换器

实现不同协议或格式之间消息的转换

  • 通过消息转换器可以实现与其他队列系统的互通

    eg. Kafka

  • 也可以将消息转换为不同数据格式

    eg. JSON,XML

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值