面试官:聊聊消息中间件在你们的项目业务里是如何落地的?

公众号后台回复“学习”,获取作者独家秘制精品资料


640?wx_fmt=png

640?wx_fmt=jpeg

扫描下方海报二维码,试听课程:

(课程详细大纲,请参见文末)


640?wx_fmt=jpeg


640?wx_fmt=png


业务场景介绍


这篇文章,我们通过落地到某个具体业务系统的某个场景,看看如何使用消息中间件,然后其效果是什么。


业务场景的话,咱们就用大家都很熟悉的电商业务为例,这里为了便于理解,对其做了一定的抽象和简化。


还是来考虑一个下订单的业务流程,比如你下个订单,此时需要干几件事情:


  1. 更新订单状态为“待发货”(耗时20ms)

  2. 扣减商品库存(耗时100ms)

  3. 增加会员积分(耗时80ms)

  4. 附赠优惠券(耗时50ms)

  5. 仓储调度发货(耗时几十秒)


说明一下:上述环节,为了便于大家理解,做了简化。实际真正复杂的电商系统里,整体环节和业务流程会比这个复杂很多倍,而且耗时也绝对不是上面那么简单的。


我们还是通过一张手绘图,来看看这整个的业务流程:

640?wx_fmt=png


如上图,这个下订单的业务流程中:


更新订单状态(20ms) +  扣减商品库存(100ms) +  增加会员积分(80ms) +  附赠优惠券(50ms) =  250ms。


也就是说,仅仅是这4个流程的话,也就200多毫秒的耗时。


200多毫秒的耗时,对用户下单体验来说是非常快速的,几乎就是一瞬间就完成了,不会感到过多的停顿,也就是一下子就可以看到自己下单成功了。


但是,如果加上那个调度仓储发货呢?


那个环节需要读取大量的数据、使用多仓库/多货位的调度算法、还要跟C/S架构的仓储系统进行网络通信,因此我们这里假设这个环节可能会耗时数十秒。


一旦加上那个调度仓储发货的环节到这个下单流程里,就可能导致用户要等页面卡顿几十秒后才会看到下单成功的提示,这个用户体验就相当的差了。


对于这种场景,完全适合使用消息中间件来进行异步化调用。


也就是说,订单服务对仓储调度发货,仅仅是发送一个消息到MQ里,然后仓储服务消费消息之后再慢慢的执行调度算法,然后分配商品发货任务给对应的仓库即可。


这样的话,就可以把耗时几十秒的仓储调度发货的环节,从下单流程里摘除出去了。进而保证下单流程就仅仅是耗时200多毫秒而已。


至于那个耗时几十秒的仓储调度发货环节,我们通过异步的方式慢慢执行即可,不会影响用户下单的体验。


以上过程,如下图所示:

640?wx_fmt=png



初步落地


好!接下来我们就假设大家在实际生产中还没用过消息中间件,咱们从0开始,看看如何落地?


对于已经在生产中使用过消息中间件的小伙伴,不妨也看看,权当复习,温故知新!


我们以RabbitMQ为例,假如你用的消息中间件是RabbitMQ,那么我们对这个消息中间件应该如何安装和部署呢?


很简单,RabbitMQ的官方文档里提供了非常详细的安装部署步骤,你可以在自己的笔记本电脑本地安装,也可以在公司的服务器上部署。


现在假设你已经参考了官方文档并安装完成,那么接下来在代码层面应该怎么来引入RabbitMQ以及在系统里实现收发消息呢?


下面通过一些HelloWorld级别的代码和一些简单的示例图,给大家演示一下RabbitMQ是如何收发消息的。


对于很多在实际生产中使用过MQ的同学,这些代码可能对实际生产中使用过MQ的同学,显得太简单了。


不过考虑到很多初学者可能连用都没有用过MQ,甚至是才听说消息中间件不久,所以笔者认为这些demo代码以及手工绘图,还是很有必要。


640?wx_fmt=png


640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg


好!看完了代码,这时我们可以通过一张图来想象一下两个服务之间的通信。


订单服务你可以启动多个,不同的订单服务都可以往一个RabbitMQ的queue里推送消息。


仓储服务你也可以启动多个,多个仓储服务会采用round-robin的轮询算法,每个服务实例都可以从RabbitMQ queue里消费到一部分的消息。

640?wx_fmt=png

上面的图里,订单服务在MQ专业术语中叫做“生产者”,英文是“Producer”,意思就是这个服务是专门负责生产消息投递到MQ的。


仓储服务在MQ专业术语中叫做“消费者”,英文是“Consumer”,意思就是这个服务专门是负责从MQ消费消息然后处理的。


这个时候,这套异步通信的架构就可以跑起来了。


好了,到目前为止,虽然这个代码还存在不少问题,但是没关系,大体上我们已经给一些不太熟悉MQ技术的同学,从一个比较形象的简化后的电商业务场景出发,通过HelloWorld级别的示例代码和手工绘图,将MQ这个技术落地跑起来了。


更进一步,各位同学完全可以参照这个文章里的案例,思考一下:自己负责的项目里,有没有类似的业务场景可以使用MQ的?


然后想办法在自己的项目里落地使用MQ的技术来做一下异步化,提升核心流程的性能。


这样未来在跳槽面试的时候,才可以做到游刃有余,有自己的一套东西可以说。


END

如有收获,请划至底部,点击“在看”,谢谢!


640?wx_fmt=png


《21天互联网Java进阶面试训练营(分布式篇)》详细目录,扫描图片末尾的二维码,试听课程

640?wx_fmt=jpeg

640?wx_fmt=jpeg

640?wx_fmt=jpeg


640?wx_fmt=png

欢迎长按下图关注公众号石杉的架构笔记


640?wx_fmt=jpeg

BAT架构经验倾囊相授



640
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值