架构反思案例之网站架构案例

项目的背景前端

  公司已有一个桌面版程序,须要开发一个对应的网站程序,这样用户就不用安装桌面程序,也不用再关心升级和更新的问题,全部桌面的操做均可以在网站上完成。数据库

项目的设计后端

1. Browser浏览器

  这是没得选的,必需要有。服务器

  这里咱们主要考虑了两点:网络

  第一点,因为浏览器端和服务端须要频繁的交互数据,因此咱们选择了WebSocket做为先后端的通讯技术,可是WebSocket并非每一个浏览器都支持的。这个时候咱们考虑了socket.io,它比较无缺的封装了WebSocket,并且对于不支持WebSocket的浏览器也提供了轮询等替代的方式,这些是socket.io本身处理的,不须要外界强行干预,至关方便,因此咱们选择了socket.io做为通讯的媒介。架构

  第二点,因为是参照桌面UI开发的程序,咱们选择了单页面技术实现用户的界面。为了复用一些相同的UI,咱们使用了Google Closure提供的相关的模板技术,动态的根据需求生成元素,而后使用JQuery添加到页面中。JQuery也算是前端没法忽视的一个类库了,咱们照样使用。异步

2. WebServersocket

  这也是没得选的,必需要有。分布式

  考虑到先后端有着频繁的交互需求,并且这些交互并不是CPU密集计算型的操做,大可能是与Browser进行数据交互,因而选择NodeJS建立服务器,对我我的来讲,我始终认为NodeJS将异步回调机制演绎到了无人可敌的地步。

  WebServer从角色上来讲,主要实现了下列功能:

  一是,做为链接Browser和BackendServer的媒介,全部程序交互的数据都是经过WebServer转发的。WebServer与Browser的通讯采用WebSocket (socket.io)实现,而WebServer与BackendServer通讯采用一般的TCP Socket来实现。

  二是,WebServer经过BackendServerInspector组件管理BackendServer,这个在下面会提到。

  三是,WebServer直接管理用户的Session信息,在这里,全部的用户数据都存储在MongoDB中。

3. BackendServer

  由于桌面程序已经存在,因此能够重用程序全部的业务逻辑,因而网站的架构在传统的Browser/Server的基础上,再加上了BackendServer组件。

  BackendServer组件是一个命令行执行的exe程序,它包含全部桌面程序的逻辑和数据,只是把UI部分剥离出去了。BackendServer与WebServer的通讯采用一般的TCP Socket通讯机制。

4. BackendServerInspector

  除了这些主要的组件外,因为BackendServer只是把UI剥离的桌面程序,因此每一个功能并非松散的,一个BackendServer一次只能处理一个用户的数据,因此咱们须要一个BackendServerInspector这样的管理组件,这个组件负责启动,关闭和检测BackendServer。

  当WebServer须要处理一个新用户的时候,BackendServerInspector会检查是否有可用的BackendServer,若是没有可用的BackendServer则启动一个新的BackendServer程序。若是一个BackendServer程序没有响应的话,则会去关闭这个BackendServer程序。

5. MongoDB

  为了存储用户的信息,咱们使用MongoDB做为数据库。NoSql这年发展的是如火如荼,咱们也决定在项目中采用,这里考虑的不只是MongoDB高效的性能,还有RESTFull API,天生的分布式特性也是咱们考虑的因素,虽然大多数有点实际中并无用到,可是相对于关系数据库来讲,免去对数据库抽象的过程(ORM,或者说是Hibernate)仍是挺舒服的。

项目的实现

1. 重用桌面程序

  这是项目的发起背景,为了在有限的时间内重用桌面程序的功能,使得咱们并无足够的事件将这个桌面程序的功能与界面剥离感受,打造一个纯粹的SOA服务也只不过是一个响亮的口号而已,甚至不少的人根本就没这个意思。

  这个部分最终的结果只是将原来的程序添加上了收发消息的TCP Socket模块,完成与WebServer通讯的功能,UI系统几乎是完整的保留了。

2. NodeJS特性

  这个部分不用多讲了,NodeJS的也是近来煊赫一时的的技术了,采用这个实现WebServer也并没有什么大的不一样,只是特别要注意不要阻塞主线程。

3. HTML5图形处理

  我我的以为,HTML5中的Canvas是Web上图形处理的首选,普通的2D操做使用Canvas的API就能够搞定,复杂的3D世界则要使用WebGL开发,这也是一个在浏览器中并不通用的技术,因此咱们一直推荐客户使用Chrome和Firefox浏览器。

4. NoSQL趋势

  MongoDB也是一个新新技术,采用这个实现用户信息的持久化是足够的,实现上并没什么大的难点。

5. AWS - 亚马逊云服务

  咱们尝试了亚马逊的云服务,这种云服务对传统的服务器绝对是一种巨大的冲击,扩展性能和易用性绝对是传统技术没法比拟的。难怪这个云服务是不少创业公司的首选。

项目的反思

  这个项目的开始有点探索性的意味,最终因为服务器成本过高被叫停。

  这个项目的优势是使用了不少新型的技术保证高效的交互性能和可扩展性。不足是频繁的交互致使网络流量太大,网络费用过高。

  我我的以为这个设计值得提升的地方就是,应该把桌面程序的UI相关逻辑包括一些概念完全与底层命令和操做分离,把它们放到页面上去实现,这样能够节省一部分流量。可是剥离这些逻辑,开发一个比较纯净的面向服务的程序,成本无疑也是很高的。

相关文章
相关标签/搜索