网友提问:
系统架构中,消息中间件起到了什么作用?
优质回答:
现在很多系统都引入的消息中间件,我们公司现在也有基于RabbitMQ的消息中间件平台,如果项目需要使用的MQ的话,只需要申请即可;那么引入消息中间件是为了解决什么问题,我谈谈自己的看法:
异步调用
我们有很多业务系统,实际上实时性要求并没有那么高,完全是可以进行异步调用的。
我曾经做过一个系统是客服通知性质的系统,比如客户十天后需要缴费了,那么我们会根据原始数据+模板,生成短信通知,然后发送给短信平台进行短信发送。这个短信平台提供了一个接口,其他系统如果想要发送短信的话,只要把手机号+短信内容通过接口发送给短信平台,再由短信平台和各个服务商进行对接。这个场景就非常适合改成异步调用,只需要把待发送短信扔到消息队列中,再由短信平台取出待发送短信,进行发送。
再举个例子,如果一个服务有调用链路,比如A->B->C,假如A调B速度很快,但是B调C速度较慢或不稳定,那么可以评估一下C是不是可以做异步调用,这样可以在不影响业务流程的前提下,加快服务的响应速度。
系统解耦
不知道大家有没有遇到过这样的问题,A系统有一些数据,B系统需要这些数据。
一种方法是B系统调用A系统的接口进行查询,但是由于数据的状态可能会发生变化,B系统需要在数据变化的时候做一些业务操作,这时候需要A系统在数据有变化的时候,主动通知B系统;那么可以B系统提供一个接口,A系统主动通知;这样做实现起来没有问题,但是困难也比较大:
通知过程中有问题,比如B系统down掉了、B系统在发布,那么A系统需要考虑重发的问题;
如果数据多、变化快,那么会对B系统带来很大的压力(不停地进行接口调用);
C系统说,我也想要这些数据,我也做个接口你通知一下我吧;
DEFG系统说…我也想要…A系统开发猝…
那么最好的解决方案是:A系统将数据发送到MQ中,哪些系统需要的话,就去消费(需要被授权);如果哪天某个系统下线了,就取消消费。
流量缓冲
我们之前做过的一个项目,大概功能是这样的。(秒杀系统经常会用到,但是因为这个系统是我们一个实际项目,所以就用这个项目举例了)
A系统对外提供接口,有内网系统调用,也有互联网端的系统调用;互联网端的流量不好估计,如果接口压力过大的话,很有可能把A系统压垮,从而影响到业务流程。于是我们在A系统和互联网端之间,增加了一层,功能也很简单,接收到请求之后,直接扔到MQ中,再由一个程序匀速地从MQ里面拿请求出来,调用A系统;这样就起到了一个流量缓冲的作用。(并没有让互联网端的系统和A系统改造,他们唯一要做的就是改一下接口地址)。
能想到也就这么多了,欢迎大家补充。
希望我的回答,能够帮助到你!我将持续分享Java开发、架构设计、程序员职业发展等方面的见解,希望能得到你的关注。
其他网友回答
消息中间件主要有三个作用:系统间解耦,异步化,流量削峰。我们通过实例来说明。
1 系统间解耦
假设你在一个电商系统购物,支付成功后,系统应该怎么把这个消息告诉物流系统?有两种思路:
方式一:支付系统直接调用物流系统。这样会有一个问题:支付系统和物流系统产生了强依赖,当物流系统出现问题,直接影响用户交易流程,导致支付失败。
方式二:支付系统把支付成功消息推送给消息中间件,然后交易流程结束。物流系统订阅这个消息进行后续处理。这样即使物流系统出现问题,也不影响交易系统。
2 异步化
假设物流系统处理业务需要100毫秒。
采用方式一:整个链路响应时长就增加了100毫秒,耗时增加。
采用方式二:整个链路时长就不需要增加这100毫秒,这就是异步化带来的性能提升。
3 流量削峰
假设双11商家做秒杀活动,每秒产生了大量订单数据。
采用方式一:支付系统压力就会传递给物流系统,这是没有必要的。
采用方式二:物流系统可以根据系统能力,匀速拉取数据处理,削减了流量洪峰。
敬请关注
请点击关注按钮【IT徐胖子】会持续为大家奉献互联网和技术干货内容,感谢支持
其他网友回答
做分区容错吧