我希望使用Redis创建一个系统,将股票报价数据发布到内部网络中的订阅者。问题是发布是不够的,因为我需要找到一种方法来实现原子“获取快照然后订阅”机制。我对Redis很新,所以我不确定我的解决方案是“正确的方式”。
在特定时刻,每只股票都有一本订单簿,其中包含最多10个出价和10个要求。发布者接收交换数据,并将其发布给订阅者。
虽然可以使用发布和订阅轻松完成订单簿中的更改发布,但连接的每个订阅者也需要获取该库存的当前订单的快照,然后才订阅订单簿中的更改。
据我所知,Redis频道从不保存信息,因此除了发布更改之外,发布者还需要在哈希键(或排序集。我不确定哪个更合适)中维护完整的订单簿。
我也理解Redis客户端在订阅第一个频道后不能发出任何命令,除了订阅和取消订阅。
因此,一旦订阅者应用程序启动,它首先需要获取包含完整订单簿的密钥,然后订阅该书中的更改。但是,这可能会导致竞争条件。在客户端获得包含当前快照的密钥之后但在实际订阅更改之前,可以对订单进行更改,从而产生一个永远不会看到的更改。
由于无法使用subscribe然后在单个连接中使用get,因此客户端应用程序需要两个连接到Redis服务器。在这一点上,我开始认为如果我在同一个应用程序中需要多个连接,我可能不会以正确的方式做事。无论如何,我的想法是客户端将具有订阅连接和查询连接。首先,它将使用订阅连接订阅订单簿中的更改,但仍然不会进入处理事件的循环。之后,它将使用查询连接来获取书籍的完整快照。最后,它将进入处理事件的循环,但正如他在拍摄快照之前实际订阅的那样,保证它不会错过拍摄快照后发生的任何更改。
有没有更好的方法来实现我的目标?
答案 0 :(得分:0)
我希望你已经找到了自己的方式,如果不是,我们会提出个人建议:
如果你在javascript的土地我会建议看看Meteor.js,他们会以某种方式实现你想要达到的目标,使用默认设置你最终会写入mongodb以便更新&# 34; "最终用户"。
的GUI无论如何,您可能有兴趣阅读有关meteor的ddp协议的工作原理:https://meteorhacks.com/introduction-to-ddp/和https://www.meteor.com/ddp