网上书店:叮当网
叮当网 - DingDang 是一个虚构的网上书店项目。通过叮当网,用户可以浏览和查询书籍信息。
图1
和大多数项目一样。叮当网一开始是一个单体的应用程序。所有的代码编译打包成一个war包,部署在一台web服务器下。
随着用户数的增多,单台服务器开始不堪重负,这时,我们通过引入负载均衡,把DingDang 部署多份。很好,现在DingDang又开始愉快地工作了。当用户数进一步增多时,我们只需要继续增加DingDang的部署实例就可以了。
然而好景不长。很快,新的问题又开始冒了出来。
- 首先,由于所有的代码耦合在一起,任何一点微小的改动,都必须整个应用程序重新编译,测试并重新部署。当部署的实例已经有好几百个之多时,这是一项让人很痛苦的事情。
- 此外,你会发现项目的开发效率变慢了。假设书籍信息和出版社信息模块分别由开发团队A和团队B进行维护。现在出版社模块想要增加一些新功能,而与此同时,开发团队A正忙于修补用户反馈的一个严重bug。团队B在完成新功能的开发后,不得不等待团队A修改完毕,然后再一起打包发布。尽管新功能和这个bug没有什么关系!当你的开发团队不是两个,而是20个时,上述的的这种互相依赖和等待会严重地拖慢项目的开发迭代速度。
- 其次,硬件的利用率变得很低。假设DingDang系统中有某一项功能是非常耗费CPU计算的。为了应付大规模的用户并发,我们部署了好几百个运行实例。这几百台机器的内存和硬盘等资源是闲置的。这意味着,每年几百万费用的浪费!
这里仅仅列出了几个常见的问题。为了解决这些问题,我们必须重构DingDang。把独立的功能模块拆分出来,作为独立的服务运行。拆分后的DingDang如下图所示: