Sha*_*iZy 8 c# cqrs event-sourcing
我查看了许多事件采购教程,所有人都使用简单的演示来关注教程主题(事件采购)
这很好,直到你在实际的工作应用程序中找到这些教程之一未涵盖的内容:)
我打了这样的东西.我有两个数据库,一个事件存储和一个投影存储(读模型)所有聚合都有一个GUID ID,到目前为止100%罚款.
现在我创建了一个新的JobAggregate和一个Job Projection.我公司要求拥有一个独特的增量int64作业ID.
现在我看起来很愚蠢:)另一个问题是每秒多次创建一个作业!这意味着,获得下一个号码的方法必须非常安全.
在过去(没有ES)我有一个表,将PK定义为自动增量int64,保存Job,DB完成工作以给我下一个数字,完成.
但是我如何在我的Aggregate或命令处理程序中执行此操作?通常,投影作业是由事件处理程序创建的,但这是在过程的后期,因为聚合应该已经有了int64.(用于在空DB上重放聚合并具有相同的聚合ID - >作业ID关系)
我该如何解决这个问题?
亲切的问候
过去(没有ES)我有一个表,将PK定义为自动增量int64,保存作业,DB完成给我下一个数字的工作,完成。
在这个序列中有一件重要的事情需要注意,那就是唯一标识符的生成和数据在记录簿中的持久化都共享一个事务。
当您将这些想法分开时,您从根本上看是两个事务 - 一个事务消耗 id,以便没有其他聚合尝试共享它,另一个事务将该 id 写入存储中。
最好的答案是安排这两个部分都是同一事务的一部分 - 例如,如果您使用关系数据库作为事件存储,那么您可以在同一事务的“aggregate_id to long”表中创建一个条目当事件被保存时。
另一种可能性是将聚合的“创建”视为Prepare后跟Created; 使用事件处理程序,该事件处理程序通过事后保留长标识符来响应准备事件,然后向聚合发送新命令以将长标识符分配给它。因此,所有消费者都会Created看到分配给它的 long 的聚合。
值得注意的是,您正在为您正在创建的每个聚合分配有效的随机长整型,因此您最好深入了解公司认为从中获得的好处 - 如果他们期望标识符将提供订购保证或完整性保证,那么您最好了解这一点。
保留长的第一个并没有什么特别的问题;根据聚合保存失败的频率,您可能会出现间隙。在大多数情况下,您应该期望能够保持较小的失败率(即,在实际运行命令之前进行检查以确保您期望该命令成功)。
从真正意义上来说,唯一标识符的生成属于集合验证的范畴;我们通常会用 UUID 进行“欺骗”,放弃任何订购的假装,并假装碰撞的风险为零。关系数据库非常适合集合验证;活动商店可能没有那么多。如果您需要由模型控制的唯一顺序标识符,那么您的“分配的标识符集”需要位于聚合内。
要遵循的关键词是“业务成本”——确保您理解为什么长标识符很有价值。
| 归档时间: |
|
| 查看次数: |
1488 次 |
| 最近记录: |