【问题标题】:Microservice Design with SignalR使用 SignalR 进行微服务设计
【发布时间】:2021-04-14 06:59:44
【问题描述】:

我们已经构建了一个微服务架构,但遇到了一个问题,即发送到总线的消息太大。 (自从迁移到 Azure 服务总线后发现,因为与 RabbitMQ 4MB 相比,这只允许 256KB)

我们有一个如下图的设计。我们正在努力处理返回的数据。

一个例子是执行搜索并返回多个结果时。

逐步完成我们当前的流程:

  1. Web 客户端向 Web Api 发送 http 请求。
  2. Web api 然后将适当的消息放到总线上。 (Web api 以 Accepted 响应响应客户端)
  3. 微服务收到此消息。
  4. 微服务在其数据库中查询匹配搜索条件的记录。
  5. 从数据库返回的结果。
  6. 一条 SearchResult 消息被添加到总线。 (这包含结果)
  7. 我们的响应微服务正在侦听此 SearchResult 消息。
  8. 然后响应微服务发布到我们的 SignalR api。
  9. SignalR Api 将结果发送回 Web 客户端。

我的问题是,以这种方式设计时,我们如何处理大型结果集?如果不可能,应该如何更改设计以处理大型结果集?

我知道我们可以对结果进行分页,但即便如此,一个结果也可能超过 256KB 的限额,例如文档或特别大的对象。

【问题讨论】:

  • 您可以选择返回文件(doc、pdf 等)的链接,而不是在用户可以选择打开的 Web 客户端中。
  • 问题在于大型数据集,我可以看到链接可能适用于文档。但即便如此,我如何获得该链接,因为唯一的客户端连接是通过 WebApi 而不允许直接向每个微服务发出 http 请求。通过这种设计,我似乎必须对总线做出响应,当允许如此少量的数据时,这将不起作用。必须有一些模式/解决方案。

标签: signalr microservices message-queue


【解决方案1】:

有两种方法:-

  1. 使用支持大尺寸消息的类似 Kafka 的系统。
  2. 如果您不能采用第一种方法(从您的问题中可以看出),那么微服务可以为响应服务放置 2 种类型的消息 (1.) 如果大小很小,则放置完整的消息并 (2.) 如果大小超过支持,则放置包含指向 Azure 存储 Blob 的链接的消息,该链接具有结果 根据消息,响应服务可以得到正确的结果并返回给客户端。

【讨论】:

    猜你喜欢
    • 2016-08-01
    • 2017-09-21
    • 1970-01-01
    • 2018-04-28
    • 2017-06-25
    • 2020-10-04
    • 2019-07-03
    相关资源
    最近更新 更多