【Java进阶面试系列之二】:哥们,那你说说系统架构引入消息中间件有什么缺点?

欢迎关注我的公众号:石杉的架构笔记(ID:shishan100)
面试

周一至周五早8点半!精品技术文章准时送上!算法


1、前情回顾

上篇文章「Java进阶面试系列之一」大家系统架构中为什么要引入消息中间件?,给你们讲了讲消息中间件引入系统架构的做用,主要是解决哪些问题的。数据库

其比较常见的实践场景是:性能优化

  • 复杂系统的解耦
  • 复杂链路的异步调用
  • 瞬时高峰的削峰处理


2、正式开始

这篇文章给你们讲讲,若是你在系统架构里引入了消息中间件以后,会有哪些缺点?网络

1)系统可用性下降架构

首先是你的系统总体可用性绝对会下降,给你举个例子,咱们就拿以前的一幅图来讲明。并发

好比说一个核心链路里面,系统A -> 系统B -> 系统C,而后系统C是经过MQ异步调用系统D的。异步

看起来很好,你用这个MQ异步化的手段解决了一个核心链路执行性能过差的问题。分布式

可是你有没有考虑另一个问题,就是万一你依赖的那个MQ中间件忽然挂掉了怎么办?这个还真的不是异想天开,MQ、Redis、MySQL这些组件都有可能会挂掉。微服务

一旦你的MQ挂了,就致使你的系统的核心业务流程中断了。原本你要是不引入MQ中间件,那其实就是一些系统之间的调用,可是如今你引入了MQ,就致使你多了一个依赖。一旦多了一个依赖,就会致使你的可用性下降。

所以,一旦引入了MQ中间件,你就必须去考虑这个MQ是如何部署的,如何保证高可用性。

甚至在复杂的高可用的场景下,你还要考虑若是MQ一旦挂了之后,你的系统有没有备用兜底的技术方案,能够保证系统继续运行下去。

以前写过两篇文章,都涉及到了MQ挂掉以后的高可用保障方案。

大伙若是感兴趣,能够参考一下:


经过这两篇文章,具体看看咱们在各类场景下遇到MQ故障采起的高可用降级方案。

2)系统稳定性下降

仍是上面那张图,你们再来看一下。

不知道你们有没有发现一个问题,这个链路除了MQ中间件挂掉这个可能存在的隐患以外,可能还有一些其余的技术问题。

好比说,莫名其妙的,系统C发了一个消息到MQ,结果那个消息由于网络故障等问题,就丢失了。这就致使系统D没有收到那条消息。

这可就惨了,这样会致使系统D没完成本身该作的任务,此时可能整个系统会出现业务错乱,数据丢失,严重的bug,用户体验不好等各类问题。

这还只是其中之一,万一说系统C给MQ发送消息,不当心一抽风重复发了一条如出一辙的,致使消息重复了,这个时候该怎么办?

可能会致使系统D一会儿把一条数据插入了两次,致使数据错误,脏数据的产生,最后同样会致使各类问题。

或者说若是系统D忽然宕机了几个小时,致使没法消费消息,结果大量的消息在MQ中间件里积压了好久,这个时候怎么办?

即便系统D恢复了,也须要慢慢的消费数据来进行处理。

因此这就是引入MQ中间件的第二个大问题,系统稳定性可能会降低,故障会增多,各类各样乱七八糟的问题均可能产生。

并且一旦产生了一个问题,就会致使系统总体出问题。就须要为了解决各类MQ引起的技术问题,采起不少的技术方案。

关于这个,咱们后面会用专门的文章聊聊MQ中间件的这些问题的解决方案,包括:

  • 消息高可靠传递(0丢失)
  • 消息幂等性传递(绝对不重复)
  • 百万消息积压的线上故障处理


3)分布式一致性问题

引入消息中间件,还有分布式一致性的问题。

举个例子,好比说系统C如今处理本身本地数据库成功了,而后发送了一个消息给MQ,系统D也确实是消费到了。

可是结果不幸的是,系统D操做本身本地数据库失败了,那这个时候咋办?

系统C成功了,系统D失败了,会致使系统总体数据不一致了啊。

因此此时又须要使用可靠消息最终一致性的分布式事务方案来保障。

关于这个,能够参考以前的一篇文章:

最终一致性分布式事务如何保障实际生产中99.99%高可用?

咱们在里面详细阐述了系统之间异步调用场景下,如何采用分布式事务方案保证其数据一致性。


3、总结

最后,咱们来作一个简单的小结。

在面试中要答好这个问题,首先必定要熟悉MQ这个技术的优缺点。了解清楚把他引入系统是为了解决哪些问题的,可是他自身又会带来哪些问题。

此外,对于引入MQ之后,是否对他自身可能引起的问题有一些方案的设计,来保证你的系统高可用、高可靠的运行,保证数据的一致性。这个也有作好相应的准备。


END




若有收获,请帮忙转发,您的鼓励是做者最大的动力,谢谢!


一大波微服务、分布式、高并发、高可用的原创系列文章正在路上

欢迎扫描下方二维码,持续关注:


石杉的架构笔记(id:shishan100)

十余年BAT架构经验倾囊相授


推荐阅读:

一、拜托!面试请不要再问我Spring Cloud底层原理

二、【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?

三、【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战

四、微服务架构如何保障双11狂欢下的99.99%高可用

五、兄弟,用大白话告诉你小白都能听懂的Hadoop架构原理

六、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问

七、【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百倍

八、拜托,面试请不要再问我TCC分布式事务的实现原理坑爹呀!

九、【坑爹呀!】最终一致性分布式事务如何保障实际生产中99.99%高可用?

十、拜托,面试请不要再问我Redis分布式锁的实现原理!

十一、【眼前一亮!】看Hadoop底层算法如何优雅的将大规模集群性能提高10倍以上?

十二、亿级流量系统架构之如何支撑百亿级数据的存储与计算

1三、亿级流量系统架构之如何设计高容错分布式计算系统

1四、亿级流量系统架构之如何设计承载百亿流量的高性能架构

1五、亿级流量系统架构之如何设计每秒十万查询的高并发架构

1六、亿级流量系统架构之如何设计全链路99.99%高可用架构

1七、七张图完全讲清楚ZooKeeper分布式锁的实现原理

1八、大白话聊聊Java并发面试问题之volatile究竟是什么?

1九、大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?

20、大白话聊聊Java并发面试问题之谈谈你对AQS的理解?

2一、大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?

2二、大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化

2三、互联网公司的面试官是如何360°无死角考察候选人的?(上篇)

2四、互联网公司面试官是如何360°无死角考察候选人的?(下篇)

2五、Java进阶面试系列之一:哥们,大家的系统架构中为何要引入消息中间件?

相关文章
相关标签/搜索