图5dWMVC的示意图。图中显示了三元组对象在客户和服务器间的分布。由SoR发起的入站更改通知导致了模型和视图间的实时双向更新。
SSE机制作为 HTML5 的组成部分,允许服务器端组件异步启动,并将数据从服务器端组件实时推送到浏览器。客户端组件可以使用SSE发起请求,向服务器申请建立一个非传统的HTTP连接。一旦客户端组件接收到所发起的请求,它继续对随后的服务器响应进行监听。与此同时,服务器保持同一客户-服务器初始连接是活跃的。一旦新的数据可用,服务器无需客户的额外请求,就立刻通过该初始连接将这些数据推送给客户。这样,SEE给出了一种从服务器到客户浏览器的解决方案,该解决方法使用了异步的发布-订阅事件通知。
WebSocket是一种提供浏览器和服务器间全双工连接的通信协议。当客户发送初始请求到服务器时,WebSocket通知服务器该HTTP连接可能会升级为全双工的TCP/IP WebSocket连接,通知使用了一种特殊的HTTP报头。一旦WebSocket连接被建立,就可在需要时用于在浏览器和服务器间相互发送数据。
使用SSE和WebSocket通信协议,服务器可以异步地将模型驻留内存的更改发布到浏览器。但是正如前面所讨论过的,模型架构的分层可能会跨越服务器的边界,并可能包括应用服务器之外的外部SoR(参见图4)。由于SoR中的数据记录可被其他应用或用户修改,因此每当这样的带外更改发生时,SoR应具有 变化数据捕获 (change data capture,CDC)机制去探测并捕获更改,实时地发起并推送入站数据更改到应用服务器,实现端到端的双向发布-订阅通信模型(如图5和图6所示)。在图6中,dWMVC轮毂的中心表示了共享的SoR和CDC数据源。数据的实时同步由数据源和相关驻留内存域模型对象之间的双向交互所维持。在图6中,每个轮辐间的微型dWMV表示了一个独立的业务应用(集成的企业生态系统中),或是一个独立的应用用户。
图6dWMVC轮图。图中显示了由SoR发起的入站更改通知,并显示所引发的模型和所有视图间的实时双向更新情况(以微型WMVC展示)。
基于Web的架构栈中加入了XHR-Ajax、SSE和WebSocket等技术,还有数据库厂商提供了数据库入站通信能力,所有这些一起使得传统oMVC中视图和模型间的双向交互通信在dWMVC中得到了复兴。越来越多的数据库厂商,包括 PostgreSQL 、 Oracle 等传统关系数据库厂商和 RethinkDB 、 Cassandra 等 NoSQL 数据库厂商,已经实现或者规划去提供CDC机制,以改进应用服务器的入站推送通知。
点对点WMVC(pWMVC)
对于上面所论及的两种WMVC,它们的架构语义都是基于 客户-服务器范例 的,即用户浏览器向服务器发送HTTP请求,取回服务器端的内容,服务器则回应以包含请求信息的一个或更多的响应。这类方法中,服务器负责存储,并发送所有内容及对所有请求的响应。但是这样的集中式方法可能会导致性能上的瓶颈。因为为了支持所有可能的请求负载,需要对服务器基础设施的资源进行适当地扩展和复制。当前由于高频度实时内容发布需求在数量上日益增长,这类方法会产生问题,尤其是在(意料之外的)高通量负载的期间。最优的系统无疑是那种能以去中心化的方式支持高质量终端用户体验的系统,这样的系统可以使用户用最短的路由和时间获取到数据。借助于 点对点 (Peer-to-peer,P2P)数据交换及通信,终端用户可以从其它的用户那里交互、检索和接收内容。无疑,这样的架构绕开或降低了集中式服务器的负载和潜在瓶颈问题。
传统的点对点系统需要用户显式地安装专用的桌面应用或插件。在 WebRTC (Web实时通信,Web Real-Time Communication)协议被标准化并被浏览器支持之前,浏览器本身并不具备使对等系统的工作直接相互通信的能力。现在WebRTC标准已被大多数的浏览器所支持。它是一种API定义,提供了无服务器的浏览器到浏览器(浏览器P2P)直接数据交换和通信范例。WebRTC对Web应用引入了点到点的解决方案,它允许Web浏览器打开到其它浏览器的直接通信通道,无需对每个Web请求-响应的集中式服务场景进行处理(参见图7和图8)。