我有一项服务可实时更新redis(快速内存数据存储)中的一组服务。 我也有一个rails连接到这个redis实例的应用程序。任务是将设定内容显示给所有客户端。请注意,根据某些客户的设置,该集合中的某些元素不应被发送给他们。客户服务体系结构:保持客户端与内存数据同步sctructure
我不想在每次更新时发送整个设置内容。应该只能发送差异,我选择使用哪种方法。
实施轨道 - >客户端连接:
- 反应 - 反应听起来是一个不错的选择保持实时状态。如果我让道具实时更新,那么html将会保持最新免费。
- actioncable - 在最新的rails中有一个组件将websockets集成到rails app中。
服务 - > Redis的设置 - >轨:
- 我可以用的pub/sub Redis的功能,并写入到Redis的服务中设定发送被改变的元素/更新/在集合中删除,然后使用集合本身仅向新客户端发送数据,而现有客户端将通过pub/sub保持同步。因此,更新客户端,下面的执行:
- 服务是关于集中
- 服务更新元素添加元素的集redis的
- 服务发送的元素到发布/订阅队列
- Rails应用程序,所预订的发布/订阅队列,接收元素
- Rails应用程序过滤器的客户端,看看哪些应该得到更新的列表(通常情况下,这是大多数)
- rails应用程序广播新项目和cli经济需求使其
最重要的是,我还必须执行更改/删除的情况。 看来这种方法太复杂和低级。事情很容易失去同步,并且它们在内存中被重复数次。
- 代替的pub/sub我可以让Rails应用程序读取redis的重复设定内容和计算,如果任何改变发生。它应该是便宜的,因为redis将该集存储在内存中。如果Rails应用程序检测到更改,它会将其广播到客户端。但是,根据超时检查内存是否有变化,感觉不对。
附加信息:不会有太多的客户,也许一千。该套件将每秒更新一次,有时更多,有时更少。
什么是最好的方法来保持客户端与redis中的状态保持同步?反应用法是否合理?是否有一些本地反应实现这种“差异”模式?
Will flux还会处理_仅同步变更_?或者我应该自己这样做(例如,消息如“索引为1的元素已更新 - 索引为4的元素已删除 - 新的元素为10)?” –
通常,在Flux中处理该问题的最佳方式是将商店中的数据保存为对象其中键/值对等于'id'和你的模型,然后你使用Object.assign或jquery的'.extend'来合并新的项目到对象中,或者'delete state [2]'删除一个项目(在这种情况下,id = 2的那个)。 – gravityplanx