MQ: Message queue 消息队列
MOM: Message Oriented Middleware 面向消息的中间件
两个主流实现方式:
JMS: java Message Server ,java消息服务,java规范类似jdbc:只能java语言实现 两种消息模型(点对点,发布订阅模式(比如微信公众号))
AMQP: Adviced Message Queue Protocol ,高级消息队列协议 本质协议,规范数据格式。 五种消息模型
三个主要作用:
异步处理
应用解耦
削峰填谷
四款主流mq产品
1、rocketMQ:apache 阿里贡献的
2.rabbitMQ:基于AMQP erlang(面向并发的语言)语言实现的
3.AcitveMq :apache 开源 基于JMS
4.kafka :大数据 吞吐量
RabbitMQ:
p: Producer 生产者,发送消息的应用程序
C:Consumer 消费者,接受并消费消息的应用程序
Q: queue 队列 接受、存储、转发消息
X: Exchange 交换机 接受、转发消息。 具体转发给哪些队列,取决去交换机类型
fanout类型:转发消息给所有队列
Direct:转发消息给RK符合的队列
Topic:RK支持通配符,*匹配一个词 #匹配任意多个
RK:RountingKey,路由键,生产者发送消息,队列绑定到交换机时,都可以指定Rk,只有Rk符合的队列才可以获取消息。
Channel:信道,默认一个链接有一个信道
Connection: 链接
如何避免消息堆积?
-
能者多劳:channel.basicQos(prefetch: 1)
-
多线程并发消费:concurrency。container启动的时候会根据设置的concurrency的值创建n个BlockingQueueConsumer。注意当队列的Exclusive(默认false)为true时,concurrency参数只能是1
-
默认情况下消费者只有一个信道来获取消息,一个信道只有一个cpu来处理 但现在都是多核cpu
如何避免消息丢失?
-
生产者确认机制:确保消息到达MQ
-
消息持久化:确保不会因为MQ服务器宕机导致消息丢失
-
消费者确认机制:确保消息被消费者正确无误的消费
确保以上3点,基本可以做到消息不丢失
生产者配置
spring:
rabbitmq:
host:192.168.231.100
port:5672
virtual-host:xxx
username:xx
password:xxx
publisher-confirm-type: simple #同步确认(阻塞) CORRELATED-异步确认
publiser-return:true #确认消息是否到达队列
消费者配置:
spring:
rabbitmq:
host:192.168.231.100
port:5672
virtual-host:xxx
username:xx
password:xxx
listener:
simple: # simple-listener容器使用一个额外线程处理消息 direct-listener(监听器)容器直接使用consumer线程
acknomledge-model: manual # 手动确认 auto自动 有异常就无限重试 none 不重试
prefetch:1 #能者多劳
concurrency:cpu核心数 #避免消息堆积,初始化多个消费者线程