应用程序(Saver)通过websocket从远程服务器接收实时数据并将其存储在数据库中。它向客户端公开了一个REST端点,返回到目前为止存储在数据库中的所有数据。
客户端应用程序在启动时订阅远程服务器的websocket上的实时数据。然后它向Saver的REST端点发出请求,并到目前为止接收所有数据。
两个数据源都在客户端应用程序中公开为order(pinned: :desc, created_at: :desc)
。
IObservable<AType>
包含时间戳属性。
如何将这两个Observable组合起来,使它们是顺序的(按时间戳)而不重复?
更新:在任何一个数据源/ Observable中都不可能有重复项,但在组合它们时是可能的,因为在调用REST端点之前订阅了websocket。他们按顺序订阅以避免数据丢失。
答案 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);