RabbitMQ入门(一)

1.初识MQ

1.1同步和异步通讯

微服务间通讯有同步和异步两种方式:

同步通讯:就像打电话,需要实时响应。
异步通讯:就像发微信,你给别人发了条消息,别人可能没看到,也可能压根不想理你,难么你就收不到消息,如果她哪天给你回复了,你就收到了。这种通讯时效性不太好,你不能立即得到回复。

既然异步通讯这么差,为什么还要用这种,那是因为它有自己的一些长处,同步通讯,像打电话,你正在跟一个妹子打电话,现在又有两个妹子给你打来电话,抱歉打不通,因为你只能同一时刻和一个妹子聊天。
但是微信聊天不一样啊,你发消息,不管是2个妹子还是3个妹子你都可以同时聊,所以异步通讯就是时间管理大师的必备技能啊。
小结:

两种方式各有优劣,打电话可以立即得到响应,但是你却不能跟多个人同时通话。发送微信可以同时与多个人收发信息,但是往往响应会有延迟。

1.1.1同步调用的问题
微服务间基于Feign的调用就属于同步方式,存在一些问题。

在这里插入图片描述

小结:
同步调用的优点:

> 时效性较强,可以立即得到结果

同步调用的问题:


> 耦合度高 
> 性能和吞吐能力下降
> 有额外的资源消耗 
> 有级联失败问题

1.1.2异步通讯
异步调用则可以避免上述问题:
异步调用常见实现就是事件驱动模式,什么是事件驱动呢?我们看一个案例。
在这里插入图片描述

用户支付时,肯定会调用我们的支付服务,而我们的支付服务完成支付以后,就需要订单服务,仓储服务,短信服务各自完成自己的业务。

但是我们是事件驱动模式,不能由支付服务来调用这三个服务,那怎么办呢?所以引入了一个东西叫做Broker(事件代理者)
在这里插入图片描述
什么是事件代理?代理什么事件?在我们这个业务当中,一旦有人支付成功就是一个事件,那么这个事件将来自然就交给了我们的broker去管理,那订单服务仓储服务和短信服务就会去找broker呀,说大哥将来真有人支付了,你得通知我们一下啊,这就叫做事件订阅。
在这里插入图片描述
那好了,一旦完成订阅,将来支付服务发现有人支付成功发布一个事件出去说,我这有人支付了订单是1001。
在这里插入图片描述
那broker就会拿起大喇叭通知这三个服务订单支付了。
在这里插入图片描述
这三个服务就去完成各自任务。
在事件模式中,支付服务是事件发布者(publisher),在支付完成后只需要发布一个支付成功的事件(event),事件中带上订单id。

订单服务和物流服务是事件订阅者(Consumer),订阅支付成功的事件,监听到事件后完成自己业务即可。

为了解除事件发布者与订阅者之间的耦合,两者并不是直接通信,而是有一个中间人(Broker)。发布者发布事件到Broker,不关心谁来订阅事件。订阅者从Broker订阅事件,不关心谁发来的消息。
在这里插入图片描述
Broker是一个像数据总线一样的东西,所有的服务要接收数据和发送数据都发到这个总线上,这个总线就像协议一样,让服务间的通讯变得标准和可控。

小结
优点:

吞吐量提升:无需等待订阅者处理完成,响应更快速。
故障隔离:服务没有直接调用,不存在级联失败问题
调用间没有阻塞,不会造成无效的资源占用
耦合度极低,每个服务都可以灵活插拔,可替换
流量削峰:不管发布事件的流量波动多大,都由Broker接收,订阅者可以按照自己的速度去处理事件

缺点:

架构复杂了,业务没有明显的流程线,不好管理
需要依赖于Broker的可靠、安全、性能

1.2什么是MQ
MQ(MessageQueue),中文是消息队列,字面来看就是存放消息的队列。也就是事件驱动架构中的Broker。
比较常见的MQ实现:
. ActiveMQ
. RabbitMQ
. RocketMQ
. Kafka
几种常见MQ的对比:
在这里插入图片描述
追求可用性: Kafka、RocketMQ、RabbitMQ
追求可靠性:RabbitMQ、RocketMQ
追求吞吐能力: RocketMQ、Kafka
追求消息低延迟:RabbitMQ、Kafka

文章参考自语雀

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

自xing且乐观~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值