RabbitMQ 五种模式
RabbitMQ是一种常用的消息队列服务,它提供了五种消息模型:简单模型、工作队列模型、发布/订阅模型、路由模型、主题模型。
1. 简单模型(Simple Message Queue,简称SQS):一个生产者,一个消费者,一个队列。
2. 工作队列模型(Work Queue):多个消费者共同处理一个队列中的任务,可以扩展进程数处理更多任务。
3. 发布/订阅模型(Publish/Subscribe):生产者将消息发给所有订阅者(广播方式)。
4. 路由模型(Routing):生产者将消息发给特定的队列,根据路由键。
5. 主题模型(Topics):类似于路由,但是可以使用模式匹配。
3、4、5这三种都属于订阅模型,只不过进行路由的方式不同。
说明:以下内容来源自博客https://www.cnblogs.com/Runawayprogrammer/p/15980060.html
一. 简单模式
1. 消息生产者将消息放入队列
2. 消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)
3. 应用场景:聊天(中间有一个过度的服务器;p端,c端)
二. 工作模式(资源的竞争,能者多劳)
1. 消息生产者将消息放入队列,消费者可以有多个(消费者1,消费者2)同时监听同一个队列,消息被消费者C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患:高并发情况下默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)
2. 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)
三. publish/subscribe 发布订阅(共享资源)
1. X代表交换机(exchange)是RabbitMQ内部组件,erlang消息生产者是代码完成,代码的执行效率不高,消息生产者将消息放入交换机,交换机以广播的形式发送消息到所有消息队列中,对应消息队列的消费者拿到消息进行消费。
这种模型存在一个缺点,就是无法对消息进行过滤。于是引出direct消息模型(路由模式)。
2. 相关场景:邮件群发,群聊天,广播(广告) 。
四. 路由模式
1. 消息生产者将消息发送给交换机按照路由判断,路由是字符串(info) 当前产生的消息携带路由字符(对象的方法),交换机根据路由的key,只能匹配上路由key对应的消息队列,对应的消费者才能消费消息;
2. 根据业务功能定义路由RoutingKey字符串
3. 从系统的代码逻辑中获取对应的功能字符串,将消息任务扔到对应的队列中
4. 业务场景:error 通知;EXCEPTION;错误通知的功能;传统意义的错误通知;客户通知;利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;
五. topic 主题模式(路由模式的一种)
1. 星号 和 井号代表通配符
2. 星号匹配不多不少恰好1个词, #匹配一个或多个词(* 匹配 一级 任意多个字符,# 匹配 多级 任意多个字符)
例如:routingKey为"user.#",表示可以匹配"user.add"和"user.add.log"。
routingKey为"user.*",表示可以匹配"user.add",对于"user.add.log"则无法匹配。
3. 路由功能添加模糊匹配
4. 消息产生者产生消息,把消息交给交换机
5. 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费
RabbitMQ -交换机
fanout模式:
广播式交换器类型(fanout):该类交换器不分析所接收到消息中的Routing Key,默认将消息转发到所有与该交换器绑定的队列中去。广播式交换器转发效率最高,但是安全性较低,消费者应用程序可获取本不属于自己的消息。
direct模式:
直接式交换器类型(direct):该类交换器需要精确匹配Routing Key与BindingKey,如消息的Routing Key = Cloud,那么该条消息只能被转发至Binding Key = Cloud的消息队列中去。直接式交换器的转发效率较高,安全性较好,但是缺乏灵活性,系统配置量较大。
topic模式:
主题式交换器(Topic Exchange):该类交换器通过消息的Routing Key与Binding Key的模式匹配,将消息转发至所有符合绑定规则的队列中。Binding Key支持通配符,其中“”匹配一个词组,“#”匹配多个词组(包括零个)。例如,Binding Key=“.Cloud.#”可转发Routing Key=“OpenStack.Cloud.GD.GZ”、“OpenStack.Cloud.Beijing”以及“OpenStack.Cloud”的消息,但是对于Routing Key=“Cloud.GZ”的消息是无法匹配的。
1. 生产者发送消息到交换机
2. 交换机根据routingkey 转发消息给队列
3. 消费者监控队列,获取队列中信息
4. 消费成功删除队列中的消息
headers模式:
根据消息的headers来匹配对应的队列,在消息接收回调中指定headers, 可以是Map<String, Object>、String可变数组类型的keys等