从ActiveMQ开始理解MQ

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,业务判断幂等。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值