目录
1.MQ
RabbitMq可以分为两部分 rabbti 和 mq,rabbit指的是公司名、mq指的是消息队列(message queue)
1.1什么是MQ
消息队列(mq)是一种在应用程序之间传递消息的通信模式。它通常由生产者发送消息到队列(先进先出),然后再由消费者进行消费。
1.2 mq的作用
1. 应用解耦
现在有一个分布式的商城项目:它的支付服务的业务流程是 调用用户服务完成余额扣减,调用订单服务完成订单信息更新。
现在如果业务经理要求在支付成功后给用户发短信提示,那么就在支付服务中在添加调用信息服务就行了。
当是如果业务经理第二天要求,支付成功后添加积分服务,第三天要求不发短信了要发邮箱。此时整个代码就变得很臃肿。而且短信服务发生故障,可能导致整个支付服务的回滚,这显然是不好的。
那么此时我们可以在调用完用户服务后,使用消息队列发布一条消息:调用用户服务扣减余额完成了!。短信服务,订单服务进行订阅,订阅到这条信息后 短信服务,订单服务就开始执行。这样如果后面再添加服务,只要通过订阅信息的方式来执行不就可以解决支付服务臃肿的问题了。
2.异步提速
通过上面的应用解耦其实就完成了异步提速了,因为支付服务中的相关服务已经是一种并行执行的状态了。
总时间:20ms+20ms+20ms+20ms = 80ms
使用mq:
总时间:20ms + 20ms = 40ms
3. 削峰填谷
当某一时间段,比如双十一等节日请求突然暴增,这时如果使用了mq,那么消息队列机会把这些请求缓存下来,然后再根据它的自身拉取能力进行消费。
2.常见的几种MQ实现
RabbitMq | ActiveMq | RocketMq | Kafka | |
---|---|---|---|---|
公司/社区 | Rabbit | Apache | 阿里 | Apache |
开发语言 | Erlang | Java | Java | Scala&Java |
协议支持 | AMQP,XMPP,SMTP,STOMP | OpenWire,STOPMP,XMPP,AMQP | 自定义协议 | 自定义协议 |
可用性 | 高 | 一般 | 高 | 高 |
单机吞吐量 | 一般 | 差 | 高 | 非常高 |
消息延迟 | 微妙级 | 毫秒级 | 毫秒级 | 毫秒以内 |
消息可靠性 | 高 | 一般 | 高 | 一般 |
追求可用性:Kafka、 RocketMQ 、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力:RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka