Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Concurrency 事件源/CQRS对聚合、原子性、并发性和最终一致性的质疑_Concurrency_Cqrs_Event Sourcing_Atomicity_Eventual Consistency - Fatal编程技术网

Concurrency 事件源/CQRS对聚合、原子性、并发性和最终一致性的质疑

Concurrency 事件源/CQRS对聚合、原子性、并发性和最终一致性的质疑,concurrency,cqrs,event-sourcing,atomicity,eventual-consistency,Concurrency,Cqrs,Event Sourcing,Atomicity,Eventual Consistency,我正在研究事件源和命令/查询分离,我有一些疑问,希望有更多经验的人能够轻松回答: 一个命令处理程序应该处理多个聚合吗?a、 k.a.他们是否应该协调多个集合之间的事情? B如果我的命令处理程序生成多个要存储的事件,你们如何将所有这些事件以原子方式推送到事件存储?我如何保证没有其他命令处理程序会在两者之间交错事件? 在许多文章中,我读到人们建议使用乐观锁定来编写生成的新事件,但在我的用例中,每秒大约有100个请求。这让我觉得很多请求都会以很高的速率失败很多并发异常,你们是如何处理的? D如何处理命

我正在研究事件源和命令/查询分离,我有一些疑问,希望有更多经验的人能够轻松回答:

一个命令处理程序应该处理多个聚合吗?a、 k.a.他们是否应该协调多个集合之间的事情? B如果我的命令处理程序生成多个要存储的事件,你们如何将所有这些事件以原子方式推送到事件存储?我如何保证没有其他命令处理程序会在两者之间交错事件? 在许多文章中,我读到人们建议使用乐观锁定来编写生成的新事件,但在我的用例中,每秒大约有100个请求。这让我觉得很多请求都会以很高的速率失败很多并发异常,你们是如何处理的? D如何处理命令处理程序在事件存储区中存储事件后,但在将它们发布到事件总线之前可能崩溃的事实?如何最终将这些已确认的事件推回到事件总线? 你们如何处理预测的最终一致性?你就这样生活?或者在某些情况下,人们也把东西锁在那里?例如,等待更新 我制作了一个序列图来更好地说明所有这些问题

对不起,英语不好

如果我的命令处理程序生成多个要存储的事件,你们如何将所有这些事件以原子方式推送到事件存储

最合理的事件存储实现将允许您将多个事件批处理到同一事务中

在许多文章中,我读到人们建议使用乐观锁定来编写生成的新事件,但在我的用例中,每秒大约有100个请求

如果有很多并行线程试图维护一个复杂的不变量,那么就会出现严重错误

对于不希望建立或维护任何不变量的事件,则只需将内容写入流的末尾。换句话说,您可能没有尝试将事件写入流中的特定位置。因此,您可能可以使用批处理来减少冲突写入的数量,并使用一种简单的重试机制。实际上,您使用的扇入模式与并发写入程序插入队列时出现的扇入模式相同

对于建立/维护不变量的情况,通常不会有很多并发编写器。取而代之的是,特定的作者有权撰写事件,比如切分;并发控制主要是为了避免在异常情况下造成混乱

如何处理命令处理程序在事件存储区中存储事件后,但在发布到事件总线之前可能崩溃的事实

使用pull而不是push作为主要订阅机制。确保订阅者可以安全地处理重复消息(也称为幂等)。当您需要严格排序事件时,不要使用可以重新排序事件的消息订阅

你们是如何处理预测的最终一致性的?你就这样生活

差不多。视图和报表中包含元数据信息,让您知道报表在哪个固定时间点是准确的

除非在使用报表时锁定所有写入程序,否则任何数据都有可能过期,无论您使用的是事件还是其他数据模型,也不管您使用的是单个数据模型还是多个数据模型

这都是交易的一部分;我们接受报告时间和当前时间之间有一个更大的窗口,以换取更低的响应延迟、不变的事件历史记录等

命令处理程序应该与多个聚合一起工作吗

可能不是——这和以前不一样

通常的框架是这样的:聚合不像实体那样是一种领域建模模式。这是一种生命周期模式,用于确保我们一次所做的所有更改都是一致的

如果您发现希望命令处理程序同时修改多个域实体,并且这些实体属于不同的聚合,那么您是否真的选择了正确的聚合边界

有时,您可以使用单个命令处理程序来管理多个事务,在每个事务中更新不同的聚合。但从长远来看,让两个不同的命令处理程序各自接收命令副本并独立决定要做什么可能更容易

如果我的命令处理程序生成多个要存储的事件,你们如何将所有这些事件以原子方式推送到事件存储

最合理的事件存储实现将允许您将多个事件批处理到同一事务中

在许多文章中,我读到人们建议使用乐观锁定来编写 生成新事件,但在我的用例中,每秒大约有100个请求

如果有很多并行线程试图维护一个复杂的不变量,那么就会出现严重错误

对于不希望建立或维护任何不变量的事件,则只需将内容写入流的末尾。换句话说,您可能没有尝试将事件写入流中的特定位置。因此,您可能可以使用批处理来减少冲突写入的数量,并使用一种简单的重试机制。实际上,您使用的扇入模式与并发写入程序插入队列时出现的扇入模式相同

对于建立/维护不变量的情况,通常不会有很多并发编写器。取而代之的是,特定的作者有权撰写事件,比如切分;并发控制主要是为了避免在异常情况下造成混乱

如何处理命令处理程序在事件存储区中存储事件后,但在发布到事件总线之前可能崩溃的事实

使用pull而不是push作为主要订阅机制。确保订阅者可以安全地处理重复消息(也称为幂等)。当您需要严格排序事件时,不要使用可以重新排序事件的消息订阅

你们是如何处理预测的最终一致性的?你就这样生活

差不多。视图和报表中包含元数据信息,让您知道报表在哪个固定时间点是准确的

除非在使用报表时锁定所有写入程序,否则任何数据都有可能过期,无论您使用的是事件还是其他数据模型,也不管您使用的是单个数据模型还是多个数据模型

这都是交易的一部分;我们接受报告时间和当前时间之间有一个更大的窗口,以换取更低的响应延迟、不变的事件历史记录等

命令处理程序应该与多个聚合一起工作吗

可能不是——这和以前不一样

通常的框架是这样的:聚合不像实体那样是一种领域建模模式。这是一种生命周期模式,用于确保我们一次所做的所有更改都是一致的

如果您发现希望命令处理程序同时修改多个域实体,并且这些实体属于不同的聚合,那么您是否真的选择了正确的聚合边界


有时,您可以使用单个命令处理程序来管理多个事务,在每个事务中更新不同的聚合。但从长远来看,让两个不同的命令处理程序各自接收命令副本并独立决定要做什么可能更容易。

特定的编写者有权编写事件具体如何实现这一点?你是说卡夫卡吗?有权撰写事件的特定作家与卡夫卡没有任何关系,据我所知,卡夫卡没有任何支持这一点的东西;簿记员的Apache分布式日志部分提供了支持。它通常是应用程序的一部分,例如Akka中的群集分片/群集单例,以防止多个线程为同一实体写入事件。特定的写入程序有权写入事件具体如何实现?你是说卡夫卡吗?有权撰写事件的特定作家与卡夫卡没有任何关系,据我所知,卡夫卡没有任何支持这一点的东西;簿记员的Apache分布式日志部分提供了支持。它通常是应用程序的一部分,例如Akka中的集群分片/集群单例,以防止多个线程为同一实体写入事件。