- 大话编程
- 一个故事讲完 https
- C 老头和 Java 小子的硬盘夜话
- 我是一个函数
- 操作系统是个大骗子?
- 90 后 老头儿 和 00 后 Go 小子的硬盘夜话
- 爱炫耀的数据库老头儿
- 浏览器:一个家族的奋斗
- 浏览器家族的安全反击战
- 黑客三兄弟
- 从读写分离到 CQRS,张大胖是如何解决性能问题的?
- 两个程序的爱情故事
- 两个程序的爱情故事(续)
- 烂代码传奇
- 机房夜话
- 干掉状态:从 session 到 token
- 张大胖的 docker 之路
- 从 SOA 到微服务
- XML 的传奇人生
- 从密码到 token, 一个授权的故事
- 编程世界的那把锁
- 加锁还是不加锁,这是一个问题
- 这个动物园, 两年也逛不完
- 张大胖和 CAP 定理
- 一个翻译家族的发家史
- 张大胖和单元测试
- Java 帝国
- 一个著名的日志系统是怎么设计出来的?
- Java 帝国之泛型
- Java 帝国之动态代理
- 从兄弟到父子:动态代理在民间是怎么玩的?
- Java 注解是怎么成功上位的?
- Java EE 要死掉了?
- Java 帝国之宫廷内斗
- Java 帝国之宫廷内斗(2)
- 当世界上只剩下一个 Java 程序员
- 持久化:Java 帝国反击战
- 什么是框架?
- 学习 Java 虚拟机没用? 听听当事人是怎么说的!
- 聊聊 Java 平台上的非 Java 语言
- Java 帝国之消息队列
- Java 帝国之 JMS 的诞生
- Java 帝国之单例设计模式
- 对 Java Inputstream 的一次采访
- ASM: 一个低调成功者的自述
- 序列化: 一个老家伙的咸鱼翻身
- Java IO 的自述
- JDK 先生最近有点烦
- 什么是框架(续)?
- 说 空话,做实事: 谈谈多态
- Kotlin 初体验
- 小白科普
- 小白科普:分布式和集群
- 什么是 Zookeeper?
- 小白科普:悲观锁和乐观锁
- 小白科普:LDAP 有什么用?
- 小白科普:服务那点事儿
- 小白科普:Netty 有什么用?
- 老司机经验
- 后端程序员都做些什么?
- 为什么要学习 HashMap 的底层原理?
- 小心,别被今日头条给困住了!
- 对自己狠一点,开始写作吧
- 开源代码啃不动,不如先定个小目标
- Python 这么简单还用学吗?
- 作为一个有追求的程序员,你应该掌握的七种武器
- 给设计模式说句公道话
- 时间是这么被浪费掉的
- 你真正付出了全部努力了吗?
- 写给初学者:编程的本质
- 在大学期间更应该学习什么?
- 看看 悲催 的码农得学多少东西?
- 学习编程的四兄弟
- 那些年,我后悔没做好的事情
- 我为什么对后端编程情有独钟?
- 当我们在学习编程语言时,我们在学习什么?
- 编程需要多少数学知识?
- 想成为编程高手,一定要学汇编吗?
- 你必须理解的计算机核心概念
- 你的需求是怎么描述的?
- 白话敏捷软件开发
- 人在职场
- 凡事必先骑上虎背,给性格内向的程序员聊几句
- 为什么能力优秀的人当了主管以后反而不行了呢?
- 不想做技术了,还有一条路
- 纪念我最有效率的一次加班
- 书写「简历」时,需要规避的错误。
- 上天还是入地?
- 工作 6 年,半路出家到 CTO
- 只是 Work 还不够,更重要的是 Think
- 我所尊敬的三位女程序员
- 我们向印度人学习什么?
- 你去下家面试,怎么评价你在这家公司做的工作?
Java 帝国之消息队列
张家村的历史
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 一下子出名了!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论