客户端-服务架构:保持客户端与内存中的数据结构同步



我有一个实时更新redis(快速内存数据存储)中的集合的服务。我也有一个rails应用程序连接到这个redis实例。任务是将集合内容显示给所有客户端。请注意,根据某些客户端的设置,集合中的某些元素不应该发送给他们。

我不想在每次更新时发送整个集合的内容。应该可以只发送diff,我正在选择使用哪种方法。

实现rails ->客户端连接:

  • react - react听起来很适合维护实时状态。如果我让道具实时更新,html将免费保持最新。
  • actioncable -在最新的rails中有一个组件可以将websockets集成到rails应用中。

service -> redis set -> rails:

  • 我可以使用pub/sub redis特性,使写redis set的服务发送set中更改/更新/删除的元素,然后使用set本身只将数据发送到新客户端,现有的将通过pub/sub保持同步。因此,要更新客户端,执行以下操作:
    1. 服务即将更新集合
    2. 中的元素
    3. 服务将元素添加到redis
    4. 中的集合中
    5. 服务将元素发送到pub/sub队列
    6. rails应用程序,正在订阅pub/sub队列,接收元素
    7. rails应用程序过滤客户端列表,看看哪些应该得到更新(通常,它是大多数)
    8. rails应用程序广播新项目,客户端渲染它

除此之外,我还必须实现更改/删除情况。这种方法似乎过于复杂和低级。事情很容易不同步,它们会在内存中重复几次。

  • 而不是pub/sub我可以让rails应用程序反复读取redis设置的内容并计算是否发生了任何变化。它应该是便宜的,因为redis将集合存储在内存中。如果rails应用程序检测到变化,它会将其广播到客户端。尽管如此,基于超时检查内存中是否发生了更改还是让人感觉不对劲。

附加信息:不会有太多的客户端,可能有一千个。set将每秒更新一次,有时多,有时少。

在redis中保持客户端与状态同步的最佳方法是什么?react的使用是否合理?是否有这种"diff"模式的本地react实现?

我有一个应用程序,是使用React和actioncable。

两者配合得相当好。认识到actioncable的局限性是很重要的(它的用户限制基准比其他类似工具低),但如果你不希望成千上万的用户同时使用它,它工作得很好。

无论你是否使用React,我认为Flux模式在管理套接字连接状态方面有很大的帮助。Vanilla Flux和Redux都是很好的伙伴,它们都能很好地听取来自服务器的变化,然后将这些信息传播到应用程序的相关区域。它们都是为React设计的,但实际上你可以在任何前端框架中使用它们。

最新更新