MQ:Message Queue,消息队列
MOM:Message Oriented Middleware,面向消息的中间件
主流实现方式:
JMS:Java Message Service,java消息服务。java规范;只能使用java实现;只有两种消息模型。(ActiveMQ)
AMQP:Advanced Message Queueing Protocol,高级消息队列协议。本质上是协议,只规定了数据格式;任何语言都可以实现;可以有任意多种消息模型。(RabbitMQ)
三个主要作用:
1.异步
2.解耦
3.削峰填谷
主流产品:
1.ActiveMQ:Apache,基于JMSjava
2.RabbitMQ:独立社区(spring) 基于AMQP实现 ,用erlang语言实现(erlang面向并发的编程语言)
3.RocketMQ:阿里开源 贡献给apache
4.Kafka:Apache 追求吞吐量
RabbitMQ:
Connection:连接
Channel:管道 信道 默认一个连接只有一个信道
Exchange:交换机,接受消息并转发消息
Fanout:转发消息给所有队列
Direct:指定RK(RoutingKey),符合RK的队列可以获取消息
Topic:通配符 *(匹配一个单词) #(匹配任意多个)
Queue:队列,接受 转发 存储消息
RoutingKey:路由键
Producer:生产者,发送消息的应用程序
Consumer:消费者,接受并消费消息的应用程序
五种消息模型:
1.简单模型(Simple) 一个生产者 一个队列 一个消费者 2.工作模型(work queue) 一个生产者 一个队列 多个消费者 消息只能被一个消费者消费 能者多劳(Fair Dispatch 公平分发):channel.basicQos(1) 3.发布订阅(publish/subscribe) 一个生产者 一个交换机 多个队列 每个队列有自己的消费者 4.路由模型(route) 多了一个routingKey 5.通配模型(Topic)
简单面试题
1.怎么避免消息堆积?
1.搭建消费者集群(工作队列) 配合能者多劳、公平分发 2.多线程消费
2.怎么避免消息丢失?
1.生产者确认 2.消息持久化:交换机持久化 队列持久化 消息持久化 3.消费者确认:basicAck



