我们的存储空间中有很多记录应该保留订购。 这些记录通过常用的CRUD API进行管理:因此用户可以添加新记录,更改现有记录的顺序等。我们用于记录的存储不是事务性的(实际上它是MongoDB)。我们会在事件更新时触发事件以便记录,以便消费者可以实际使用API来获取更新版本的记录。
让我再次强调一下:记录应该在CRUD应用程序中进行修改以及通过事件阅读状态的消费者时保持有序。
如果我们决定使用某个整数字段来跟踪记录顺序,那么我们必须在更改某些记录的顺序时更新许多记录。例如,我们有
Fox order=1
Bear order=2
Cat order=3
然后我们决定添加Wombat作为第二条记录 - 我们必须更新Bear和Cat的顺序:
Fox order=1
Wombat order=2
Bear order=3
Cat order=4
想象一下,有很多记录会以这种方式转移 - 这可能会成为严重的问题,因为我们将为所有这些记录触发更改事件,消费者基本上必须重新同步整个存储。
如果我们使用链表方法(每个记录跟踪其邻居),那么重新排序变得更容易,但消费者可能发现自己处于不一致状态。例如,我们有:
Fox next=Bear previous=none
Bear next=Cat previous=Fox
Cat next=none previous=Bear
然后我们将Wombat添加为第二条记录:
Fox next=Wombat previous=none
Wombat next=Bear previous=Fox
Bear next=Cat previous=Wombat
Cat next=none previous=Bear
问题在于消费者可以首先获得Fox被更改的事件,其下一条记录是Wombat,然后才真正获得有关正在创建Wombat的事件。如果消费者此时执行某些聚合操作 - 它将失败,因为它的记录副本不一致。
是否有任何结构或方法可以保持记录顺序,允许任意插入/重新排序/删除,但又避免了交易的需要?