Tag: 事件采购

使用EventSourcing(NodeJS,MongoDB,JSON)跨多个偶尔连接的客户端同步数据

我正面临着在服务器和多个客户端之间实现数据同步的问题。 我读了关于事件采购,我想用它来完成同步部分。 我知道这不是一个技术问题,更多的是一个概念问题。 我只是将所有事件直接发送到服务器,但客户端devise为不时脱机使用。 这是基本的概念: 服务器存储每个客户端应该知道的所有事件,它不重放这些事件来提供数据,因为主要目的是同步客户端之间的事件,使他们能够在本地重放所有事件。 客户端拥有一个JSON存储库,同时保存所有事件并重build存储/同步事件中的所有不同集合。 由于客户端可以离线修改数据,因此保持一致的同步周期并不重要。 考虑到这一点,服务器应该在合并不同事件时处理冲突,并在发生冲突时询问特定用户。 所以,对我来说,主要的问题是要消除客户端和服务器之间的差异,以避免将所有事件发送到服务器。 我也遇到了同步过程的顺序问题:先推送更改,先更改推送更改? 我目前build立的是在服务器端默认的MongoDB实现,它隔离了所有查询中的特定用户组的所有文档(目前仅处理authentication和服务器端数据库工作)。 在客户端,我已经构build了一个NeDB存储的封装,使我能够拦截所有的查询操作来创build和pipe理每个查询的事件,同时保持默认的查询行为不变。 我还通过实现由客户端生成的自定义ID来补偿neDB和MongoDB的不同ID系统,这些ID是文档数据的一部分,因此重新创build数据库不会混淆ID(在同步时,这些ID应在所有客户端保持一致)。 事件格式如下所示: { type: 'create/update/remove', collection: 'CollectionIdentifier', target: ?ID, //The global custom ID of the document updated data: {}, //The inserted/updated data timestamp: '', creator: //Some way to identify the author of the change } 为了节省客户端上的一些内存,我将在一定数量的事件中创build快照,以便完全重放所有事件将更有效率。 所以,为了缩小这个问题 :我能够在客户端重放事件,我也能够在客户端和服务器端创build并维护事件,在服务器端合并事件也不成问题。复制整个数据库与现有的工具不是一个选项,因为我只同步数据库的某些部分(甚至不是整个集合,因为文档分配不同的组,他们应该同步)。 但是我遇到的麻烦是 : 确定同步时从客户端发送什么事件的过程(避免发送重复事件甚至所有事件) 确定要发送回客户端的事件(避免发送重复事件,甚至是所有事件) […]