系统架构中,消息中间件起到了什么作用?

95后程序猿小A


现在大型网站架构技术中,有一个高频词就是“消息中间件”,我们在很多大公司分享的技术PPT或者岗位要求里都会看到这个名词。什么是消息中间件呢以及它能解决什么问题呢?

什么是消息中间件?

通过消息中间件可以让不同的系统模块通过传递消息的方式来激活对方的事件以完成相应的操作。消息中间件本质上也算是一种队列,支持同步或异步方式来传输消息。

一般情况下我们把消息中间件简称为MQ。

消息中间件在架构中发挥了重要作用

通过消息中间件可以帮我们解决很多问题,比如说:

1、系统解耦

比如一个用户注册流程,可能涉及这些操作:

  • 向用户库中写入数据;

  • 向相关附加表中写入数据;

  • 发送欢迎短信、邮件、站内信等。

在没有使用消息中间件时,这些操作可能都是阻塞式的一步一步进行着,万一某个环节出现异常后续环节可能就无法进行了,这就是典型的高耦合!但当我们引入消息中间件后,用户注册成功后只要生产一条消息,然后由不同的消费者(模块)去消费(执行特定操作),这样系统间的耦合度就低了。

2、异步调用

上面举的会员注册的例子同样适用于此处,同步阻塞式调用会使得调用链时间周期过长,而异步调用极大的缩短了调用链的时间。

3、队列缓冲

消息中间件就像一个蓄水池,可将大量请求存储下来让后台逐一处理,所以像秒杀系统都少不了消息系统。

主流的消息中间件产品

现在市面上有很多消息中间件,应用最为广泛的主要有:RabbitMQ、Kafka、RocketMQ、ActiveMQ等。

以上就是我的观点,对于这个问题大家是怎么看待的呢?欢迎在下方评论区交流 ~ 我是科技领域创作者,十年互联网从业经验,欢迎关注我了解更多科技知识!

网络圈


现在很多系统都引入的消息中间件,我们公司现在也有基于RabbitMQ的消息中间件平台,如果项目需要使用的MQ的话,只需要申请即可;那么引入消息中间件是为了解决什么问题,我谈谈自己的看法:

异步调用

我们有很多业务系统,实际上实时性要求并没有那么高,完全是可以进行异步调用的。

  • 我曾经做过一个系统是客服通知性质的系统,比如客户十天后需要缴费了,那么我们会根据原始数据+模板,生成短信通知,然后发送给短信平台进行短信发送。这个短信平台提供了一个接口,其他系统如果想要发送短信的话,只要把手机号+短信内容通过接口发送给短信平台,再由短信平台和各个服务商进行对接。这个场景就非常适合改成异步调用,只需要把待发送短信扔到消息队列中,再由短信平台取出待发送短信,进行发送。

  • 再举个例子,如果一个服务有调用链路,比如A->B->C,假如A调B速度很快,但是B调C速度较慢或不稳定,那么可以评估一下C是不是可以做异步调用,这样可以在不影响业务流程的前提下,加快服务的响应速度。

系统解耦

不知道大家有没有遇到过这样的问题,A系统有一些数据,B系统需要这些数据。

一种方法是B系统调用A系统的接口进行查询,但是由于数据的状态可能会发生变化,B系统需要在数据变化的时候做一些业务操作,这时候需要A系统在数据有变化的时候,主动通知B系统;那么可以B系统提供一个接口,A系统主动通知;这样做实现起来没有问题,但是困难也比较大:

  1. 通知过程中有问题,比如B系统down掉了、B系统在发布,那么A系统需要考虑重发的问题;
  2. 如果数据多、变化快,那么会对B系统带来很大的压力(不停地进行接口调用);
  3. C系统说,我也想要这些数据,我也做个接口你通知一下我吧;
  4. DEFG系统说...我也想要...A系统开发猝...

那么最好的解决方案是:A系统将数据发送到MQ中,哪些系统需要的话,就去消费(需要被授权);如果哪天某个系统下线了,就取消消费。

流量缓冲

我们之前做过的一个项目,大概功能是这样的。(秒杀系统经常会用到,但是因为这个系统是我们一个实际项目,所以就用这个项目举例了)

A系统对外提供接口,有内网系统调用,也有互联网端的系统调用;互联网端的流量不好估计,如果接口压力过大的话,很有可能把A系统压垮,从而影响到业务流程。于是我们在A系统和互联网端之间,增加了一层,功能也很简单,接收到请求之后,直接扔到MQ中,再由一个程序匀速地从MQ里面拿请求出来,调用A系统;这样就起到了一个流量缓冲的作用。(并没有让互联网端的系统和A系统改造,他们唯一要做的就是改一下接口地址)。

能想到也就这么多了,欢迎大家补充。

希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。


会点代码的大叔


消息中间件,在目前主流的架构中已经成了不可或缺的一部分,作用的话无外乎这几种:解耦、异步、削峰限流,达到系统的高可用。目前比较主流的消息中间件有Kafka、RabbitMQ、ActiveMQ、RocktMQ等,Redis也可以做消息中间件哦,具体可根据实际使用场景来选择。下面我们来看下这几个主要作用,

1、系统解耦

解决的问题就是N个系统糅合在一起,相互调用,一团糟,如下图

然后,我们进行系统的改造,加入消息中间件来理清楚上面这些纷纷扰扰的关联,

这样是不是很清晰了,系统之间不会耦合在一起了,就达到了解耦的效果,在分布式的大型系统中,这个功能尤为重要。

2、异步调用

异步调用,主要解决的是同步阻塞和耗时的问题,比如,只有做完B才能到C,耗时的话也是20+200ms。

加入消息中间件,改成异步调用后,A可以同时调用B和C,时间也减少了,提高效率。

3、削峰限流

削峰限流主要解决的是高并发的大访问量场景情况下,在服务前面加一层缓冲,由消息中间件做一层过滤,如果流量太大的话就会被舍弃一部分,其他未被舍弃的部分进入队列排队,保护了后端服务的可用性。

差不多,先写这些吧。


技术大咖秀


消息中间件主要有三个作用:系统间解耦,异步化,流量削峰。我们通过实例来说明。

1 系统间解耦

假设你在一个电商系统购物,支付成功后,系统应该怎么把这个消息告诉物流系统?有两种思路:

方式一:支付系统直接调用物流系统。这样会有一个问题:支付系统和物流系统产生了强依赖,当物流系统出现问题,直接影响用户交易流程,导致支付失败。

方式二:支付系统把支付成功消息推送给消息中间件,然后交易流程结束。物流系统订阅这个消息进行后续处理。这样即使物流系统出现问题,也不影响交易系统。


2 异步化

假设物流系统处理业务需要100毫秒。

采用方式一:整个链路响应时长就增加了100毫秒,耗时增加。

采用方式二:整个链路时长就不需要增加这100毫秒,这就是异步化带来的性能提升。


3 流量削峰

假设双11商家做秒杀活动,每秒产生了大量订单数据。

采用方式一:支付系统压力就会传递给物流系统,这是没有必要的。

采用方式二:物流系统可以根据系统能力,匀速拉取数据处理,削减了流量洪峰。


敬请关注

请点击关注按钮【IT徐胖子】会持续为大家奉献互联网和技术干货内容,感谢支持


IT徐胖子


做分区容错吧


分享到:


相關文章: