gpt4 book ai didi

java - 为什么事件源模式中使用事件流?

转载 作者:行者123 更新时间:2023-11-30 06:12:07 27 4
gpt4 key购买 nike

想要确保我清楚地了解随机删除的内容。

EVENT STORE 数据库

| p_key | invoice_id | Event type        | Version | Data |
|-------|------------|-------------------|---------|------|
| 1 | 41234 | Invoice_Generated | 1 | JSON |
| 2 | 34241 | Invoice_Generated | 1 | JSON |
| 3 | 12345 | Invoice_Generated | 1 | JSON |
| 4 | 12345 | Invoice_Reviewed | 2 | JSON |
| 5 | 12345 | Invoice_Paid | 3 | JSON |

JAVA侧组件

  1. Activity 商店:
  2. 事件流
  3. Activity

事件存储负责检索事件列表并在一切完成后将事件保存到数据库。

public interface EventStore {
EventStream loadEventStream(AggregateId aggregateId);
void store(AggregateId aggregateId, long version, List<Event> events);

}

事件本质上是从数据库检索的行之一。

public interface Event<T> {
AggregateId getAggregateId();

int getVersion();

String getEventType();

void applyOn(T account);
}

我不明白的是事件流的使用。对于我为什么需要事件流来说毫无意义

public interface EventStream extends Iterable<Event> {
long version();

void addAll(List<Event> changes);
}

事件流的唯一目的是提供迭代事件列表的能力,这听起来不太有用,也许我错过了一些东西,但为什么我不能摆脱事件流并就此结束?

来源:https://github.com/Pragmatists/eventsourcing-java-example/tree/excercise_1_solution/eventsourcing/src/main/java/com/pragmatists/eventsourcing

最佳答案

这个问题是关于事件源的非常低级别的 View ,并且在很大程度上取决于事件存储的实际实现。总而言之,我可以给你一个答案,希望能加深你对Event store的理解。

Is the sole purpose of event stream to give ability to iterate over list of events that does not sound so useful maybe I am missing something but why can't I just get rid of event stream and call it a day?

是的,事件流提供了一种迭代可能的大型事件列表的方法,而无需以阻塞方式从事件存储中检索所有事件。一般来说,它仅用于读取事件,因此其接口(interface)不包含将事件附加到事件存储的方法。

因此,客户端代码只需要流中的事件。

将事件添加到事件存储时,为了防止并发写入,需要传递事件流的预期版本。可以通过在方法 EventStore.appendEvents(expectedVersion, newEvents) 中使用 version 参数来完成此操作,也可以传递先前加载的事件流并让事件存储检索最后看到的版本,从而减少了客户端代码与事件流锁定机制实际实现的耦合。因此,附加方法的签名可能是这样的:

EventStore.appendEvents(previousEventStream, newEvents)

因此,客户端代码不知道/关心事件存储使用什么锁定机制(乐观或悲观)来防止并发写入。

可以找到这样的一个示例 here (免责声明:这是我的):

public function appendEventsForAggregate(AggregateDescriptor $aggregateDescriptor, $eventsWithMetaData, AggregateEventStream $expectedEventStream): void;

关于java - 为什么事件源模式中使用事件流?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50010287/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com