Java 帝国之消息队列

开发 开发工具
5年前网上购物兴起的时候, 帝国非常看好, 决定向这个领域进军, 于是兴建了张家村, 在这里安装了Java 虚拟机和数据库, 然后部署了一个基于Web的订单系统和一个库存系统, 由张家村的人负责操作。

张家村的历史

Java 帝国的张家村正在迎来一次重大的变革。

5年前网上购物兴起的时候, 帝国非常看好, 决定向这个领域进军, 于是兴建了张家村, 在这里安装了Java 虚拟机和数据库, 然后部署了一个基于Web的订单系统和一个库存系统, 由张家村的人负责操作。

张家村的老村长很清楚, 说是两个系统, 其实是逻辑上的一种划分方式, 在物理上两个系统还是部署在一个虚拟机中。 那个时候用户量少, 数据量也不大, 村民们只要使用这一个Java 虚拟机和数据库就足够了。

订单和库存系统运转一直很好, 用户的订单来了, 会在订单系统中存下来, 然后通知库存系统发货。

你要问怎么通知? 老村长会告诉你说: 其实简单的很, 就是普通Java 方法的直接调用, 调用库存系统某个类的某个方法而已。 由于在同一个虚拟机之内, 效率极高 。

转眼间5年过去了, 人类变得越来越懒, 越来越喜欢网上购物, 用户量和数据量暴增, 再加上他们时不时搞个什么秒杀活动, 更是让张家村变得不堪重负。 为了应付汹涌而来的订单, 张家村经常彻夜灯火通明, 全村人三班倒才能勉强应付。

老村长向镇上报告了很多次都没有回音, 要不是帝国的性能监控部门发现了这个异常,还不知道要被瞒到什么时候。

还好,钦差王大人来了, 变革要开始了。

拆分

王大人经验丰富, 目光如炬, 一眼就看出了问题, 立刻下达了***道命令: 拆分 ! 把订单系统和库存系统分开!

老村长说: “那拆开了以后,我们村还是放不下啊”

王大人道: “订单系统还是留在张家村, 库存系统挪到李家庄去”

老村长暗自思忖,订单系统是直接面向用户的,很重要, 张家村一定要保住, 至于库存系统,主要是后台操作,挪走就挪走吧, 于是就答应了。

拆分不是那么容易的, 订单和库存耦合的比较紧密, 现在要把库存系统搬到李家庄的Java虚拟机和数据库去,免不了一番剧烈的折腾。

在王大人的指导下, 原先那些直接的Java 方法调用,也被改成了Web 服务 -- 张家村和李家庄虽然距离较远 , 还是有网络相通的。

现在用户下了订单以后, 先在张家村保存, 然后由张家村调用李家庄的Web服务来通知库存系统。

数据库自然也做了拆分, 老的库存数据被导出来, 再导入到李家庄的新数据库中 。

不管过程是多么艰难, 两个系统还是分了家,李家庄喜气洋洋、敲锣打鼓的迎接了库存系统的部署, 开始了试运营。

新问题

由于只需要处理订单, 张家村的负载一下子降了下来, 恢复了正常的作息。

可是好景不长,张家村很快发现李家庄对新系统根本不上心, 派了一个酒鬼小李去负责操作库存Web服务, 小李喝醉了啥都忘了, Web服务经常用不了。

这还不算,李家庄是严格的日出而作, 日落而息, 张家村正在繁忙的处理订单的时候, 李家庄已经把系统关了,睡觉去了。

这可苦了张家村的小张,用户提交了订单, 去调用Web服务通知库存发货, 可是Web服务经常不响应, 小张没有办法, 只好反复重试、等待一段时间后再试,导致一个订单很长时间才能完成, 用户体验极差, 大家怨声载道。

小张向李家庄投诉了很多次都不管用,没人搭理,跨村庄协作可真是难啊!

小张活干的不好,工分减少, 再这么下去,月底分粮的时候又要饿肚子了,小张想起来了自己经历过的《Java帝国之拨云见日识回调 》, 心里再次哀叹: 为什么受伤的总是我?

晚上到家,小张苦思悯想: 原来订单系统和库存系统都在一个虚拟机中, 处理起来很方便, 但是现在是个远程的Web服务, 酒鬼小李不给我返回结果, 我就没法结束, 这是典型的同步操作, 能不能改成异步的呢?

我把一个订单包裹发给小李, 他什么时候处理我就不用管了, 这样我这边的效率就会大大的提高! 可是现在的Web服务并不支持这种方式, 我怎么才能把包裹发过去呢?

消息队列

小张彻夜未眠, 第二天一大早就去请教老村长。

村长说: “你能想到这一层,非常不错! 近来我也一直在考虑这个问题啊, 在大型的分布式系统中,怎么做异步通信是个大问题, 我想到了一个叫消息队列的东西”

“消息队列? 没有听说过”

“就拿你遇到的情况来说吧, 我们开发一个消息队列,名称我都想好了,就叫ZhangMQ(Zhang Message Queue), 把它部署在我们张家村和李家庄之间, 我们村产生的订单, 你只要负责把订单消息写到这个队列里就完事大吉了。 ”

“奥,李家庄的酒鬼小李醒了,就让他从这个消息队列中读取消息,进行处理,对吧”

“没错,这不就变成异步的了? 酒鬼小李不处理, 那就是他们的责任了”

"那订单消息的格式需要和李家庄商量好, 另外次序也不能乱掉, 还有, 要是断电了或者重启了,消息队列中的订单消息也不能丢失 " 小张想的很深入

“没错,这些都是我们的ZhangMQ要考虑的,要实现持久化, 把订单消息存到硬盘上”

“这真是不错“ 小张跃跃欲试 ”村长,我想去开发这个ZhangMQ, 一定要让我参加啊“

”没问题, 不过我当前最重要的是说服李家庄, 让他们来采用我们的消息队列“

经过据理力争和艰难协商,李家庄终于同意了消息队列的方案,毕竟对他们也没啥损失, 也不用听张家村没完没了的投诉了,只需要改一点点代码,从消息队列中读取订单即可。

小张和其他人在家里埋头开发ZhangMQ, 半年后,ZhangMQ正式上线, 彻底解决了异步通信的问题。

前钦差王大人对张家村做了回访,发现了消息队列,赞不绝口,回去后就发来了褒奖令,还下令在帝国推广, ZhangMQ一下子出名了!

【本文为51CTO专栏作者“刘欣”的原创稿件,转载请通过作者微信公众号coderising获取授权】

戳这里,看该作者更多好文

责任编辑:武晓燕 来源: 51CTO专栏
相关推荐

2018-03-29 15:20:05

JavaJaasJdbc

2017-08-16 15:11:29

JavaJDBCJTA

2017-10-12 14:56:11

2017-02-28 08:57:41

JavaJMS队列

2010-01-21 11:23:49

Linux多线程同步消息队列

2017-10-11 15:08:28

消息队列常见

2017-11-22 14:31:24

华为云

2017-11-14 14:41:11

Java泛型IO

2010-04-21 12:39:48

Unix 消息队列

2022-04-12 11:15:31

Redis消息队列数据库

2009-12-07 09:23:05

2012-09-24 11:48:05

IBMdw

2021-02-19 09:19:11

消息队列场景

2009-11-09 11:15:06

WCF消息队列

2010-04-21 12:12:56

Unix 消息队列

2010-04-13 17:00:43

Unix消息队列

2019-05-29 14:49:02

KafkaRocketMQRabbitMQ

2019-09-23 10:47:52

Kafka架构微服务

2021-03-11 06:01:41

Linux消息队列

2010-04-21 14:39:59

Unix消息队列
点赞
收藏

51CTO技术栈公众号