2016-08-13 23 views
2

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

在分布式系统中,消息可能以无序方式到达。例如,如果在时间T1发送消息A并且在T2发送消息B,则有可能在A之前接收B.例如,如果A是诸如“CustomerRegistered”的消息并且B是“CustomerUnregistered”的消息。

在其他数据库中,如果收到数据库中不存在的客户的CustomerUnregistered,我通常会写一个墓碑。然后,我可以在收到CustomerRegistered消息时检查这个逻辑删除是否存在(也许根据用例简单地忽略此消息)。我当然可以做一些与Datomic类似的东西,但我希望Datomic可以帮助我,这样我就不需要这样做。

我想到的一个可能的解决方案是这样的:

可以或许收回不存在的客户实体(CustomerUnregistered)后来当CustomerRegistered收到客户实体在一个时间之前写在历史撤回?如果可以将:db/txInstant设置为消息中定义的时间戳,那将会很整洁(我认为)。

问题

如何将一个处理这种情况在Datomic以惯用的方式是什么?

回答

2

作为一般原则,不要让您的应用程序代码操纵:db/txInstant:db/txInstant代表您在学习的事实,而不是发生的时间。

也许您应该考虑取消注册为添加关于客户的Datom(例如通过即时型:customer/unregistered属性),而不是收回该客户的Datom(即:“忘记该客户已存在”)。但是,如果收回客户的数据库真的是您想要做的事情,我会使用一条记录来防止客户注册事务发生(我通过事务功能强制执行)。