【发布时间】:2019-02-11 10:26:11
【问题描述】:
我在后端 (node.js) 中有一个服务,我通过 angular 订阅它 http客户端服务,它工作正常。对于我的应用程序,有多个用户。 因此其他一些用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。因此所有用户都可以查看一致的数据,即与数据库数据同步的数据。 我在角度服务中使用 RXJS Observables。
【问题讨论】:
标签: angular rxjs observable
我在后端 (node.js) 中有一个服务,我通过 angular 订阅它 http客户端服务,它工作正常。对于我的应用程序,有多个用户。 因此其他一些用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。因此所有用户都可以查看一致的数据,即与数据库数据同步的数据。 我在角度服务中使用 RXJS Observables。
【问题讨论】:
标签: angular rxjs observable
在回答之前,请注意,满足您的要求说起来容易做起来难。为现有基础架构实现此功能需要大量工作,如果您绝对需要这样做,最好在服务器端使用现有框架。
HTTP 不是此任务的正确协议类型。它基于请求/响应,并希望客户知道何时想要请求信息。
如果你必须使用 HTTP 我只能想到两种方法。
选项 1: 创建一个从不关闭的 HTTP 请求,即在 express 中,服务器从不发送 res.end() 或类似的东西。这种方法也需要一个自定义的 HTTP 客户端,因为默认的 Angular HTTP 客户端希望请求在向订阅者发送任何通知之前结束。但是,如果服务器没有发送数据,浏览器可能会终止请求,因此您必须自己实现 keep-alive。
选项 2: 使用“轮询” - 这意味着您不断询问服务器数据是否发生了变化。这可以在 RxJS 中实现:
interval(1000).pipe
switchMap(() => this.http.get(...)
)
这带来了一个巨大的缺点,即您的服务器(以及您的数据库)必须处理大量请求并且您的网络流量会增加(尽管只发送小包)。 然而,这对您来说可能是最容易实现的,因为几乎不需要进行任何更改来支持它。请注意,如果您同时拥有太多用户,您的服务器和数据库将在某个时候出现故障。
浏览器只支持这么多协议,因此只有有限数量的解决方案可以满足您的要求。一种是WebSocket。它基本上是浏览器上的 TCP 协议,但允许使用服务器将数据 推送 数据到客户端的选项进行长期连接。 RxJS 中甚至还有一个类,称为WebSocketSubject。
现在,这种方法的扩展性比任何 HTTP 方法都好,但可能需要您重建大部分后端。如果你想深入了解,you can start here。
到目前为止,我们只讨论了网络通信,但当然您的数据库还必须支持可观察的 API(轮询方法除外)。您需要查看特定数据库系统的文档以了解是否存在。
【讨论】: