CQRS 和 WebSocket
CQRS and WebSockets
当我们必须向基于 CQRS 的系统添加推送更新功能时,让 "read" 模型负责管理这些推送消息似乎是有意义的。当使用长轮询和服务器事件(主要是单向)时,这很有意义
但 WebSocket 是双向持久通道。它是一个已经建立的连接,可用于获取推送更新和发送命令。问题是 WebSocket 连接由于其减少的延迟和状态性而变得很方便用于自动完成搜索框等许多事情。乍一看,从技术角度来看,当已经有可用通道并准备就绪时,没有理由使用另一个端点(即:HTTP POST 接收器)。
启用 WebSocket 端点的正确位置在哪里?
读取模型:对于客户端推送更新和回答自动完成搜索框等查询是有意义的,但如果它接受 "writes",它会读取和更新模型又是同一个地方。
更新模型:接受客户端输入是有意义的。向客户端发送推送更新有点意义,因为它们是由其他客户端输入触发的。但是对于请求-响应的东西,比如搜索自动完成搜索,这没有意义。
WebSockets 是一个基础设施问题。正如您所指出的,它们在某些情况下比原始 HTTP 具有实质性优势,但它们与您的域策略无关。
在我们的一个项目中,出于您提到的原因,我们通过 WebSockets 发送了所有命令和查询(包括可观察的查询),但这是从这些命令的作者和客户那里抽象出来的。
抛开它们在现代 Web 堆栈中(略微)较低的延迟 [*] 我相信有两个明显的地方可以让它们大放异彩
- 订阅经典 pub/sub 事件流,例如在聊天系统中,或作为来自某种用户模型的事件流。
- 订阅 "observable read models" 或 "streaming projections" 或 "continuous queries" 或任何您想给他们起的名字,从而查询结果(例如,我有多少条未读消息)每当更新时发送给用户。
[*] IIS 等一些容器使 HTTP 调用变得非常昂贵,您被迫使用 WebSockets 以实现可接受的延迟(即 <1 毫秒)。但这正在改变。
当我们必须向基于 CQRS 的系统添加推送更新功能时,让 "read" 模型负责管理这些推送消息似乎是有意义的。当使用长轮询和服务器事件(主要是单向)时,这很有意义
但 WebSocket 是双向持久通道。它是一个已经建立的连接,可用于获取推送更新和发送命令。问题是 WebSocket 连接由于其减少的延迟和状态性而变得很方便用于自动完成搜索框等许多事情。乍一看,从技术角度来看,当已经有可用通道并准备就绪时,没有理由使用另一个端点(即:HTTP POST 接收器)。
启用 WebSocket 端点的正确位置在哪里?
读取模型:对于客户端推送更新和回答自动完成搜索框等查询是有意义的,但如果它接受 "writes",它会读取和更新模型又是同一个地方。
更新模型:接受客户端输入是有意义的。向客户端发送推送更新有点意义,因为它们是由其他客户端输入触发的。但是对于请求-响应的东西,比如搜索自动完成搜索,这没有意义。
WebSockets 是一个基础设施问题。正如您所指出的,它们在某些情况下比原始 HTTP 具有实质性优势,但它们与您的域策略无关。
在我们的一个项目中,出于您提到的原因,我们通过 WebSockets 发送了所有命令和查询(包括可观察的查询),但这是从这些命令的作者和客户那里抽象出来的。
抛开它们在现代 Web 堆栈中(略微)较低的延迟 [*] 我相信有两个明显的地方可以让它们大放异彩
- 订阅经典 pub/sub 事件流,例如在聊天系统中,或作为来自某种用户模型的事件流。
- 订阅 "observable read models" 或 "streaming projections" 或 "continuous queries" 或任何您想给他们起的名字,从而查询结果(例如,我有多少条未读消息)每当更新时发送给用户。
[*] IIS 等一些容器使 HTTP 调用变得非常昂贵,您被迫使用 WebSockets 以实现可接受的延迟(即 <1 毫秒)。但这正在改变。