我可以在 EventStore 管理站点的哪个位置查看我的保存事件?

Where in the Admin site of EventStore I can view my saving events?

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

I use AppendToStreamAsync directly, is this right or shall I create a stream first then append onto this stream?

I also tried performing some tests but using the methods below I can write events onto EventStore but can't read Events from it.

最重要的问题是如何在 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;
    }

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

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

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

CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba

当您向同一个流名称写入更多事件时,流会逐渐成熟。

The first events ID becomes the "aggregateID" in our case and then each new eventID after that is unique. The only way to recreate our aggregate is to replay the events in sequence. If the sequence fails an exception is thrown

使用此命名约定的原因是为了您的方便,Event Store 运行了一些默认的内部投影。 Here is a very convoluted documentation about it

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

按类别

按类别基本上意味着存在使用内部投影创建的流,对于我们的 CustomerAggregate 我们订阅了 $ce-CustomerAggregate 事件 - 我们将只看到那些 "categories" 而不管它们的 ID -事件数据包含我们之后需要的一切。

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

这是事件存储开始闪耀并脱颖而出的地方"event store implementations"

正在查看您的活动

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

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

如果您想 see ALL the data then you use the RESTfull API 使用 Postman 之类的东西。也许有一个第三方软件可以创建类似数据源查看器的网格,但我不知道这一点。这也可能只是连接到 REST API 并且您可以通过这种方式非常快速地创建自己的可视化工具。

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

在某些情况下,如果您要处理非常大的流,则了解如何使用快照可以使重播事件分配得更快。

范式转换

Event Store 具有相当大的学习曲线,是传统事务数据库的范式转变。 Event Stores 最好的朋友是 CQRS - 我们使用 CQRS Lite open source framework

的略微修改版本

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