gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 02:31:06 25 4
gpt4 key购买 nike

顺便说一句,你如何创建一个流?

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;
}

admin

最佳答案

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

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

建议将您的流称为“category-id”-(在我们的例子中,category 是聚合名称),因为我们使用的是 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事件 - 我们只会看到那些“类别”,而不管它们的 ID 是什么 - 事件数据包含我们之后需要的所有内容。

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

    这是事件存储开始闪耀并从其他“事件存储实现”中脱颖而出的地方

    查看您的事件

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

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

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

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

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

    范式转变

    Event Store 具有相当的学习曲线,并且是对传统事务数据库的范式转变。 Event Stores 最好的 friend 是 CQRS - 我们使用了 CQRS Lite open source framework 的稍微修改过的版本

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

    关于eventstoredb - 我可以在 EventStore 管理站点的哪个位置查看我的保存事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52020412/

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