顺便问一下,如何创建 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;
}
Run Code Online (Sandbox Code Playgroud)
当您编写事件时,流会自动创建。不过,您应该遵循推荐的命名约定,因为它可以启用一些开箱即用的功能。
await Connection.AppendToStreamAsync("CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba", expectedVersion, creds, eventData);
Run Code Online (Sandbox Code Playgroud)
建议将您的流称为“category-id” - (在我们的例子中,category 是聚合名称),因为我们使用的是 DDD+CQRS 模式
CustomerAggregate-b2c28cc1-2880-4924-b68f-d85cf24389ba
当您将更多事件写入同一流名称时,流就会成熟。
在我们的例子中,第一个事件 ID 成为“aggregateID”,之后的每个新事件 ID 都是唯一的。重新创建聚合的唯一方法是按顺序重播事件。如果序列失败,则会抛出异常
使用此命名约定的原因是,Event Store 运行一些默认的内部投影,以方便您使用。这是关于它的非常复杂的文档
按类别
按类别基本上意味着使用内部投影创建流,对于我们来说,CustomerAggregate我们订阅$ce-CustomerAggregate事件 - 我们只会看到那些“类别”,无论它们的 ID 是什么 - 事件数据包含我们之后需要的所有内容。
我们使用持久订阅者(小型 C# 控制台应用程序),它们被设置为与$ce-CustomerAggregate. 持久订阅者很棒,因为他们记得客户确认的最后一个事件。因此,如果应用程序崩溃,您可以启动它,它会从应用程序最后完成的位置开始。
这就是事件存储开始闪耀并从其他“事件存储实现”中脱颖而出的地方
查看您的活动
持久订阅者的示例是使用代码进行设置的一种方法。
您无法真正在管理站点中查看“所有”数据。管理站点的目的是管理投影、管理用户、查看一些统计数据、创建一些投影以及仅查看流和事件的最新视图。(如果您知道 ID,则可以根据需要创建 URL - 但无法搜索它们)
如果您想查看所有数据,那么您可以使用Postman 等 RESTfull API。也许有第三方软件可以创建类似数据源查看器的网格,但我不知道这一点。这也可能只是连接到 REST API,您可以通过这种方式非常快速地创建您自己的可视化工具。
再次回到代码,您还可以始终使用某个库从 0 读取所有事件 - 顺便说一下,使用 DDD+CQRS,您始终从 0 读取聚合流以重建其状态。但您可以对其他要求执行相同的操作。
在某些情况下,如果您有一个非常大的流需要处理,那么了解如何使用快照可以使重放事件分配得更快。
模式转变
Event Store 具有相当长的学习曲线,是传统事务数据库的范式转变。Event Stores 最好的朋友是 CQRS - 我们使用CQRS Lite 开源框架的稍微修改版本
要真正理解 Event Store,您需要了解 DDD 概念,然后深入研究 CQRS/ES - 有一些很好的 YouTube 视频和示例。
| 归档时间: |
|
| 查看次数: |
991 次 |
| 最近记录: |