问题标签 [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.
domain-driven-design - 偶尔连接 CQRS 系统
问题:
两名员工(A 和 B)在编辑客户 #123(例如版本 #20)时同时下线,而在下线时继续进行更改...
场景:
1 - 两名员工编辑客户 #123 并对一个或多个相同属性进行更改。
2 - 两名员工编辑客户 #123,但不进行相同的更改(他们相互交叉但不接触)。
...然后他们都重新上线,第一个员工 A 追加,从而将客户更改为版本 #21,然后是员工 B,仍然在版本 #20
问题:
我们在场景 1 中保留谁的更改?
我们可以在场景 2 中进行合并,如何?
语境:
1 - CQRS + 事件溯源风格系统
2 - 使用事件溯源数据库作为队列
3 - 读取模型的最终一致性
4 - RESTful API
EDIT-1:根据迄今为止的答案进行澄清:
例如,为了执行细粒度合并,我需要为表单中的每个字段设置一个命令?
上面,ChangeName、ChangeSupplier、ChangeDescription 等的细粒度命令,每个都有自己的时间戳,将允许在事件 A 和 B 都更新 ChangedName 时自动合并?
Edit-2:根据特定事件存储的使用情况进行跟进:
似乎我将使用 @GetEventStore 来持久化我的事件流。
他们使用乐观并发如下:
流中的每个事件都会将流版本增加 1
写入可以指定预期版本,利用写入器上的 ES-ExpectedVersion 标头
-1 指定流不应该已经存在
0及以上指定流版本
如果流不是该版本,则写入将失败,您可以使用新的预期版本号重试,或者您重新处理该行为并决定如果您这样选择就可以了。
如果未指定 ES-Expected Version,则禁用乐观并发控制
在这种情况下,Optimistic Concurrency 不仅基于 Message ID,还基于 Event #
eventstoredb - GetEventStore 错误“实际位置 X 的日志记录长度过长”
在还原的数据库上执行ReadAllEventsForward
时,我收到以下错误:
该错误在命令行上以黄色显示,我从日志中检索到它。
我备份的系统正在运行,每隔几秒就有一个流接受一个事件。我使用了GetEventStore上的备份说明并仔细遵循它们。我将数据库恢复到 GetEventStore 安装的子文件夹并使用以下命令行:
在命令行输出中,我看到使用的数据库是正确的。调用 GetEventStore 的代码是基于 HTTP 的 C# .NET,它正在进行重新项目,第一次调用 GetEventStore 时失败。
我错过了什么/做错了什么?
先感谢您!
eventstoredb - EventStore 中的有效 eventId 是什么?
当我尝试发布没有 eventId 的事件时,我得到:
HTTP/1.1 400 提供了空的 eventId。
如果我用随机的东西填充 eventId,那么我得到:
HTTP/1.1 400 写入请求正文无效
在服务器的标准输出中,我看到:
将值“foo”转换为类型“System.Guid”时出错
获取有效的 EventId 需要什么?
命令:
事件.json:
我不是 .NET 语言。
multithreading - 紧密循环 - 磁盘 100%,四核 CPU @25% 使用率,只有 15MBsec 磁盘写入速度
我有一个紧密的循环,它贯穿大量购物车,这些购物车本身包含大约 10 个事件事件对象,并通过中间存储库(使用 GetEventStore.com 重新连接的 jOliver 公共域)以 JSON 格式将它们写入磁盘:
我看到磁盘说它是 100%,但整个过程是“低的”(15MB/秒,每秒约 5,000 个事件)为什么会这样,我能想到的事情是:
由于这是单线程的,25% 的 CPU 使用率实际上是否意味着我所在的 1 个内核的 100%(以任何方式显示我的应用程序在 Visual Studio 中运行的特定内核)?
我受 I/O 或 CPU 的限制吗?如果我为每个 CPU 创建一个自己的线程池,我可以期待更好的性能吗?
为什么我可以以 ~120MB/秒的速度复制文件,但我的应用程序只能获得 15MB/秒的吞吐量?这是由于许多较小数据包的写入大小造成的吗?
还有什么我错过的吗?
我使用的代码来自 geteventstore 文档/博客:
eventstoredb - 无法从外部访问 Windows Azure 上的事件存储
尽我所能,我无法访问我在 Windows Azure 上安装的 Event Store。我已按照wiki中完全推荐的说明进行操作。是的。我在 Azure 中正确设置了端口。但无论如何,我无法从外部机器连接到它。
在另一台机器上,如果我执行 curl {{mydomain}}.cloudapp.net,它会超时,但在 Azure VM 上,如果我执行 curl localhost,我会被移动(重定向到完整管理员)
cqrs - EventStore - 按创建时间读取事件
如果我想从例如事件编号 123中读取 EventStore ( http://geteventstore.com/ ) 流,我只需使用 ReadStreamEventsForwardAsync 并指定起始流位置(在这种情况下将其设置为 123)。
我想知道是否有类似的功能允许用户读取在指定日期之后创建的所有事件(例如,我想要在 2014 年 12 月 20 日之后创建的所有事件)。
一个简单的实现就是读取整个流,然后通过 ResolvedEvent 的“Created”字段过滤结果。
编辑:我刚刚实现了简单的解决方案,并注意到它导致新函数返回“ResolvedEvent []”,而不是“StreamEventsSlice”,因此引入了不必要的不一致。
event-sourcing - 聚合间通信
我目前每个聚合根和两个聚合根有一个事件流,Room
并且RoomType
.
a 的行为Room
取决于RoomType
它是什么。为了分离两个聚合, TheRoomType
仅表示为聚合中的 roomTypeId Room
。变化RoomType
由RoomTypeChanged
事件表示。
可以单独管理,RoomTypes
并且需要在不同的聚合中。
现在考虑以下用例:
当用户使 a 无效时RoomType
,所有Rooms
拥有它的人都Roomtype
应该切换到 fallback RoomType
。
我已经想到了几种方法,但它们似乎都有问题:
让事件侦听器侦听-event,并在所有具有该事件的 -aggregates 上
RoomTypeInvalidated
发送一个。我该怎么做呢?除非我访问我的 readmodel,否则无法知道哪些聚合具有它,这似乎不正确。即使我要加载所有聚合,也无法仅加载该类型的聚合,因为我无法加载所有流的子集(使用 geteventstore)。SwitchToFallbackRoomType
Room
Roomtype
Roomtype
当将
RoomTypeChanged
-events 重新应用到Room
聚合时,而不是仅仅应用它,检查它是否RoomType
仍然存在,但话又说回来,我怎么知道哪个RoomTypes
存在(我会和 1 处于相同的情况,但倒置) ? 此外,在重新应用事件时加入逻辑似乎是错误的,我认为它们应该只代表状态变化。
你会如何解决这个问题?
eventstoredb - How can I get the projections for specific category in Event Store?
I made following projection in Event Store:
How can I get the result for a specific stream? The stream Ids are: "Ping-255.1", "Ping-255.2".... "Ping-255.1000"
Looking at: http://localhost:2113/projection/stats-cont i get:
The following is not working: http://localhost:2113/projection/stats-cont/state?partition=255.1
Thanks in advance.
database - EventStore 自动备份
有没有办法自动备份EventStore
,除了手动脚本/控制台应用程序等之外没有找到任何解决方案。我正在使用Get EventStore。
node.js - 使用 rxjs 的集成测试 geteventstore 具有竞争条件
抱歉,这个有点乱。我的项目在nodejs中。我有一个摩卡测试。在其中我打开一个到 geteventstore 的连接并订阅一个流。这基本上开始发出事件。
我将该事件订阅包装在 rxjs 可观察对象中,然后将其写入控制台。
一半的时间我得到一个充满事件的流一半的时间我没有。
我感觉到事件循环开始监听,没有听到任何声音并在 geteventstore 开始用事件爆破它之前关闭。
我有点不知所措。我可以告诉 geteventstore 正在发送数据,因为我得到它的一半时间。我的理解是,只要有人订阅了一个事件,例如有一个事件监听器,循环就会保持打开状态。
所以也许问题出在 rxjs 上?
我不知道,任何帮助将不胜感激。
- - 编辑
我不知道这是否会有所帮助,但测试看起来像这样。
所以 mut 是到 geteventstore 的连接,rx 是 rxjs,订阅对象是一个事件发射器,它将数据从 geteventstore 中抽出。
我知道这个问题是因为它涉及至少两个有点不寻常的产品,geteventstore 和 rxjs。
我的意思是我非常有信心 gesConnection 和订阅实际上是连接和发射的。我只是不知道如何进一步测试/调查。
谢谢