RabbitMQ基于erlang语言: 是一种支持高并发的语言
RabbitMQ的工作模式:
1. simple简单模式
(1)消息产生者将消息放入队列
(2)消息的消费者(consumer) 监听(while) 消息队列,如果队列中有消息,就消费掉,消息被拿走后,自动从队列中删除(隐患 消息可能没有被消费者正确处理,已经从队列中消失了,造成消息的丢失)
(3)应用场景:聊天(中间有一个过度的服务器:p端,c端)
2. work工作模式(资源的竞争)
(1) 消息产生者将消息放入队列消费者可以有多个,消费者1,消费者2,同时监听同一个队列
(2) 消息被消费C1 C2共同争抢当前的消息队列内容,谁先拿到谁负责消费消息(隐患,高并发情况下,默认会产生某一个消息被多个消费者共同使用,可以设置一个开关(syncronize,与同步锁的性能不一样) 保证一条消息只能被一个消费者使用)
(3) 应用场景:红包;大项目中的资源调度(任务分配系统不需知道哪一个任务执行系统在空闲,直接将任务扔到消息队列中,空闲的系统自动争抢)
3. publish/subscribe发布订阅(Exchange 共享资源)
(1) X(Exchange)代表交换机rabbitMQ内部组件,消息产生者将消息放入交换机,交换机发布订阅把消息发送到所有消息队列中,对应消息队列的消费者拿到消息进行消费
(2) 相关场景:邮件群发,群聊天,广播(广告)
4. routing路由模式
(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 主题模式(路由模式的一种)
binding key中可以存在两种特殊字符*
与#
,用于做模糊匹配,其中“*”用于匹配一个单词,“#”用于匹配多个单词(可以是零个)
(1) 星号井号代表通配符
(2) 星号代表多个单词,井号代表一个单词
(3) 路由功能添加模糊匹配
(4) 消息产生者产生消息,把消息交给交换机
(5) 交换机根据key的规则模糊匹配到对应的队列,由队列的监听消费者接收消息消费
6.RPC
RabbitMQ中实现RPC的机制是:
客户端发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14中properties,这些属性会随着消息一起发送)中设置两个值replyTo(一个Queue名称,用于告诉服务器处理完成后将通知我的消息发送到这个Queue中)和correlationId(此次请求的标识号,服务器处理完成后需要将此属性返还,客户端将根据这个id了解哪条请求被成功执行了或执行失败)
服务器端收到消息并处理
服务器端处理完消息后,将生成一条应答消息到replyTo指定的Queue,同时带上correlationId属性
客户端之前已订阅replyTo指定的Queue,从中收到服务器的应答消息后,根据其中的correlationId属性分析哪条请求被执行了,根据执行结果进行后续业务处理