【发布时间】:2020-06-20 05:05:22
【问题描述】:
我正在使用 CQRS 隔离,非常适用于从一个节点到远程节点的事务性命令或请求-响应。
我有一个用例,其中将向远程节点发出命令,这将产生“流”数据(很像远程命令运行,服务器在执行过程中以文本形式向我们提供更新):
// this is sent from requesting node to remote node to initiate the stream
public class LongRunningCommand: ICommand
{
Guid Session { get; set; } // the session ID to use
string CommandLine {get; set; } // the command the remote note will run
}
然后,这些数据会在一段时间内以多个数据包的形式从远程节点发送到请求节点:
// this is sent from remote node to requestor in multiple updates over time
public class UpdateProgress: ICommand
{
Guid Session { get; set; } // possibility to multiplex sessions
int Sequence { get; set; } // de-dupe/resequencing out of order packets (lower QOS)
byte[] Payload { get; set; } // the data to be passed to the application
}
这不是一个真正的命令,也不是一个请求-回复(因为有多个回复) - 这是一个长时间运行的会话,但我不确定这如何适合 CQRS。
订购这个的最佳方式是什么?我的请求节点是否可以具有如下所示的命令处理程序(其中UpdateProgress 是正在处理的“命令”):
public class UpdateProgressCommandHandler : ICommandHandler<UpdateProgress>
{
public async Task HandleAsync(UpdateProgress message)
{
// resequence in handler or chained infrastructure - omitted for brevity
var window = GetWindowForSession(message.Session);
var updateFromServer = System.Text.Encoding.UTF8.GetString(message.Payload);
await window.WriteLine(updateFromServer);
}
}
上述工作(我认为相当不错),但术语似乎有点时髦(命令名称 UpdateProgress 更像是一个事件而不是命令)。
或者我最好还是放弃命令/查询的概念,并使用完整的事件总线,如果我这样做了,我将如何处理初始请求,因为这不是一个事件,它更多的是一个命令(这将在处理事件(不是命令或查询)的事件总线上语义上没有意义。
或者我只是被命名约定所困扰?自从第一次这样做以来,请欣赏上述用例的最佳实践视图。
【问题讨论】:
标签: c# domain-driven-design microservices cqrs enterprise-integration