中午徐X和米高讲了一下Rich client的架构。其中徐X讲的是如何从单机分层系统到Rich client。
实际上最早的单机分层系统的UI部分激发了OO作为界面的编程模型。然后分层模型为了C/S结构发生了一些变化,目的是共享数据和通信,但是由于OO在远程调用上面的失败应用(Corba,EJB,Dcom),所以让人对OO产生了怀疑(实际上只是用错了地方)。而后又发生了B/S的变化,是一种完全的中心共享方式,原因是HTTP的无状态性造成客户端很难保存state,所以就有了完全中心共享状态的架构。而后通过通讯的增强(Ajax),客户端的状态保持逻辑通过异步通信来增强,所以产生了更好的用户体验。但是对状态同步的进一步要求和对会话状态保持的进一步要求让Ajaxian了的应用还是有点难以承受,所以Rich client又回归了。当然回归的时候同时带来的还有新的编程模型,如基于标记的声明式编程模型,还有更方便View-Model同步(通知)的数据binding机制,布局管理器,绘图支持能力,多线程能力,内嵌的视频编解码能力。其实WPF作为Windows上的新型UI编程模型他的确从Mozzila的XUL还有Adobe的mxml吸取了一些经验。上面这些是徐X阐述的主要内容,很精彩(最后的编程模型是我加的注释)。
而后米高做了一些技术层面的对比,主要是对比了Web和rich client的区别,不过我比较失望^___^,因为对比有失偏颇,原因是米高只用了5分钟准备ppt。
最后是我的意见。我现在已经不想割裂的分开Rich client和Web上的RIA,实际上目前他们已经有走向统一模型的趋势。
去年在InfoQ写文章的时候我就表达过这个意见。今天徐X也强调了,经典的MVC实际上很重要的是解决了数据共享(同步通知问题)与状态(会话)保持的问题,所有的架构问题其实都围绕了这个问题。首先RIA里面已经开始了layout数据分离的加强过程,比较明显的就是声名式的组件组合配置,还有数据绑定模型,这个在Flash和Silverlight还有JavaFx都有着重的解决,而且方向都很类似。其中Silverlight其实是一个减缩版的WPF。然后我们从架构方面来思考,解决状态共享和传递是通过增强的双向通信能力来完成的,很多RIA框架在开始提供web socket模型,这样让通讯超过无状态的且单向的HTTP,包括HTML5(目的是扩展Web上常用的一些Object,增强Web的编程能力,且让很多元素得到正确的语义,这个与XHTML2的关注点不同)的草案里面也有Web socket(类似socket的编程对象,可以实现二进制协议的面向连接的通讯)的提案。当然些努力就是让实现消息传递的开销更小,时效性更高,配合线程概念的支持,就可以实现复杂的基于消息的异步界面逻辑(这会极大的扩展RIA应用的能力)。因为通讯其实是解决状态共享的一个方向,通过高效的消息通知达到多个消费端的状态共享。另外一种解决Browser端状态同步(这里主要指客户端与服务器的数据库同步)的方法就是离线存储能力,这样削弱客户端对服务器的依赖。这种解决方案的代表就是各种Gears,Google gears,dojo offline等等,他们在浏览器里面嵌入sql lite一类的数据库,让客户端有自己的结构化存储能力,对于没有多客户端数据同步要求的应用来说离线方式可以让客户端形成完整的编程模型,通过sync机制在连线的时候进行数据同步是一种非常帮的RIA发展方向,从这个角度它已经是Rich client了。
那么可以扩展一下。我们知道Lotus Notes有服务器端replication的模式,离线会存在本地,连线的时候再同步。而对于另一些应用,极端地如Skype,他对实时的同步要求很高(当然它属于通讯类应用,也就是3C中的Communicate,而不是Content system),Skype的解决方案就是p2p。如果RIA有了socket(当然还有跨域支持),有了多线程,那么p2p是不是也不算难事了呢?状态同步通过p2p来实现,虽然不是可靠的通讯方式,但是却符合Internet的最大努力原则,所以我觉得这两种技术的结合的确很容易让RIA和Rich client不在有明显的界限,未来的目的就是融合。所以,要注意的是为什么微软拼了命在推Silverlight,而且拼了命的公布了Mac和Linux版本的Silverlight,其重要原因就是让WPF的模型渗透到RIA,用Rich client围攻RIA,来解决Adobe用超级NB的Air这个RIA衍生来围攻Rich client的困难。
这样,我们知道2年前开始声音渐强的Offline storage和越来越强的绘图,data binding的意图了吧,融合已经开始了,目标当然就是吃下这个大平台,然后成为最大的赢家!