问题标签 [eventstoredb]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1425 浏览

.net - 如何通过 .Net 客户端在 Eventstore 集群上写入和读取事件

我尝试使用 .Net 客户端在事件存储集群上写入和读取事件。因此,我设置了 3 个本地 docker 容器来测试对集群的写入和读取。我已经设置了集群,它说它还活着(1 个主节点和 2 个从节点)。

不幸的是,当我尝试从 eventstore 上的 .Net 客户端写入或读取时,连接一直在打开和关闭,并且没有调用到达商店。如何连接到集群以写入和读取事件?

如果我使用没有集群的事件存储,则方法可以正常工作,我可以创建和使用事件。使用集群,我只收到以下日志消息:

如果我使用 WebUI 将事件写入集群事件存储,它将接受它,然后可以在事件存储的 WebUI 中找到该事件。


如果您需要详细信息,以下是我的设置:

eventstore 集群的设置如eventstore docs中所述。通过设置集群设置为使用 dns discover-via-dns=false。这是我.yaml的 docker 设置文件:

为了测试连接以及是否可以在 eventstore 集群上读写,我创建了以下小应用程序:

主程序:

连接工厂:

集群的连接是按照eventstore 文档中的描述创建的,但是该文档与我使用的最新 nuget 版本并非 100% 一致。

nuget 版本:

写事件:

阅读事件:

0 投票
1 回答
935 浏览

kubernetes - Kubernetes 持久卷数据在多个 pod 删除后损坏

我正在努力在 Kubernetes 集群上对官方事件存储映像进行简单的单副本部署。我正在使用持久卷进行数据存储。

这是我的持久卷声明的 yaml:

部署工作正常。当我测试耐用性时,我开始遇到问题。我删除了一个 pod 以强制实际状态脱离期望状态,并查看 Kubernetes 的反应。

它立即启动了一个新的 pod 来替换已删除的 pod。并且管理 UI 仍然显示相同的数据。但是第二次删除一个pod后,新的pod没有出现。根据此讨论,我收到一条错误消息,显示“记录太大”,表明数据已损坏。https://groups.google.com/forum/#!topic/event-store/gUKLaxZj4gw

我又试了几次。每次都是一样的结果。第二次删除 pod 后,数据已损坏。这让我担心实际失败会导致类似的结果。

但是,在部署新版本的映像或将部署中的 pod 缩放到零并返回到 1 时,不会发生数据损坏。多次尝试后一切正常。这很奇怪,因为它也完全取代了 pod(我检查了 pod id 并且它们改变了)。

这让我想知道使用 kubectl delete 删除 pod 在终止 pod 的方式上是否更有力。大家有没有类似的经历?关于删除是否/如何不同的见解?提前感谢您的意见。

问候,

奥斯卡

0 投票
1 回答
1544 浏览

c# - 序列化和反序列化域事件以在通用实现中持久化并从事件存储中检索

我将 DDD 与 CQRS 和事件溯源一起使用。我需要在我的自定义实现中使用事件存储(特别是这个事件存储IEventStore)来持久化和检索域事件,但是我在处理序列化/反序列化的方法上遇到了困难。

这是我正在实现的接口:

在我的实现之外,IEventStore我可以将每个映射器映射IDomainEvent到一些可序列化/可反序列化的 EventDto 或 json 字符串。这不是问题。但这些是我的限制:

  • 我的域事件是实现的不可变对象IDomainEvent(即:没有设置器)

  • 我的域事件并不总是很容易以通用方式序列化/反序列化。它们通常具有抽象或接口属性,因此我的域事件和一些可序列化对象(如字符串 json 或事件 DTO)之间的具体映射器在我的IEventStore实现之外决定。

  • 我的IEventStore实现需要是通用的,如果我添加新的域事件类型,我不需要IEventStore实现中触及任何东西

  • 我的IEventStore实现可以接收注入的一些特定实现IMapper<TSource, TDestination>,以便我可以使用它们在特定类型(不是接口)之间进行序列化/反序列化。

    /li>

下面是我的尝试:

正如您可以想象的那样,问题主要在于IDomainEventFactory实施。我需要一个实现以下接口的类:

这个类需要知道IDomainEvent它需要在运行时将resolvedEvent反序列化到哪个具体。换句话说,如果要检索的事件是 json 表示,MyThingCreatedEvent也许我可以使用诸如IMapper<ResolvedEvent, MyThingCreatedEvent>. 但是,如果要检索的事件是 json 表示,MyThingUpdatedEvent那么我将需要一个服务,例如IMapper<ResolvedEvent, MyThingUpdatedEvent>.

我想到了一些方法。

选项 1: 我认为我可以让IDomainEventFactory实现使用 autofac IComponentContext,以便在运行时我可以设法做一些_componentContext.Resolve(theNeededType). 但我不知道如何检索我需要的 IMapper。也许这是可能的,但我对此表示怀疑。

选项 2: 也许我可以拥有一些地图服务,例如 IBetterMapper,例如

这样我的工厂就可以将知道如何将任何东西反序列化为TDestination. 但是我会遇到同样的问题:我不知道如何在运行时从字符串创建一个类型,例如,做类似的事情_myBetterMapper.Map<WhichTypeHere>,并且实现该 Map 方法还有一个额外的问题,我想这需要一些注册表并根据类型选择一个或另一个特定的映射器。

我真的坚持这一点。希望我能得到你们的帮助!:)

更新:我已经实现了自己的解决方案并将项目上传到我的个人仓库中:https ://gitlab.com/iberodev/DiDrDe.EventStore.Infra.EventStore 我采用的解决方案是保持事件存储包装器不可知,但在 DI 注册时为那些有点“特殊”的事件提供自定义序列化器/反序列化器。EventStore 允许添加自定义元数据标头,因此我使用一些自定义标头来指定每个数据流上的具体实现类型,以便在检索持久事件时知道在哪里反序列化。

0 投票
1 回答
1333 浏览

elasticsearch - 使用 EventStore 和 ElasticSearch 实现 CQRS

我目前正在使用 ElasticSearch 和 EventStore 学习 CQRS 实现。因此,我决定使用EventStore将严重的事件流保存到 EventStore 中,并且我想使用 Elastic Search 从 EventStore 中查询 Data/CurrentState 数据。

我的问题是,

1.) 使用ElasticSearch,我们是直接从 EventStore 中查询聚合的 Data/CurrentState 数据还是需要将聚合的 Data/CurrentState 数据同步/存储到 ElasticSearch 中进行查询?

2.) 将事件存储数据同步/索引到弹性搜索中的正确方法是什么?我们是否需要使用任何中介将 EventStore 数据同步/索引到弹性搜索中?我的最终目标是使用 EventStore for Command 和 ElasticSearch for Querying 构建 CQRS 实现

注意:我计划使用NESTElasticSearch.net dll在.net Core中构建一个系统。

非常感谢您的想法。

提前致谢。

0 投票
0 回答
448 浏览

docker - 如何使用 docker-flow 在代理后面运行 eventstore?

我正在尝试使用反向代理将eventstore docker容器暴露给互联网。我是docker -flow 代理DFPLE for https forletsencrypt。所有这些都在 docker swarm 模式(新 swarm)下运行。

我希望通过https://example.com/eventstore可以访问 eventstore 。

这是我的堆栈文件:

为了完整起见,这里是代理堆栈:

0 投票
1 回答
624 浏览

eventstoredb - 在 EventStore 的管理站点中,我可以在哪里查看我的保存事件?

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

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

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

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

这是代码:

行政

0 投票
2 回答
872 浏览

cqrs - 事件存储和乐观并发

Greg Young 在他关于 CQRS 的“构建事件存储”部分的文档中,当将事件写入事件存储时,他检查了乐观并发。我真的不明白他为什么要检查,谁能用一个具体的例子向我解释。

0 投票
1 回答
217 浏览

c# - 什么是聚合函数?

我想在业余时间学习事件溯源(使用 Greg Youngs Event Store)。我已经设置了一个简单的流,我可以从中读取和写入。

请参阅此链接:https ://eventstore.org/docs/getting-started/?tabs=tabid-1%2Ctabid-dotnet-client%2Ctabid-dotnet-client-connect%2Ctabid-4 。它说:

“如果您对领域模型进行事件溯源,则流等同于聚合函数。”

我不相信我以前曾经遇到过聚合函数这个术语——我知道聚合根和聚合,但不知道聚合函数。假设我有以下事件:

如果我要在 SQL Server 中创建一个事件日志,那么它可能看起来像这样(Cargo 列包含序列化对象):

在此处输入图像描述

为此,我在 Event Store 中有哪些事件流?我在这里阅读了一位似乎对事件溯源非常了解的用户的回答,他提出了以下建议:

在此基础上,相信这些事件将被命名如下:

因此有 10 个事件流。这看起来有点令人困惑,即连接聚合 ID 和版本 - 例如,假设我有以下内容:

我怎么知道 51745 的哪一部分是聚合 ID,哪一部分是版本。

我是否正确理解了这一点?

0 投票
1 回答
1132 浏览

eventstoredb - 事件存储终止时如何正确处理追赶订阅重新连接

当追赶订阅重新连接时,事件存储似乎不一致。根据 google 组中的线程和实验,如果 SubscriptionDropReason 为 ,则似乎追赶订阅将自动重新连接ConnectionClosed

但是,如果您随后尝试停止这些连接并指定超时,那么它们似乎永远不会真正停止并且总是超时。

我使用了这篇文章中的代码,但我认为这具有误导性,因为在我的实验中,在这种情况下收到多个事件的原因是,当事件存储重新联机时,事件存储会自动重新订阅 CatchupSubscriptions,只要你不重新订阅当原因是 ConnectionClosed 时,您将不会多次收到事件。如果我修改此代码以将超时添加到.Stop(timeout)方法中,那么它只会挂起并抛出。

当我在自动重新连接后收到对实时处理启动事件的调用时,该EventStoreCatchUpSubscription对象具有内部状态,这表明_isDropped=1,这对我来说也很奇怪,因为它没有被丢弃,它实际上正在处理事件。

所以我的问题是我应该如何处理 eventstore 自动重新连接并且我想断开连接并等待超时的情况?

0 投票
1 回答
685 浏览

c# - 事件存储无法写入软删除流

澄清:这个问题是关于 Greg Young 的 Event Store。

我试图软删除包含 2 个事件的流:

这个电话是成功的,调查商店发现了一个新的元数据事件。此事件的类型$metadata和包含:

$tb代表“之前截断”,在删除流和事件中进行了描述。文档说:

删除流时,其 TruncateBefore 或 $tb 设置为流当前最后一个事件编号。

哪个(如您在上面的 json 中所见)并非如此。截断之前设置为long.MaxVaue。尽管这似乎是不好的行为,但它并不是真正的问题。问题是我不能再写入流了。调用以下片段成功完成,但不会将任何事件附加到流中:

在上面的片段中,expectedVersion设置为-1. 软删除流的元数据说:

从流的最后一个事件中读取切片显示:

有没有人遇到过同样的问题,并且可能已经找到了允许继续将事件附加到已删除流的解决方案?