冰灯

云水禅心

  • 首页
  • 归档

  • 搜索
mybatis Dubbo Git Https ELK Elasticsearch logstash Springboot Nginx Java MQ

RabbitMQ的工作模式

发表于 2020-02-21 | 分类于 MQ | 0 | 阅读次数 329

RabbitMQ基于erlang语言: 是一种支持高并发的语言

RabbitMQ的工作模式:

1. simple简单模式

image.png

(1)消息产生者将消息放入队列

(2)消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)

(3)应用场景:聊天(中间有一个过度的服务器:p端,c端)

2. work工作模式(资源的竞争)

image.png

(1) 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列

(2) 消息被消费C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)

(3) 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)

3. publish/subscribe发布订阅(Exchange 共享资源)

image.png

(1) X(Exchange)代表交换机rabbitMQ内部组件,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费

(2) 相关场景:邮件群发,群聊天,广播(广告)

4. routing路由模式

image.png

(1)RabbitMQ中通过Binding(binding key)将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue

(2)生产者在将消息发送给Exchange的时候,一般会指定一个routing key,来指定这个消息的路由规则,当binding key与routing key相匹配时,消息将会被路由到对应的Queue中。

(3)在Exchange Type与binding key固定的情况下(在正常使用时一般这些内容都是固定配置好的),我们的生产者就可以在发送消息给Exchange时,通过指定routing key来决定消息流向哪里。

(4)Exchange Type 常用分为

fanout : 会把所有发送到该Exchange的消息路由到所有与它绑定的Queue中

direct : 把消息路由到那些binding key与routing key完全匹配的Queue中

topic:下文详细讲

headers: 该类型的Exchange没有用到过

(5)业务场景:

error 通知;
EXCEPTION;
错误通知的功能;
传统意义的错误通知;
客户通知;

利用key路由,可以将程序中的错误封装成消息传入到消息队列中,开发者可以自定义消费者,实时接收错误;

5. topic 主题模式(路由模式的一种)

image.png

binding key中可以存在两种特殊字符*与#,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)

(1) 星号井号代表通配符
(2) 星号代表多个单词,井号代表一个单词
(3) 路由功能添加模糊匹配
(4) 消息产生者产生消息,把消息交给交换机
(5) 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费

6.RPC

5401760be10b3dcaf0e7f7a.png

RabbitMQ中实现RPC的机制是:

客户端发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14中properties,这些属性会随着消息一起发送)中设置两个值replyTo(一个Queue名称,用于告诉服务器处理完成后将通知我的消息发送到这个Queue中)和correlationId(此次请求的标识号,服务器处理完成后需要将此属性返还,客户端将根据这个id了解哪条请求被成功执行了或执行失败)
服务器端收到消息并处理
服务器端处理完消息后,将生成一条应答消息到replyTo指定的Queue,同时带上correlationId属性
客户端之前已订阅replyTo指定的Queue,从中收到服务器的应答消息后,根据其中的correlationId属性分析哪条请求被执行了,根据执行结果进行后续业务处理

原文

# mybatis # Dubbo # Git # Https # ELK # Elasticsearch # logstash # Springboot # Nginx # Java # MQ
位运算 二进制转换
JDK-Tool
冰灯

冰灯

雁过无痕,敲出人生

23 日志
9 分类
11 标签
RSS
Github StackOverflow
Creative Commons
Links
  • 点滴记录
  • Zero
© 2021 冰灯