【问题标题】:Listening for DB data changes in Angular using Rxjs or anything使用 Rxjs 或任何东西在 Angular 中监听数据库数据变化
【发布时间】:2019-02-11 10:26:11
【问题描述】:

我在后端 (node.js) 中有一个服务,我通过 angular 订阅它 http客户端服务,它工作正常。对于我的应用程序,有多个用户。 因此其他一些用户可以更改数据库数据。因此,每当数据库数据发生更改时,我都希望立即订阅它们。因此所有用户都可以查看一致的数据,即与数据库数据同步的数据。 我在角度服务中使用 RXJS Observables。

【问题讨论】:

    标签: angular rxjs observable


    【解决方案1】:

    在回答之前,请注意,满足您的要求说起来容易做起来难。为现有基础架构实现此功能需要大量工作,如果您绝对需要这样做,最好在服务器端使用现有框架。

    使用 HTTP 的方法

    HTTP 不是此任务的正确协议类型。它基于请求/响应,并希望客户知道何时想要请求信息。

    如果你必须使用 HTTP 我只能想到两种方法。

    选项 1: 创建一个从不关闭的 HTTP 请求,即在 express 中,服务器从不发送 res.end() 或类似的东西。这种方法也需要一个自定义的 HTTP 客户端,因为默认的 Angular HTTP 客户端希望请求在向订阅者发送任何通知之前结束。但是,如果服务器没有发送数据,浏览器可能会终止请求,因此您必须自己实现 keep-alive。

    选项 2: 使用“轮询” - 这意味着您不断询问服务器数据是否发生了变化。这可以在 RxJS 中实现:

    interval(1000).pipe
      switchMap(() => this.http.get(...)
    )
    

    这带来了一个巨大的缺点,即您的服务器(以及您的数据库)必须处理大量请求并且您的网络流量会增加(尽管只发送小包)。 然而,这对您来说可能是最容易实现的,因为几乎不需要进行任何更改来支持它。请注意,如果您同时拥有太多用户,您的服务器和数据库将在某个时候出现故障。

    WebSocket 的替代方法

    浏览器只支持这么多协议,因此只有有限数量的解决方案可以满足您的要求。一种是WebSocket。它基本上是浏览器上的 TCP 协议,但允许使用服务器将数据 推送 数据到客户端的选项进行长期连接。 RxJS 中甚至还有一个类,称为WebSocketSubject

    现在,这种方法的扩展性比任何 HTTP 方法都好,但可能需要您重建大部分后端。如果你想深入了解,you can start here

    关于数据库的注意事项

    到目前为止,我们只讨论了网络通信,但当然您的数据库还必须支持可观察的 API(轮询方法除外)。您需要查看特定数据库系统的文档以了解是否存在。

    【讨论】:

    • 来自@ggrading 的回答
    猜你喜欢
    • 2012-05-26
    • 2019-01-16
    • 2016-05-25
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多