欢迎关注我的公众号:石杉的架构笔记(ID:shishan100)
面试
周一至周五早8点半!精品技术文章准时送上!算法
以前给你们聊了一下,面试时若是遇到消息中间件这个话题,面试官上来可能问的两个问题:性能优化
关于这两个问题的回答,能够参见以前的两篇文章:服务器
在问完这两个问题以后,不一样风格的面试官可能会展开不一样的发问。网络
针对那种工做年限比较长的资深的同窗,可能会开始就候选人所在公司使用的消息中间件,深刻里面的技术细节,好比让你聊聊RocketMQ的架构原理和核心源码?架构
可是另一种面试风格,会先从大家的项目和业务入手进行考察,好比像下面这样:并发
好!这篇文章,我们从第二种风格来聊聊。异步
咱们会落地到某个具体业务系统的某个场景下,看看如何使用消息中间件,而后其效果是什么。分布式
业务场景的话,我们就用你们都很熟悉的电商业务为例,这里为了便于理解,对其作了必定的抽象和简化。微服务
你们仍是来考虑一个下订单的业务流程,好比你下个订单,此时须要干几件事情:
说明一下:上述环节,为了便于你们理解,作了简化。实际真正复杂的电商系统里,总体环节和业务流程会比这个复杂不少倍,并且耗时也绝对不是上面那么简单的。
老规矩!咱们仍是经过一张手绘图,来看看这整个的业务流程:
如上图,这个下订单的业务流程中:
更新订单状态(20ms) + 扣减商品库存(100ms) + 增长会员积分(80ms) + 附赠优惠券(50ms) = 250ms。
也就是说,仅仅是这4个流程的话,也就200多毫秒的耗时。
200多毫秒的耗时,对用户下单体验来讲是很是快速的,几乎就是一瞬间就完成了,不会感到过多的停顿,也就是一会儿就能够看到本身下单成功了。
可是,若是加上那个调度仓储发货呢?
那个环节须要读取大量的数据、使用多仓库/多货位的调度算法、还要跟C/S架构的仓储系统进行网络通讯,所以咱们这里假设这个环节可能会耗时数十秒。
一旦加上那个调度仓储发货的环节到这个下单流程里,就可能致使用户要等页面卡顿几十秒后才会看到下单成功的提示,这个用户体验就至关的差了。
按照以前一篇文章「Java进阶面试系列之一」大家系统架构中为什么要引入消息中间件?的说法。对于这种场景,彻底适合使用消息中间件来进行异步化调用。
也就是说,订单服务对仓储调度发货,仅仅是发送一个消息到MQ里,而后仓储服务消费消息以后再慢慢的执行调度算法,而后分配商品发货任务给对应的仓库便可。
这样的话,就能够把耗时几十秒的仓储调度发货的环节,从下单流程里摘除出去了。进而保证下单流程就仅仅是耗时200多毫秒而已。
至于那个耗时几十秒的仓储调度发货环节,咱们经过异步的方式慢慢执行便可,不会影响用户下单的体验。
以上过程,咱们一样来一张图,你们直观的感觉一下:
好!接下来咱们就假设你们在实际生产中还没用过消息中间件,我们从0开始,看看如何落地?
对于已经在生产中使用过消息中间件的小伙伴,不妨也看看,权当复习,温故知新!
咱们以RabbitMQ为例,假如你用的消息中间件是RabbitMQ,那么咱们对这个消息中间件应该如何安装和部署呢?
很简单,RabbitMQ的官方文档里提供了很是详细的安装部署步骤,你能够在本身的笔记本电脑本地安装,也能够在公司的服务器上部署。
如今假设你已经参考了官方文档并安装完成,那么接下来在代码层面应该怎么来引入RabbitMQ以及在系统里实现收发消息呢?
下面经过一些HelloWorld级别的代码和一些简单的示例图,给你们演示一下RabbitMQ是如何收发消息的。
对于不少在实际生产中使用过MQ的同窗,这些代码可能对实际生产中使用过MQ的同窗,显得太简单了。
不过考虑到不少初学者可能连用都没有用过MQ,甚至是才据说消息中间件不久,因此笔者认为这些demo代码以及手工绘图,仍是颇有必要。
好!看完了代码,这个时候,咱们能够经过一张图来想象一下两个服务之间的通讯。
订单服务你能够启动多个,不一样的订单服务均可以往一个RabbitMQ的queue里推送消息。
仓储服务你也能够启动多个,多个仓储服务会采用round-robin的轮询算法,每一个服务实例均可以从RabbitMQ queue里消费到一部分的消息。
上面的图里,订单服务在MQ专业术语中叫作“生产者”,英文是“Producer”,意思就是这个服务是专门负责生产消息投递到MQ的。
仓储服务在MQ专业术语中叫作“消费者”,英文是“Consumer”,意思就是这个服务专门是负责从MQ消费消息而后处理的。
这个时候,这套异步通讯的架构就能够跑起来了。
好了,到目前为止,虽然这个代码还存在很多问题,可是不要紧,大致上咱们已经给一些不太熟悉MQ技术的同窗,从一个比较形象易于理解简化后的电商业务场景出发,经过HelloWorld级别的示例代码和手工绘图,将MQ这个技术落地跑起来了。
更进一步,各位同窗彻底能够参照这个文章里的案例,思考一下:本身负责的项目里,有没有相似的业务场景可使用MQ的?
而后想办法在本身的项目里落地使用MQ的技术来作一下异步化,提高核心流程的性能。
这样将来在跳槽面试的时候,才能够作到游刃有余,有本身的一套东西能够说。
END
【Java进阶面试系列之四】哥们,若是消息中间件的消费者宕机了,会怎么样?【敬请期待】
若有收获,请帮忙转发,您的鼓励是做者最大的动力,谢谢!
一大波微服务、分布式、高并发、高可用的原创系列文章正在路上
欢迎扫描下方二维码,持续关注:
石杉的架构笔记(id:shishan100)
十余年BAT架构经验倾囊相授
推荐阅读:二、【双11狂欢的背后】微服务注册中心如何承载大型系统的千万级访问?
三、【性能优化之道】每秒上万并发下的Spring Cloud参数优化实战
六、大规模集群下Hadoop NameNode如何承载每秒上千次的高并发访问
七、【性能优化的秘密】Hadoop如何将TB级大文件的上传性能优化上百倍
八、拜托,面试请不要再问我TCC分布式事务的实现原理坑爹呀!
九、【坑爹呀!】最终一致性分布式事务如何保障实际生产中99.99%高可用?
十一、【眼前一亮!】看Hadoop底层算法如何优雅的将大规模集群性能提高10倍以上?
1六、亿级流量系统架构之如何设计全链路99.99%高可用架构
1八、大白话聊聊Java并发面试问题之volatile究竟是什么?
1九、大白话聊聊Java并发面试问题之Java 8如何优化CAS性能?
20、大白话聊聊Java并发面试问题之谈谈你对AQS的理解?
2一、大白话聊聊Java并发面试问题之公平锁与非公平锁是啥?
2二、大白话聊聊Java并发面试问题之微服务注册中心的读写锁优化
2三、互联网公司的面试官是如何360°无死角考察候选人的?(上篇)
2四、互联网公司面试官是如何360°无死角考察候选人的?(下篇)
2五、Java进阶面试系列之一:哥们,大家的系统架构中为何要引入消息中间件?