Java 帝国之消息队列

Java帝国之JMS的诞生

原创: 刘欣 码农翻身 2017-02-06
张家村的历史

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一下子出名了!

Java消息队列与JMS的诞生相关推荐

  1. 轻松搞定RabbitMQ开篇:Java消息队列与JMS的诞生

    Java 帝国之消息队列 原创: 刘欣 码农翻身 2017-02-06 张家村的历史 Java 帝国的张家村正在迎来一次重大的变革. 5年前网上购物兴起的时候, 帝国非常看好, 决定向这个领域进军, ...

  2. 梳理消息队列 MQ/JMS/Kafka

    是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧. 1消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把 ...

  3. 消息队列MQ/JMS/Kafka,你都了解多少?

    今日推荐isEmpty 和 isBlank 的用法区别,你都知道吗?SpringBoot项目优化和Jvm调优(楼主亲测,真实有效)国内大神成功给手机装上了 Win11,代码已开源!Fluent Myb ...

  4. 后端技术:消息队列MQ/JMS/Kafka相关知识介绍

    ?今天给大家分享消息队列MQ/JMS/Kafka相关知识介绍 1.消息队列介绍 首先举个收快递的栗子,传统的收快递,快递小哥把我们的快递送到我们的手里.他需要什么条件嗯? 快递小哥有时间送, 我们有时 ...

  5. 面试官:消息队列 MQ/ JMS/ Kafka 有什么区别?

    更多架构干货请关注公众号"架构之路".是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都是什么吧. 1消 ...

  6. 消息队列MQ/JMS/Kafka,你都了解吗?

    点击关注公众号,回复"1024"获取2TB学习资源! 是不是平常听到说消息队列啊,JMS啊,MQ啊 .kafka啊巴啦啦的一堆术语,听不懂?关系混乱?今天就让我们来一起来看看他们都 ...

  7. Java消息队列-Spring整合ActiveMq

    1.概述 首先和大家一起回顾一下Java 消息服务,在我之前的博客<Java消息队列-JMS概述>中,我为大家分析了: 消息服务:一个中间件,用于解决两个或多个程序之间的耦合,底层由Jav ...

  8. java 消息队列详解_Java消息队列-Spring整合ActiveMq的详解

    本篇文章主要介绍了详解Java消息队列-Spring整合ActiveMq ,小编觉得挺不错的,现在分享给大家,也给大家做个参考.一起跟随小编过来看看吧 1.概述 首先和大家一起回顾一下Java 消息服 ...

  9. Java 消息队列、缓存、同步(个人理解:空谈)

    Java 消息队列.缓存.同步. 消息队列 我的理解:消息队列,将消息存入消息队列,然后就OK了. 系统之间原先调用通用接口,但引入了消息队列后,系统之间调用MQ消息队列. 好处:响应快,能累积请求, ...

最新文章

  1. ganglia访问时出现“You don‘t have permission to access /ganglia/ on this server“
  2. 图解Detour安装及简单使用实例(Win7+VC6)
  3. c语言编写单词位置反转,C语言笔试题答案.docx
  4. android组合动画还原,Android - Fragment,View动画,组合动画,属性动画
  5. java中的locksupport_详解Java多线程编程中LockSupport
  6. 鲁东大学计算机王跃,鲁东大学学子在“程序设计天梯赛”中取得优异成绩
  7. 《Non-invasive Fetal ECG Signal Quality Assessment for Multichannel Heart Rate Estimation》论文解读-废弃
  8. 超棒的在线Bootstrap主题编辑工具 - lollytin
  9. paramiko执行nohup_记一次使用django+paramiko远程操作时报错无法返回问题
  10. 今天讲座的感悟--java
  11. rac one node在线relocation
  12. js基础-16-继承
  13. Python:批量转换图片格式
  14. 在多媒体计算机系统中图像的颜色是,图像量化位数越大,记录图像中每个像素点的颜色种类就越多。() - 试题答案网问答...
  15. 毁三观:妻妹把我压身下
  16. 北京电影学院及中央戏剧学院老师推荐的必看影片,我真是一条一条翻的,一条一条写的,是真的。...
  17. 一张关系图助你清晰认识各种O。PO、BO、DTO、VO关系图,够直观
  18. 经验分享:一套完整的硬件电路设计该怎么做?
  19. 服务器系统升级方案,服务器系统升级方案
  20. centos os u盘启动盘_Mac上制作Centos7系统U盘安装盘(示例代码)

热门文章

  1. 火箭弹道设计 matlab,航天飞行动力学远程火箭弹道设计大作业 (1)
  2. python打分_做一个Python颜值打分系统,比比看杨幂和杨超越到底谁更美?
  3. 计算机开关键是什么符号,开关的符号是什么
  4. 网络营销存在的安全问题
  5. 奇虎360 -- 2013年校园招聘技术类笔试题
  6. 用JSP/Servlet应用开发一个简单的考试报名系统
  7. 扔硬币先手获胜概率问题
  8. 阿里ODPS降低大数据应用门槛
  9. The error occurred while setting parameters,Communications The error may involve defaultParameterMap
  10. office2010 word发布博客 博客园