2016-09-18 55 views
1

我有一項服務可實時更新redis(快速內存數據存儲)中的一組服務。 我也有一個rails連接到這個redis實例的應用程序。任務是將設定內容顯示給所有客戶端。請注意,根據某些客戶的設置,該集合中的某些元素不應被髮送給他們。客戶服務體系結構:保持客戶端與內存數據同步sctructure

我不想在每次更新時發送整個設置內容。應該只能發送差異,我選擇使用哪種方法。

實施軌道 - >客戶端連接:

  • 反應 - 反應聽起來是一個不錯的選擇保持實時狀態。如果我讓道具實時更新,那麼html將會保持最新免費。
  • actioncable - 在最新的rails中有一個組件將websockets集成到rails app中。

服務 - > Redis的設置 - >軌

  • 我可以用的pub/sub Redis的功能,並寫入到Redis的服務中設定發送被改變的元素/更新/在集合中刪除,然後使用集合本身僅向新客戶端發送數據,而現有客戶端將通過pub/sub保持同步。因此,更新客戶端,下面的執行:
    1. 服務是關於集中
    2. 服務更新元素添加元素的集redis的
    3. 服務發送的元素到發佈/訂閱隊列
    4. Rails應用程序,所預訂的發佈/訂閱隊列,接收元素
    5. Rails應用程序過濾器的客戶端,看看哪些應該得到更新的列表(通常情況下,這是大多數)
    6. rails應用程序廣播新項目和cli經濟需求使其

最重要的是,我還必須執行更改/刪除的情況。 看來這種方法太複雜和低級。事情很容易失去同步,並且它們在內存中被重複數次。

  • 代替的pub/sub我可以讓Rails應用程序讀取redis的重複設定內容和計算,如果任何改變發生。它應該是便宜的,因爲redis將該集存儲在內存中。如果Rails應用程序檢測到更改,它會將其廣播到客戶端。但是,根據超時檢查內存是否有變化,感覺不對。

附加信息:不會有太多的客戶,也許一千。該套件將每秒更新一次,有時更多,有時更少。

什麼是最好的方法來保持客戶端與redis中的狀態保持同步?反應用法是否合理?是否有一些本地反應實現這種「差異」模式?

回答

1

我有一個使用React和ActionCables的應用程序。

兩者在一起工作得很好。瞭解ActionCables的侷限性(它具有比其他類似工具更低的用戶限制基準)是非常重要的,但是如果您不希望成千上萬的用戶同時使用它,那麼它工作得很好。

無論您是否使用React,我認爲Flux模式在管理套接字連接狀態方面有很長的路要走。 Vanilla Flux和Redux都是很棒的同伴,並且非常善於傾聽來自服務器的變化,然後將這些信息傳播到應用程序的相關領域。它們恰好是用於React的最重要的,但實際上你可以在任何前端框架中使用它們。

+0

Will flux還會處理_僅同步變更_?或者我應該自己這樣做(例如,消息如「索引爲1的元素已更新 - 索引爲4的元素已刪除 - 新的元素爲10)?」 –

+0

通常,在Flux中處理該問題的最佳方式是將商店中的數據保存爲對象其中鍵/值對等於'id'和你的模型,然後你使用Object.assign或jquery的'.extend'來合併新的項目到對象中,或者'delete state [2]'刪除一個項目(在這種情況下,id = 2的那個)。 – gravityplanx

相關問題