三个概念
- 生产者:生产消息的服务
- 消息代理:消息中间件,如RabbitMQ
- 消费者:获取使用消息的服务
消息队列到达消费者的两种形式
队列(queue):点对点消息通信(point-to-point)
消息进入队列,消费者监听队列,一旦有消息则获取消息,消息被获取后移除队列。
队列可以被多个消费者监听,但是只有一个可以获取。主题(topic):发布(publish)/订阅(subscribe)消息通信|
发布者(生产者)发送消息到主题,多个订阅者(消费者)订阅(监听)这个主题,则在消息到达的同时就会同时得到消息
两种常见的消息中间件协议
JMA:(Java Message Servier) Java 消息服务
-基于JVM消息代理规范。ActiveMQ、HornetMQ是JMS实现AMQP:(Advanced Message Queuing Protocol)
-高级消息队列协议,兼容JMS
-RabbitMQ是AMOP的实现。主要区别 JMS AMOP 跨语言 否 是 跨平台 否 是 model 1) point-to-point 点对点
2)topic 主题1)direct exchange(直接交换机)—点对点
2)fanout exchange
3)topic exchange
交换机类型
direct(直接)、fanout(扇出)、topic(主题)、headers
direct
路由键需要与binding全匹配才行
fanout–广播模式
不处理绑定和路由键,收到消息直接全部发送,类似广播
topic
需要绑定关系(binding)和路由键(routing key)按一定规则匹配,路由键和绑定关系分割成单词,单词间用".“隔开。同时会识别两个通配符”#“和”*“。”#"匹配0个或多个单词 "*"匹配一个单词
RabbitMQ的执行流程
生产者:建立一个长连接,通过连接里面的信道发送消息-指定哪一个交换机。
消息message:头+体:消息头中有一个很重要的路由键 (Routing Key)
RabbitMQ:消息到达中间件,服务器会交给交换机(exchange),交换机会根据消息中的路由键(routing key)去寻找对应的绑定关系(binding),然后消息入队。
**消费者:**建立一个长连接,每个长连接会有很多信道。每个信道用来监听队列
消息确认机制
confirmCallback:消息达到消息服务(broker),就会执行。集群模式下,要被所有的代理都接受到才会执行。
returnCallback:交换机到队列投递失败后执行。
ack:消费者获取消息后自动确认,服务端会删除这个消息。需改为手动确认。否则宕机后会消息丢失。调用channel.basicAck()方法签收