从可观察的最新历史数据切换到可观察的实时数据,无需重复

时间:2018-04-11 18:17:51

标签: c# system.reactive rx.net

应用程序(Saver)通过websocket从远程服务器接收实时数据并将其存储在数据库中。它向客户端公开了一个REST端点,返回到目前为止存储在数据库中的所有数据。

客户端应用程序在启动时订阅远程服务器的websocket上的实时数据。然后它向Saver的REST端点发出请求,并到目前为止接收所有数据。

两个数据源都在客户端应用程序中公开为order(pinned: :desc, created_at: :desc)

IObservable<AType>包含时间戳属性。

如何将这两个Observable组合起来,使它们是顺序的(按时间戳)而不重复?

更新:在任何一个数据源/ Observable中都不可能有重复项,但在组合它们时是可能的,因为在调用REST端点之前订阅了websocket。他们按顺序订阅以避免数据丢失。

2 个答案:

答案 0 :(得分:1)

无法通过值进行实时流的排序而不进行缓冲/窗口化。您需要使用Observable.Merge / Observable.Buffer运算符显式缓冲合并的流(Observable.Window),然后您可以使用Enumerable.SortBy按时间戳排序。

以下是rxnet github页面中的相关问题:https://github.com/Reactive-Extensions/Rx.NET/issues/122

有一个Observable.Distinct运算符,但要小心在长时间运行/高吞吐量流上使用它,因为它存储值的哈希值以检测重复项。

答案 1 :(得分:0)

我的工作解决方案:

订阅websocket

到目前为止,通过REST检索所有数据

如果有任何内容通过websocket到达,请获取第一个项目的时间戳,然后从REST结果中删除此项以及任何内容

将这两个流组合在一起:

        combinedObservable = truncatedRestData.ToObservable().Concat(socketObservable);