4

顺便问一下,您如何创建 STREAM?

我直接使用 AppendToStreamAsync,这是对的还是我应该先创建一个流然后附加到这个流上?

我也尝试执行一些测试,但使用下面的方法我可以将事件写入 EventStore 但不能从中读取事件。

最重要的问题是如何在 EventStore 的管理站点中查看我的保存事件?

这是代码:

    public async Task AppendEventAsync(IEvent @event)
    {
        try
        {
            var eventData = new EventData(@event.EventId, 
                @event.GetType().AssemblyQualifiedName, 
                true, 
                Serializer.Serialize(@event), 
                Encoding.UTF8.GetBytes("{}"));

            var writeResult = await connection.AppendToStreamAsync(
                   @event.SourceId.ToString(),
                   @event.AggregateVersion,
                   eventData);

            Console.WriteLine(writeResult);
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex);
        }
    }


    public async Task<IEnumerable<IEvent>> ReadEventsAsync(Guid aggregateId)
    {
        var ret = new List<IEvent>();
        StreamEventsSlice currentSlice;
        long nextSliceStart = StreamPosition.Start;

        do
        {
            currentSlice = await connection.ReadStreamEventsForwardAsync(aggregateId.ToString(), nextSliceStart, 200, false);
            if (currentSlice.Status != SliceReadStatus.Success)
            {
                throw new Exception($"Aggregate {aggregateId} not found");
            }
            nextSliceStart = currentSlice.NextEventNumber;
            foreach (var resolvedEvent in currentSlice.Events)
            {
                ret.Add(Serializer.Deserialize(resolvedEvent.Event.EventType, resolvedEvent.Event.Data));
            }
        } while (!currentSlice.IsEndOfStream);

        return ret;
    }

行政

4

1 回答 1

5

在您编写事件时会自动创建流。您应该遵循推荐的命名约定,因为它启用了一些开箱即用的功能。

await Connection.AppendToStreamAsync("CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba", expectedVersion, creds, eventData);

建议将您的流称为“类别 ID”-(在我们的例子中,类别是聚合名称),因为我们使用的是 DDD+CQRS 模式

CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba

当您将更多事件写入相同的流名称时,流就会成熟。

在我们的例子中,第一个事件 ID 成为“聚合 ID”,然后每个新的事件 ID 都是唯一的。重新创建聚合的唯一方法是按顺序重放事件。如果序列失败,则抛出异常

使用此命名约定的原因是 Event Store 运行一些默认的内部投影以方便您使用。这是一个非常复杂的文档

  • $by_category
  • $by_event_type
  • $stream_by_category
  • $流

按类别

按类别基本上意味着有使用内部投影创建的流,CustomerAggregate我们订阅$ce-CustomerAggregate事件 - 而且我们只会看到那些“类别”,而不管它们的 ID 是什么 - 事件数据包含我们之后需要的所有内容。

我们使用设置为使用的持久订阅者(小型 ​​C# 控制台应用程序)$ce-CustomerAggregate。永久订阅者很棒,因为他们记得您的客户确认的最后一个事件。因此,如果应用程序崩溃,您启动它,它会从应用程序完成的最后一个地方开始。

这就是事件存储开始大放异彩并从其他“事件存储实现”中脱颖而出的地方

查看您的活动

持久订阅者的示例是使用代码进行设置的一种方法。

您无法在管理站点中真正查看“所有”数据。管理站点的目的是管理预测、管理用户、查看一些统计数据、创建一些预测以及仅查看流和事件的最新视图。(如果您知道 ID,您可以根据需要创建 URL - 但您无法搜索它们)

如果您想查看所有数据,那么您可以通过使用 Postman 之类的东西来使用 RESTfull API。也许有一个 3rd 方软件可以创建像数据源查看器一样的网格,但我不知道这一点。这也可能只是挂钩到 REST API,您可以通过这种方式非常快速地创建自己的可视化器。

再次回到代码,您还可以始终使用库中的一个从 0 读取所有事件 - 顺便说一下,使用 DDD+CQRS 您始终从 0 读取聚合流以重建其状态。但是您可以对其他要求执行相同的操作。

在某些情况下,如果您有一个非常大的流要处理,那么查看如何使用快照可以更快地分配重放事件。

模式转变

Event Store 有相当长的学习曲线,是传统事务数据库的范式转变。Event Stores 最好的朋友是 CQRS - 我们使用稍微修改过的CQRS Lite 开源框架版本

要真正欣赏 Event Store,您需要了解 DDD 概念,然后深入研究 CQRS/ES - 有一些不错的 YouTube 视频和示例。

于 2018-09-05T14:14:38.937 回答