1:什么是MQ,为什么要用MQ
MQ 就是消息中间件,能够 让实现 流量削峰、业务解耦、异步调用。
流量削峰:可以让批量请求排队,后台一个一个执行。
业务解耦:不同模块之间进行通信
异步调用:模块间的消息推送
另外,除了看到了优点,缺点也是需要关注的。
缺点是:复杂度上升、可用性下级(如果MQ挂了)、会有数据一致性(多个消费者消费数据,一个消费者消费出错)问题。
2:MQ需要有什么功能
1)、发送和接收消息
2)高可用,可以集群和容错
3)可持久化
4)延迟投递、定时投递、签收等
5)事物
3:MQ对比
ActiveMQ:java实现,老牌的apache MQ,稳定,性能没有那么好
Kafka:scala(也是运行在JVM上)实现,基于日志,吞吐量最高(10w级别),理论上会有重复消息,大数据领域用他。
RocketMQ:java实现,阿里巴巴开发的,参照kafka的思路,功能强大,吞吐量w级别,性能优越
RabbitMQ:Erlang实现,吞吐量w级别,性能优越
Redis实现MQ:
1):基于 LPUT/BRPOP实现,优点就是简单,灵活,缺点就是,消息确认比较麻烦,重复消费也麻烦。
2):PUB/SUB模式,优点:广播,消息可以多个接收,缺点:消息发送后就不管了,没有持久化,消息积压会导致消息丢失。
4:ActiveMQ:
1):队列模式(QUEUE):一个消息对应一个消费者,生产者和消费者之间没有时间上的关联性。
也就是生产者生产消息到消息队列,消费者什么时候去消费都是可以的。默认是有持久化的。
2)Topic模式,一对多,每个消息有多个消费者。有持久订阅和非持久订阅两种。
持久化:如果MQ进程关了,那么再队列中的消息还会存在。Queue模式是默认持久化的,Topic模式是默认非持久化的。
ActiveMQ主要设置:
Message:消息头、消息体、消息属性
可以设置 消息 持久和非持久(可以对一条消息来)
可以设置消息的过期时间(默认永远不过期)
可以设置消息的优先级(0到9基本,0到4是普通消息,5到9是加急消息)
可以设置消息ID
Message消息体(主要用text和map)
TextMessage
MapMessage
ByteMessage
StreamMessage
ObjectMessage
消息属性:(属性名-属性值)
textMessage.setStringProperty("dataType","11")
5:ActiveMQ事物和签收
生产者 如果设置了事物,需要commit,如果没有commit,那么消息发送不出去。
消费者 如果设置了事物,需要进行commit,如果没有commit,那么消息可以重复消费。
签收:自动签收(默认)、手动签收、允许重复的签收(不怎么用)
非事物手动签收:生产者如果设置了手动签收,客户端需要 acknowledge(),不然消费者可以重复消费。
开了事物手动签收:客户端如果按照事物提交,那就是签收了,不用显示调用ack
客户端开了事物,如果ack()签收但没有commit(),消费者可以重复消费。
事物优先级大于签收。
6:其它重点关注内容
1:消息丢失:当ActiveMQ挂了,会导致生产者的生产的消息丢失了。解决这个问题的方法是生产者生产消息后,异步接收回调,判断是否有发送成功。
2:定时投递、延迟投递:ActiveMQ自带定时和延迟这种schedl属性,设置即可。
3:消息重试(对于接收端)
用了事物,进行了rollback()或者没有commit
消息如果是需要签收的,如果没有进行显示签收 ack()
默认重发次数6此,重发间隔时间1秒,有毒消息,放在 DLQ(死信队列)
死信队列:可以放过期的放在死信队列,可以把非持久的也放在死信队列
4:幂等性:用消息MessageId,业务判断幂等。