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

时间:2016-09-18 11:47:01

标签: ruby-on-rails reactjs architecture websocket redis

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

我不想在每次更新时发送整套内容。应该可以只发送差异,我可以选择使用哪种方法。

实施 rails - >客户端连接:

  • 反应 - 反应声音非常适合维持实时状态。如果我实时更新道具,html将免费保持最新。
  • actioncable - 最新的rails中有一个组件将websockets集成到rails app中。

服务 - > redis set - >轨道

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

除此之外,我还必须实施更改/删除案例。 看起来这种方法过于复杂和低级。事情可能很容易失去同步,并且它们在内存中重复多次。

  • 而不是 pub / sub 我可以让rails app重复读取redis设置的内容并计算是否发生了任何更改。它应该很便宜,因为redis将该集存储在内存中。如果rails应用程序检测到更改,它会将其广播到客户端。尽管如此,根据超时检查内存是否发生了变化仍然是错误的。

其他信息:客户不会太多,也许会有一千个。该集将每秒更新一次,有时更多,有时更少。

让客户端与redis中的状态保持同步的最佳方法是什么?反应使用是否合理?有没有一些本地反应实现这样的"差异"图案?

1 个答案:

答案 0 :(得分:1)

我有一个同时使用React和ActionCables的应用。

两者合作得很好。了解ActionCables的局限性(它具有比其他类似工具更低的用户限制基准)非常重要,但如果您不希望成千上万的用户同时使用它,那么它的工作正常。 / p>

无论你是否使用React,我认为Flux模式在管理套接字连接状态方面有很长的路要走。 Vanilla Flux和Redux都是很好的伙伴,在收听服务器的变化,然后将这些信息传播到应用程序的相关区域方面做得非常出色。它们碰巧最初用于React,但实际上你可以在任何前端框架中使用它们。