背景
在分布式系统中,消息可能以无序方式到达。例如,如果在时间T1发送消息A而在T2发送消息B,则有可能在A之前接收到B。例如,如果A是诸如“CustomerRegistered”的消息而B是“CustomerUnregistered”,则这很重要。
在其他数据库中,如果收到了数据库中不存在的客户的CustomerUnregistered,我通常会写一个墓碑。然后,我可以在收到CustomerRegistered消息时检查此逻辑删除是否存在(并且可能根据用例忽略此消息)。我当然可以做与Datomic类似的事情,但我希望Datomic可以帮助我,这样我就不需要这样做了。
我正在考虑的一个潜在解决方案是:
您是否可以收回不存在的客户实体(CustomerUnregistered),稍后当收到CustomerRegistered时,客户实体会在收回之前的历史时间中写入?如果:db/txInstant
可以设置为消息中定义的时间戳,那将是很好的(我认为)。
问题
如何以惯用的方式处理Datomic中的这种情况?
答案 0 :(得分:2)
作为一般原则,不要让您的应用程序代码操纵:db/txInstant
。 :db/txInstant
代表了解事实的时间,而不是事件发生的时间。
也许您应该考虑取消注册为添加关于客户的Datom(例如通过即时类型:customer/unregistered
属性)而不是收回该客户的数据(这意味着:"忘记这一点客户存在")。
但是,如果缩回客户的数据实际上是您想要做的事情,我会使用一条记录来阻止客户注册交易(我通过交易功能强制执行) )。