问题标签 [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 投票
2 回答
1475 浏览

metadata - EventStore 基础 - 事件元数据/元数据和事件数据有什么区别?

我非常开始使用/理解EventStore或 get-event-store ,因为它可能在这里知道。

我已经阅读了有关客户、预测和订阅的文档,并准备开始在一些内部项目中使用。

我无法完全理解的一件事-是否有指南/一组建议来描述事件元数据和数据之间的区别?我知道名义上的差异;事件数据是领域的“核心”,用于描述的元数据,但它变得非常哲学化。

我想知道是否有关于实施(查询等)的硬性规则。

任何指导都感激不尽!

0 投票
1 回答
2958 浏览

domain-driven-design - EventSourced Saga 实现

我已经编写了一个事件源聚合,现在实现了一个事件源传奇......我注意到两者很相似,并创建了一个事件源对象作为两者派生的基类。

我在这里看过一个演示http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/但感觉可能存在问题,因为命令可能会丢失由于发送命令在写事务之外而导致进程崩溃?

相反,我使用的是 Greg Young 的 EventStore,当我保存 EventSourcedObject(聚合或 saga)时,顺序如下:

  1. Repository 获取新的 MutatingEvents 列表。
  2. 将它们写入流。
  3. 当流被写入并提交到流时,EventStore 会触发新事件。
  4. 我们监听来自 EventStore 的事件并在 EventHandlers 中处理它们。

我正在实现一个传奇的两个方面:

  1. 接收事件,这些事件可能会转换状态,而状态又可能会发出命令
  2. 发出警报,在将来的某个时间点(通过外部计时器服务)我们可以被回调)。

问题

  1. 据我了解,事件处理程序不应发出命令(如果命令失败会发生什么?) - 但我可以接受上述情况,因为 Saga 是通过此事件代理控制命令创建(对事件的反应)的实际事物,并且任何命令发送失败都可以在外部处理(在外部事件处理程序中CommandEmittedFromSaga,如果命令失败则处理并重新发送)?

  2. 还是我忘记了包装事件并将本机存储CommandsEvents同一个流中(与基类 Message 混合 - Saga 会同时使用命令和事件,聚合只会使用事件)?

  3. 网络上还有其他用于实现事件源 Sagas 的参考资料吗?有什么我可以理智地检查我的想法的吗?

一些背景代码如下。

Saga 发出运行命令(包装在 CommandEmittedFromSaga 事件中)

下面的命令包含在事件中:

Saga 在未来某个时间点请求回调(AlarmRequestedBySaga 事件)

警报回调请求被包装在一个事件中,并将在请求的时间或之后向 Saga 回火和事件:

或者,我可以将命令和事件存储在同一基本类型消息流中

0 投票
1 回答
1069 浏览

.net - How to use the EventStore Embedded Client?

There seem to be no docs regarding how to set up, run, and connect to an Embedded EventStore client using the EventStore.Client.Embedded nuget package. With the following code:

Everything seems to work fine up until the AppendToStreamAsync line, which throws the following exception:

Expected response of EventStore.Core.Messages.ClientMessage+WriteEventsCompleted, received EventStore.Core.Messages.ClientMessage+NotHandled instead.

What part of the magic incantation is missing to get around this exception?

0 投票
1 回答
853 浏览

c# - 如何将 EventStore 流中的数据解析为正确的类型?

我将事件数据存储在 EventStore 中:

似乎工作。但是如何在不给出具体类型的情况下解析 EventStore 中的数据呢?

我试过这种方式,但这只会解析基类的数据:

如何取回派生自 Event 的 SomeSpecialEvent 的数据?Event 类型有好几种,这里就不一一列举了(存储机制应该不知道具体的类型)。

任何想法如何在不使用泛型的情况下将 T 放入 .ParseJson 中?

0 投票
1 回答
45 浏览

eventstoredb - 非默认 EventStore 投影分隔符是否有效?

一个简单的问题,我希望社区可以分享一些经验:

投影分隔符是否有最佳实践?换句话说,“-”是一成不变的最佳实践(如投影名称,如:$stats-127.0.0.1:2113)还是可以安全使用“_”和其他分隔符(如:$stats_127 .0.0.1:2113.)。有没有人有使用替代定界符(正面或负面)的经验......如果我们走上替代定界符的道路,我不会考虑任何“陷阱”?

0 投票
3 回答
4221 浏览

.net - EventStore 订阅一个类别的流

我已经开始在 .Net 中创建一个测试应用程序,它使用 Greg Young 的 EventStore 作为 CQRS/ES 的后备存储。

为了便于加载完整的聚合,我保存到一个名为“agg-123”的流中。例如,对于 id 为 553 的产品聚合,将有一个名为“product-553”的流。然后对于“Order”聚合,流将被命名为“order-123”。

从事件的补液和保存来看,这很有效。

我现在正在尝试创建一个侦听器,它将侦听某些流,然后填充查询数据库。我看到的订阅方法似乎只能订阅“order-123”或“all”。我看不出我将如何订阅“产品-”或“订单-”,或两者兼而有之。

我想要么

  • 我错过了流名称的重点,并且将它们命名错误
  • 错过了选择它的方法,例如“product-*”
  • 预计会订阅“全部”并过滤掉您不感兴趣的内容,尽管这会产生问题,即它也会发送所有“统计”事件

任何人有什么建议吗?

0 投票
2 回答
4002 浏览

c# - serialise/deserialise messages in EventStore/EventHub

If both the producer and consumer of events/messages are .Net/C# based, I tend to use metadata in the payload in order to be able to deserialised the data into C# POCOs like so:

What would be a good solution in situations where the producer is not .Net/C# based?

0 投票
1 回答
484 浏览

c# - Rx:移动窗口中的分组事件计数

我已经开始考虑将 Reactive Extensions 与 EventStore 一起使用。作为概念证明,我想看看我是否可以让 Rx 使用事件流并输出按类型分组的事件计数,时间为一秒。

因此,假设我正在使用名为“orders”的流,我希望在控制台中看到类似以下内容:

(第二次通过..)

等等。

到目前为止,我已经能够获得每秒所有事件计数的输出。但似乎无法按事件类型对它们进行分组。

我使用的代码是基于 James Nugent 的一个要点

0 投票
1 回答
786 浏览

c# - 订阅分类流,订阅客户端中永远不会出现事件

作为GetEventStore的第一次用户并阅读了文档后,我遇到了一个问题,即事件从未出现在我的订阅客户端上。

这是可能的,因为我错过了一个配置步骤。

拥有此控制台应用程序客户端:

启动此控制台应用程序后,与http://myserver:1113的连接正常。在我的活动商店的管理面板中,我可以在竞争消费者选项卡上看到与此流/组的连接:

事件存储管理的图像

但是,如果我发送一个类似的事件,happening-<guid>它会显示在流浏览器上,但我的订阅客户端永远不会收到event appeared事件:

事件存储接收事件的图像

我是否误解了订阅、流和组的工作方式?请赐教。

0 投票
5 回答
3858 浏览

microservices - 事件存储可能成为单点故障?

几天以来,我一直在试图弄清楚如何通知其他微服务在微服务 A 中创建了一个新实体,该微服务 A 将该实体存储在 MongoDB 中。

我想要:

  • 微服务之间的耦合度低

  • 避免微服务之间的分布式事务,如两阶段提交 (2PC)

起初,像 RabbitMQ 这样的消息代理似乎是完成这项工作的好工具,但后来我发现在 MongoDB 中提交新文档并在代理中发布消息不是原子的问题。

为什么是事件溯源?通过 eventuate.io: 在此处输入图像描述

解决此问题的一种方法是通过添加一个标记来说明文档是否已在代理中发布并具有计划的后台进程来搜索 MongoDB 中未发布的文档并将其发布到代理,从而使文档的架构变得更脏确认,当确认到达时,文档将被标记为已发布(使用至少一次和幂等语义)。在这个这个答案中提出了这个解决方案。

阅读 Chris Richardson 的《微服务简介》后,我在这篇关于使用事件溯源开发功能域模型的精彩演讲中结束了其中一张幻灯片问道:

如何在没有 2PC 的情况下原子更新数据库发布事件和发布事件?(双写问题)。

答案很简单(在下一张幻灯片上)

更新数据库发布事件

这是基于CQRS a la Greg Young的另一种方法。

域存储库负责发布事件,这通常在单个事务中,同时将事件存储在事件存储中。

我认为将存储和发布事件的责任委托给事件存储是一件好事,因为它避免了 2PC 或后台进程的需要。

然而,从某种意义上说,这是真的

如果您依赖事件存储来发布事件,那么您将与存储机制紧密耦合。

但是,如果我们采用消息代理来实现微服务之间的通信,我们也可以这么说。

更让我担心的是,事件存储似乎变成了单点故障。

如果我们从eventuate.io看这个例子 在此处输入图像描述

我们可以看到,如果事件存储关闭,我们就无法创建账户或转账,失去了微服务的优势之一。(尽管系统将继续响应查询)。

那么,确认最终示例中使用的事件存储是单点故障是否正确?