张家村的历史Java帝国的张家村正在迎来一场大变革。5年前网购刚起步的时候,帝国很看好,决定进军这个领域,于是建了张家村,在这里安装了Java虚拟机和数据库,然后部署了基于web的订单系统和库存系统。张家村的人负责操作。张家村的老村长很清楚,这两种制度其实是一种逻辑上的划分方式。在物理上,两个系统仍然部署在一个虚拟机中。当时用户量少,数据量也不大。村民们只需要使用这个Java虚拟机和数据库即可。订单和库存系统一直运行良好。当用户的订单到来时,会存储在订单系统中,然后通知库存系统发货。你想问怎么通知?老村长会告诉你:其实很简单,就是直接调用一个普通的Java方法,调用库存系统某个类的某个方法就可以了。因为是在同一个虚拟机内,所以效率极高。转眼五年过去了,人类变得更懒惰,更喜欢网购,用户和数据量暴增。再加上他们时不时搞点闪杀活动,让张家村的人更加吃不消了。为了应对涌入的订单,张家村经常通宵通宵,全村人三班倒也勉强应付。老村长多次向镇里汇报,都没有得到回应。如果不是帝国的性能监控部门发现了这个异常,不知道还能隐藏多久。好在钦差王大人在,变法在即。王总拆解经验丰富,目光如炬,一眼就看出问题所在,当即下达第一道命令:劈!分离订单系统和库存系统!老村长说:拆了之后,我们村还是放不下。王先生说:“订单系统留在张家村,库存系统搬到李家庄。”老村长心想,订单系统是直接面向用户的,这点很重要,张家村一定要保留。至于库存系统,主要是后台操作,搬走就好了,就同意了。没那么容易,订单和库存是紧耦合的,现在要把库存系统搬到李家庄的Java虚拟机和数据库上,难免会很麻烦,在王总的指导下,原来直接Java方法调用也改成了Web服务——张家村和李家庄虽然相距较远,但仍然有互联网连接,现在用户下单后,先存储在张家村,然后张家村调用李家庄的Web通知库存系统的服务。数据库自然也拆分了,将旧的库存数据导出,再导入到李家庄的新数据库中。不管过程多么艰难,两个系统还是分开了,李家庄喜气洋洋、敲锣打鼓地迎接库存系统的部署,开始了试运行。新问题由于只需要处理订单,张家村的负荷突然下降,恢复了正常的作息。但好景不长。张家村很快发现李家庄根本不关心新系统,派了酒鬼小李负责运营库存网络服务。小李一醉就忘得一干二净,网络服务经常上不去。更何况,李家庄严格日出而作,日落而息。在张家村忙着处理订单的时候,李家庄已经关掉系统睡觉了。这是张家村小张的痛。用户提交订单并调用网络服务通知库存发货,但网络服务经常没有响应。下单时间长,用户体验极差,大家吐槽。小张多次向李家庄投诉无果。没有人回应。跨村合作真的很难!小张的工作不好,工分被扣了。小张想起了自己的经历《Java帝国之拨云见日识回调 》,心中再次感叹:为什么受伤的总是我?晚上回到家,小张苦思冥想:原来订单系统和库存系统都在一个虚拟机里,处理起来很方便。但现在它是一个远程网络服务。酒鬼小李不给我结果我就没法结束了。这是一个典型的同步操作。可以改成异步吗?我给小李发订单包裹,他做什么?到时候不用去处理,效率会大大提高!但是目前的webservice不支持这种方式,请问如何将包裹寄到那里呢?留言队列的小张彻夜未眠,第二天一大早,就去请教老村长。村长说:“你能想到这一层,很好!最近我一直在思考这个问题,在一个大型的分布式系统中,如何做异步通信是个大问题,我想到了一个东西,叫消息队列。””“消息队列?没听说过?》以你遇到的情况为例,我们开发一个消息队列,我已经想好名字了,就叫ZhangMQ(张消息队列),部署在我们张家村和李家庄之间,用于订单在我们村里生成,你只需要负责把订单消息写入这个队列就大功告成了。“哦,李家庄那个酒鬼小李醒醒了,让他从这个消息队列中读取消息并处理,对吧?”“对了,这不就变成异步了吗?这是他们的责任。”“订单消息的格式需要和李家庄商量好,不能乱序。另外,如果断电或重启,消息队列中的订单消息不能丢失。”小张想得很深入“没错,这些都是我们ZhangMQ需要考虑的,要实现持久化,把订单消息存储在硬盘上”。让我参与吧。”“没问题,不过我现在最重要的是说服李家庄让他们采用我们的消息队列。”不亏,不用听张家村没完没了的抱怨,改一点代码就可以看了来自消息队列的订单,小张等人在家努力开发ZhangMQ,半年后,ZhangMQ正式上线,彻底解决了异步通信的问题,原钦差王王回访张家村,找到消息队列,赞不绝口,回来后发了表扬令,命令在帝国推广,张MQ一夜成名!【本文为专栏作家“刘欣”原创稿件》。转载请通过作者微信获得授权公众号coderising】点此查看作者更多好文
