Clojure 处理Datomic中存储的无序消息?

Clojure 处理Datomic中存储的无序消息?,clojure,datomic,Clojure,Datomic,背景 在分布式系统中,消息可能以无序的方式到达。例如,如果消息A在时间T1发送,而消息B在时间T2发送,则有可能在A之前接收到B。例如,如果A是“CustomerRegistered”之类的消息,而B是“CustomerUnregistered”,则这一点很重要 在其他数据库中,如果收到数据库中不存在的客户的CustomerUnregistered,我通常会写一个墓碑。然后,当收到CustomerRegistered消息时,我可以检查这个墓碑是否存在(可能只是根据用例忽略这个消息)。当然,我也可

背景

在分布式系统中,消息可能以无序的方式到达。例如,如果消息A在时间T1发送,而消息B在时间T2发送,则有可能在A之前接收到B。例如,如果A是“CustomerRegistered”之类的消息,而B是“CustomerUnregistered”,则这一点很重要

在其他数据库中,如果收到数据库中不存在的客户的CustomerUnregistered,我通常会写一个墓碑。然后,当收到CustomerRegistered消息时,我可以检查这个墓碑是否存在(可能只是根据用例忽略这个消息)。当然,我也可以用Datomic做一些类似的事情,但我希望Datomic可以帮助我,这样我就不需要这样做了

我想到的一个潜在解决方案是:

您是否可以撤消一个不存在的客户实体(CustomerUnregistered),然后在收到CustomerRegistered时,在撤消之前的历史记录中写入客户实体?如果能将
:db/txInstant
设置为消息中定义的时间戳,那就太好了(我认为)

问题


人们将如何用达托米语以惯用的方式处理这个场景

一般原则是,不要让应用程序代码操纵
:db/txInstant
:db/txInstant
表示您了解事实的时间,而不是它发生的时间

也许你应该考虑联合注册来添加一个关于客户的数据(例如通过即时类型的<代码>:客户/未注册的< /代码>属性),而不是收回那个客户的数据(这意味着:“忘记这个客户已经存在”)。p> 然而,如果收回客户的数据确实是您想要做的事情,我会使用一个记录来阻止客户注册交易的发生(我会通过一个交易功能来执行)