背景
在分布式系统中,消息可能会以无序的方式到达。例如,如果消息 A 在时间 T1 发送,消息 B 在时间 T2 发送,则有可能在 A 之前接收到 B。例如,如果 A 是诸如“CustomerRegistered”的消息而 B 是“CustomerUnregistered”,则这一点很重要。
在其他数据库中,如果收到数据库中不存在的客户的 CustomerUnregistered,我通常会编写墓碑。然后,我可以在收到 CustomerRegistered 消息时检查此墓碑是否存在(并且可能只是根据用例忽略此消息)。我当然也可以使用 Datomic 做类似的事情,但我希望 Datomic 可以帮助我,这样我就不需要这样做了。
我正在考虑的一个潜在的解决方案是:
您是否可以撤回不存在的客户实体(CustomerUnregistered),然后在收到 CustomerRegistered 时,将客户实体写入历史记录中的某个时间before撤回? (我认为)如果:db/txInstant
可以设置为消息中定义的时间戳。
Question
在 Datomic 中如何以一种惯用的方式处理这种情况?
作为一般原则,不要让您的应用程序代码操纵:db/txInstant
. :db/txInstant
代表您所在的时间learned事实,而不是事情发生的时间。
也许您应该考虑取消注册作为添加有关客户的 Datom(例如通过即时类型:customer/unregistered
属性)而不是收回该客户的 Datom(这意味着:“忘记该客户的存在”)。
但是,如果收回客户的数据确实是您想要做的事情的方式,我会使用一个记录来阻止客户注册交易的发生(我将通过交易功能强制执行)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)