- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在寻找一种审计模式来保存我的实体的历史,然后我遇到了事件溯源模式。这是一个有趣的模式,其中大部分对我来说都很有意义,但我有一个关于如何实现特定用例场景的问题?
用例:
以我对事件存储的理解。它应该只包含应用于实体的操作。因此事件始终具有更新的交易金额(付款和调整)和状态。
数据库:
发票:
| id | balance | payment | adjustment | status |
|-------|---------|---------|------------|----------|
| 12345 | 10 | 70 | 20 | Paid |
事件商店:
| event_id | invoice_id | Event | Payload |
|----------|------------|------------------|---------|
| 1 | 12345 | Invoice_InReview | JSON |
| 2 | 12345 | Invoice_Billed | JSON |
| 3 | 12345 | Invoice_Paid | JSON |
| 4 | 12345 | Invoice_Reversed | JSON |
| 5 | 12345 | Invoice_Paid | JSON |
JSON 包含有关付款、调整和状态更改的信息
这是我的问题
据我所知,余额没有问题,但发票状态不正确。
请告诉我如何最好地处理事件溯源模式。
最佳答案
I get how balances can be reversed but I do not see how we can accomplish the same effect for status
因此,首先要做的是与您的领域专家核实,以了解通用语言是否具有发票状态在冲销和还款之间的概念。
根据我在此处看到的情况,我预计会发生逆转,从而使状态再次变为已结算。我们认为它已支付,但该条目是错误的,因此我们会将对象恢复到之前的状态。
如果那是正确的,那么我们的状态将是Billed
。
但它可能不是——这不是撤消,而是您域中的一种行为。这可能会将域移动到状态机以前未发现的部分。
how will I handle if api calls(commands) come out of order for the above events.
那里可能隐藏着两个不同的问题 - 我将对每个问题进行总结。
如果您担心下游消费者对事件的 react ,那么设计您的消费者很重要——如果他们需要了解整个历史,那么他们会从历史中读取。对历史变化使用react的消费者将从事件存储中读取有序历史,而不是对出现在消息传输中的消息使用react。换句话说,发布的事件就像一个通知,告诉消费者刷新其历史副本。
如果您担心如果命令出现乱序会得到“错误”的历史记录,那么您需要阅读并整合 Udi Dahan 的文章 Race Conditions Don't Exist
A microsecond difference in timing shouldn’t make a difference to core business behaviors.
关于java - 在均匀采购模式中处理状态更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49944789/
我正在尝试在主目录中设置.vimrc文件。它包含的唯一内容是以下内容。 " Enable syntax highlighting syntax on 每当我想要来源运行. ~/.vimrc的文件时,都
我有权访问我试图在其上运行 Django REST 应用程序的 Dreamhost 子域。该服务器在 Ubuntu 12.04.5 LTS 上运行。我的虚拟环境出了点问题,所以我正在尝试关注 Drea
我已经在这个语法错误上停留了几个小时,有人可以帮我吗? root@wxserv:~/rap# source ~/.cshrc bash: /home/kbroeren/.cshrc: line 9:
我有一个如下所示的 bash 脚本 a.sh: #!/bin/bash echo $# echo $1 和一个如下所示的脚本 b.sh: #!/bin/bash source ./a.sh 如果我调用
我有一个如下所示的 bash 脚本 a.sh: #!/bin/bash echo $# echo $1 和一个如下所示的脚本 b.sh: #!/bin/bash source ./a.sh 如果我调用
在我的.cshrc中,LD_LIBRARY_PATH原来是这样的: setenv LD_LIBRARY_PATH path_one:$LD_LIBRARY_PATH 我编辑 .cshrc 以将 pat
我原来的 .bashrc 脚本目前用于运行模型运行。现在我需要操纵它来编译一个全新的模型。 我的问题是,如果我将原始 .bashrc 保存为诸如 .bwwbashrc 之类的东西,我是否需要以某种方式
最近,我遇到了 Linux 命令 source 然后找到了 this answer关于它的作用。 我的理解是 source 执行传递给它的文件,它确实适用于一个简单的 shell 脚本。然后我尝试在
我有一个脚本,用于在调用 csh shell 中设置一些环境变量。其中一些变量取决于脚本的位置。 如果该文件是正确的 csh 脚本,我可以使用 $0 访问 __FILE__但如果我使用源代码运行脚本,
我在“Ubuntu 14.04.5 LTS”上新安装了 Anaconda (Anaconda3-2019.07-Linux-x86_64),但激活安装失败: source ~/.bashrc返回 Il
有没有办法从网络上获取 R 脚本? 例如source('http://github.com/project/R/file.r') 原因:我目前有一个项目,我想让它可供使用,但还没有准备好打包。因此,最
我发现在使用 && 进行流水线处理时,获取以下 bash 脚本不会导致命令序列停止。 sourceme.sh: #!/usr/bin/env bash set -o errexit set -o |
我目前正在尝试使用 python 为我的团队编写一些组件测试,我遇到了一个测试程序,该程序告诉测试人员获取一个 csh 文件。这个文件有一堆 setenv 命令和别名。链中的下一个可执行文件需要所有这
我正在运行 neovim 0.7.0,我的 .vimrc 位于 ~/.config/nvim/init.vim 我还有以下文件:~/.config/nvim/lua/statusline.lua 一行
我正在运行 neovim 0.7.0,我的 .vimrc 位于 ~/.config/nvim/init.vim 我还有以下文件:~/.config/nvim/lua/statusline.lua 一行
代码片段取自 chernan's sample REST queries用于定义 R6 类的一个私有(private)方法、两个公共(public)属性和一个构造函数: library(R6) lib
我正在阅读 O'Reilly 出版的“Learning MySQL”一书,我正在尝试获取本书网站上发布的以下 SQL 代码: DROP DATABASE IF EXISTS music; CREATE
我在从我的 Ubuntu 10.04 .profile 获取 Ruby 版本管理器 rvm 时遇到问题。代码: [[ -s "$HOME/.rvm/scripts/rvm" ] && . "$HOME
我想将 Anaconda Python 作为我的默认 Python 环境。 为了在系统 Python 上使用 Anaconda,我一直在研究以下两个选项: 将 Anaconda bin 路径添加到我的
这类似于 How to source R Markdown file like `source('myfile.r')`?有以下区别:我希望我的 Markdown 文件生成一个 R 脚本以供将来采购。
我是一名优秀的程序员,十分优秀!