我有一項服務可實時更新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