将实时组件集成到REST后端

我正在实施一项可通过networking和移动客户端访问的产品,并正在进行深入的研究,以确保在我开始之前select了一套好的工具。 对于前端,我使用的是AngularJS(Angularjs + angular-ui在web上,离子+ cordova在手机上),而且因为我希望有一个后台服务于所有types的客户端,所以我计划实现一个RESTful服务接受并返回JSON数据)。 我倾向于使用Mongo,Node和Express来创build这个RESTful API,但是我很乐意接受这方面的build议。

但是现在对我来说的关键是:应用程序的某些部分(包括例如实时聊天/消息部分)需要是实时的。 我知道用于实现实时Web服务(webhooks,websocket,长轮询等)的各种技术和协议,以及实现它们的库和框架,并展示了这些function(SockJS,Socket.io等)和我想明确的是,我不是问那些“什么是最好的框架”types的问题。

我的问题是关于并行实现这两种服务的正确方法。 我是否应该与其他应用程序分开进行聊天? 还是有一个干净的方法来将这两种不同的协议集成到同一个应用程序中?

expression框架是相当模块化的,所以如果你愿意,它可以和一个websocket模块并排放置。 这样做的最常见原因是在两个模块中使用相同的会话存储,通过http和websockets共享身份validation例程。

例如,您可以在login时通过http使用express框架对用户进行身份validation,这将允许访问您的聊天应用程序。 从此,您将利用websockets的实时和快速协议,并在您的服务器代码上检查客户端使用套接字消息发送的cookie,并检查请求是否与之前的已validation会话相对应。

许多网站使用websockets进行聊天或其他推送更新,并使用单独的基于AJAX的RESTful API传递到同一页面。 将RESTful事物保留下来是有很大理由的,特别是如果caching是一个问题 – websockets不会从服务器之外的webcaching中受益。 Websockets更适合在任何现代浏览器上进行聊天。 因此,当考虑到扩展和每用户成本时,两个单独的接口增加了一点复杂性,您可能从中受益。

如果您的应用程序增长到足够需要这种扩展,您会发现这实际上大大简化了事情 – 在同一个聊天组中的客户端可以映射到同一个服务器,负载平衡器可以适当地分发RESTful调用。

如果您正在寻找一种通信协议来满足这两种需求(从客户端调用服务器,以及从服务器推送数据),那么您可能会看看WAMP 。

WAMP是一个开放的WebSocket子协议,它在一个统一的协议中提供了两个应用程序消息模式:远程过程调用+发布和订阅。

如果你想深入一点, 这就描述了为什么,动机和devise。 WAMP有多种不同语言的实现 。


现在,如果你想坚持REST,那么你不能在协议层次上集成推送(因为REST根本没有),而只能在“框架层次”。 你需要第二个协议。 选项是:

  1. 的WebSocket
  2. 服务器发送的事件(SSE)
  3. HTTP长轮询

SSE在某种程度上可能是对REST的一个很好的补充。 然而,它不支持在IE浏览器(甚至没有IE11),目前还不清楚是否会。

WebSocket显然工作,但为什么不能通过WebSocket运行? (这一思路导致WAMP)。

所以IMO对REST的自然补充将是一些基于HTTP Long-poll的模拟推送机制。 您可以使HTTP长轮询工作强健。 然后,你将不得不忍受HTTP解决scheme的低效率和局限性(像这样的用例)。

您可以使用托pipe的实时消息(甚至存储)服务,并将其集成到您的前端应用程序(Web和移动)中。 这些服务利用websocket协议,通常包括HTTP Comet回退。

最酷的是,您无需在高可用性和无限可扩展性方面pipe理底层基础架构,只需要专注于开发出色的应用程序。

我为Realtime工作,所以我有点偏见,但我认为Realtime框架可以帮助你。 更多在http://framework.realtime.co