- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我已经写了一个事件源聚合,现在实现了一个事件源传奇...我注意到两者都是相似的,并创建了一个事件源对象作为两者的派生基类。
我在http://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/上看到了一个演示,但是感觉可能存在问题,因为在发送崩溃命令时,如果进程崩溃,命令可能会丢失?
public void Save(ISaga saga)
{
var events = saga.GetUncommittedEvents();
eventStore.Write(new UncommittedEventStream
{
Id = saga.Id,
Type = saga.GetType(),
Events = events,
ExpectedVersion = saga.Version - events.Count
});
foreach (var message in saga.GetUndispatchedMessages())
bus.Send(message); // can be done in different ways
saga.ClearUncommittedEvents();
saga.ClearUndispatchedMessages();
}
CommandEmittedFromSaga
并在命令失败时重新发送的外部EventHandler中)? Commands
和Events
存储在同一流中(与基类Message混合-Saga会同时使用Command和Events,而Aggregate将只使用Event)? public class CommandEmittedFromSaga : Event
{
public readonly Command Command;
public readonly Identity SagaIdentity;
public readonly Type SagaType;
public CommandEmittedFromSaga(Identity sagaIdentity, Type sagaType, Command command)
{
Command = command;
SagaType = sagaType;
SagaIdentity = sagaIdentity;
}
}
public class AlarmRequestedBySaga : Event
{
public readonly Event Event;
public readonly DateTime FireOn;
public readonly Identity Identity;
public readonly Type SagaType;
public AlarmRequestedBySaga(Identity identity, Type sagaType, Event @event, DateTime fireOn)
{
Identity = identity;
SagaType = sagaType;
Event = @event;
FireOn = fireOn;
}
}
public abstract class EventSourcedSaga
{
protected EventSourcedSaga() { }
protected EventSourcedSaga(Identity id, IEnumerable<Message> messages)
{
Identity = id;
if (messages == null) throw new ArgumentNullException(nameof(messages));
var count = 0;
foreach (var message in messages)
{
var ev = message as Event;
var command = message as Command;
if(ev != null) Transition(ev);
else if(command != null) _messages.Add(command);
else throw new Exception($"Unsupported message type {message.GetType()}");
count++;
}
if (count == 0)
throw new ArgumentException("No messages provided");
// All we need to know is the original number of events this
// entity has had applied at time of construction.
_unmutatedVersion = count;
_constructing = false;
}
readonly IEventDispatchStrategy _dispatcher = new EventDispatchByReflectionStrategy("When");
readonly List<Message> _messages = new List<Message>();
readonly int _unmutatedVersion;
private readonly bool _constructing = true;
public readonly Identity Identity;
public IList<Message> GetMessages()
{
return _messages.ToArray();
}
public void Transition(Event e)
{
_messages.Add(e);
_dispatcher.Dispatch(this, e);
}
protected void SendCommand(Command c)
{
// Don't add a command whilst we are in the constructor. Message
// state transition during construction must not generate new
// commands, as those command will already be in the message list.
if (_constructing) return;
_messages.Add(c);
}
public int UnmutatedVersion() => _unmutatedVersion;
}
最佳答案
我相信前两个问题是对流程管理者的错误理解所致(又名Sagas,请参阅底部的术语说明)。
转变思维
似乎您正在尝试将其建模为逆聚合(就像我曾经做的那样)。这样做的问题是:集合的“社会契约”是其输入(命令)可以随时间变化(因为系统必须能够随时间变化),而其输出(事件)却不能。写入事件后,事件就成为历史,系统必须始终能够处理这些事件。有了该条件,就可以从不可变事件流中可靠地加载聚合。
如果您只是尝试将输入和输出作为流程管理器实现反转,那么它的输出就不会成为记录问题,因为随着时间的推移,命令可能会过时并从系统中删除。当您尝试使用已删除的命令加载流时,它将崩溃。因此,无法可靠地从不可变消息流中重新加载建模为反向聚合的流程管理器。 (好吧,我确定您可以设计一种方法……但这是明智的吗?)
因此,让我们考虑一下它所取代的过程,以考虑实现一个流程管理器。以一个管理订单履行等流程的员工为例。为此用户要做的第一件事是在用户界面中设置一个 View ,供他们查看。您要做的第二件事是在UI中创建按钮,以使用户执行操作以响应他们在 View 上看到的内容。前任。 “此行包含PaymentFailed
,所以我单击CancelOrder
。此行包含PaymentSucceeded
和OrderItemOutOfStock
,所以我单击ChangeToBackOrder
。此顺序为Pending
且已使用1天,所以我单击FlagOrderForReview
“...等。一旦确定了正确的决策流程并开始占用用户太多时间,您就可以自动执行此流程。为了使它自动化,其他所有东西都可以保持不变( View ,甚至包括某些UI,以便您可以对其进行检查),但是用户已经变成了一段代码。
“走开,否则我将用一个非常小的Shell脚本代替您。”
现在,流程管理器代码会定期读取 View ,并且如果存在某些数据条件,则可以发出命令。本质上,Process Manager的最简单版本是一些可在计时器上运行的代码(例如,每小时一次),并且取决于特定的 View 。那是我开始的地方...您已经拥有的东西( View / View 更新器)和最少的添加(定期运行的代码)。即使您以后决定针对某些用例需要不同的功能,“Future You”也将更好地了解需要解决的特定缺陷。
这是一个使您想起Gall's law以及YAGNI的好地方。
- Any other reference material on the net for implementation of event sourced Sagas? Anything I can sanity check my ideas against?
关于domain-driven-design - EventSourced Saga实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33429626/
我遇到了搜索引擎优化问题,用户可以通过指定任何子域访问我的站点。这会导致 SEO 出现重复页面问题。 例如,如果用户错误输入“www”然后在论坛上发布了一个链接,则谷歌正在抓取“wwww.domain
这个问题在这里已经有了答案: 关闭10 年前。 Possible Duplicates: Can I change all my links to just //? Network-Path Ref
我正在玩 lighttpd在小型虚拟专用服务器上。我两个域指向服务器。我在 Ubuntu 8.10 上使用最新版本的 lighttpd 和 mod_evhost。 我正在尝试设置一个规则,这样如果任何
我正在开发一个由 domain.ext 提供的网络应用程序。此 Web 应用程序使用基于 cookie 的 session ,并为用户提供在子域上托管包含自定义 JavaScript 的网页的能力,例
我想重定向: 情况一、example.com到subdomain.example.com 情况2.www.example.com到subdomain.example.com 我已将这两段代码放入我的
我遇到了“领域对象”这个术语,并在 Google 上找到了几个定义,但我只是想验证我的理解是否正确。 这是否只是表示业务规则的任何类 - 因为“域”一词通常表示特定于某些本地问题集的规则,例如如何计算
将我们的应用程序静态内容托管在一个完全不同的域上而不是像其他域一样托管在我们主域的子域上有什么好处吗?例如微软使用 i.microsoft.com,谷歌使用 gstatic.com,雅虎使用 yimg
Orbited的客户端JS组件( cometd 服务器),要求如果服务器运行在与 JS 本身不同的域或端口上,则必须执行 document.domain = document.domain; 在加载任
我通读了另一篇文章,但似乎没有人回答我一直遇到的问题。是否可以使用通配符域的通配符子域(即使它仅用于子域而不是子子域),例如:foo.example.local。 我已经有 example.local
我在 Google Domains 上有一个域名,我想指向我在家里的 raspberry pi 服务器上运行的网站。我的公共(public) IP 地址是动态的,当 IP 更新时,我无法弄清楚如何保持
我有这个经典的 DDD 问题;我有一个做一些事情的域服务“DetectPriority”。 PM 要求我创建 2 个不同的服务;一个 INTERNAL(包含完整的业务规则并涉及许多其他领域模型)和另一
An interesting thread我刚才输入这个问题时就出现了。但我认为它没有回答我的问题。 我一直在使用 .NET MVC3 进行大量工作,因此需要一个贫乏的模型。 View 模型和编辑模型
我正在通过docker-compose运行最新版本的Artifactory OSS(如here和here所述)。我的docker-compose文件看起来像这样: version: '2' servi
我正在阅读 MDC entry for nsICookieManager2.add它讨论了域和非域 cookie。这两种类型的 cookie 有什么区别? 最佳答案 来自 RFC2109: Host
这是我的问题:http://regexr.com?2temn 我相信对于你们中的一些正则表达式大师来说这很简单。 干杯! 最佳答案 这也有效: (?<=\.|)\w+\.\w+$ 仅使用 PHP 进行
这应该很简单,但我无法理解。有许多好的和坏的正则表达式方法来匹配 URL,有或没有协议(protocol),有或没有 www。我遇到的问题是这个(在 javascript 中):如果我使用正则表达式来
我有一个网站 http://mywebsite.tld ,我想将 www.mywebsite.tld 重定向到 http://mywesite.tld (所以 www=>非 www) (防止重复内容)
TL;DR 我应该从 www.domain.tld 重定向到 domain.tld 还是相反? 我正在运行一个处理多个域的 CMS。到目前为止,CMS 负责将 www.domain.tld 重定向到
我目前有以下代码: string user = @"DOMAIN\USER"; string[] parts = user.Split(new string[] { "\\" }, StringSpl
使用 Go 和 AWS-SDK 我正在尝试查询 AWS 控制台中 Route53 -> Hosted Zones 下列出的 route53 CNAME 和 A 记录。我可以使用以下代码进行查询,但它需
我是一名优秀的程序员,十分优秀!