使用 SignalR 进行微服务设计
Microservice Design with SignalR
我们已经构建了一个微服务架构,但是 运行 遇到了一个问题,即发送到总线的消息太大。 (自移动到 Azure 服务总线后发现,因为与 RabbitMQ 4MB 相比,这只允许 256KB)
我们有如下图的设计。我们苦苦挣扎的地方是返回的数据。
一个例子是执行搜索并返回多个结果。
逐步完成我们当前的流程:
- Web 客户端向 Web 发送一个 http 请求 Api。
- Web api 然后将适当的消息放到总线上。 (Web api 以已接受的响应响应客户端)
- 微服务接收到这条消息。
- 微服务在其数据库中查询符合搜索条件的记录。
- 从数据库返回的结果。
- SearchResult 消息已添加到总线。 (这包含结果)
- 我们的响应微服务正在侦听此 SearchResult 消息。
- 响应微服务然后发布到我们的 SignalR api。
- SignalR Api 将结果发送回 Web 客户端。
我的问题是,以这种方式设计时,我们如何处理大型结果集?如果不可能,应如何更改设计以处理大型结果集?
我知道我们可以对结果进行分页,但即便如此,一个结果也可能超过 256KB 的限额,例如一份文档或一个特别大的对象。
有两种方式:-
- 使用类似 Kafka 的系统,支持大尺寸消息。
- 如果您不能采用第一种方法(从您的问题中可以看出),那么微服务可以为响应服务放置两种类型的消息
(1.) 如果尺寸较小,则放置完整的消息并
(2.) 如果大小超出支持范围,则将包含 link 的消息放入具有结果的 Azure 存储 Blob
基于消息,响应服务可以得到正确的结果,return 与客户端相同。
我们已经构建了一个微服务架构,但是 运行 遇到了一个问题,即发送到总线的消息太大。 (自移动到 Azure 服务总线后发现,因为与 RabbitMQ 4MB 相比,这只允许 256KB)
我们有如下图的设计。我们苦苦挣扎的地方是返回的数据。
一个例子是执行搜索并返回多个结果。
逐步完成我们当前的流程:
- Web 客户端向 Web 发送一个 http 请求 Api。
- Web api 然后将适当的消息放到总线上。 (Web api 以已接受的响应响应客户端)
- 微服务接收到这条消息。
- 微服务在其数据库中查询符合搜索条件的记录。
- 从数据库返回的结果。
- SearchResult 消息已添加到总线。 (这包含结果)
- 我们的响应微服务正在侦听此 SearchResult 消息。
- 响应微服务然后发布到我们的 SignalR api。
- SignalR Api 将结果发送回 Web 客户端。
我的问题是,以这种方式设计时,我们如何处理大型结果集?如果不可能,应如何更改设计以处理大型结果集?
我知道我们可以对结果进行分页,但即便如此,一个结果也可能超过 256KB 的限额,例如一份文档或一个特别大的对象。
有两种方式:-
- 使用类似 Kafka 的系统,支持大尺寸消息。
- 如果您不能采用第一种方法(从您的问题中可以看出),那么微服务可以为响应服务放置两种类型的消息 (1.) 如果尺寸较小,则放置完整的消息并 (2.) 如果大小超出支持范围,则将包含 link 的消息放入具有结果的 Azure 存储 Blob 基于消息,响应服务可以得到正确的结果,return 与客户端相同。