【问题标题】:How should I implement GET endpoint using asynchronous communication?我应该如何使用异步通信实现 GET 端点?
【发布时间】:2020-10-17 13:38:21
【问题描述】:

我正在使用 RabbitMQ 和 Spring 构建后端。我的 POST、UPDATE 和 DELETE 端点使用我的消息代理 (rabbitMQ) 可以正常工作。 但是,我不知道应该如何使用消息代理实现 GET 端点。有没有办法使用异步通信为前端检索数据库信息?

编辑:我找到了解决方案。如果你想在微服务 Y 上使用它,你应该从微服务 X 克隆数据。此外,如果在 X 上更改它,你必须保持这些数据的更新,每次都将它发送给 Y。

微软有一些关于微服务的好东西,对我帮助很大:https://docs.microsoft.com/pt-br/dotnet/architecture/microservices/architect-microservice-container-applications/communication-in-microservice-architecture

【问题讨论】:

  • 如果你使用邮递员,如果你输入你的请求的 URL 以及它的 CRUD 操作类型,你可以得到它的代码。
  • 只是好奇,有什么理由需要'get'端点是异步的,为什么它应该通过消息代理?如果前端需要API响应,应该是直接同步调用后端API,将响应返回给前端?
  • 是的,@DinakaranSankaranarayan。我正在学习异步通信,并且在尝试了解如何使用微服务通信使我的所有端点完全异步时遇到了很多麻烦。好吧,我想我应该将它用于 GET。但如果我不这样做,那么我将在服务之间进行耦合,不是吗?

标签: java spring rabbitmq microservices


【解决方案1】:

这里的问题是您使用的是请求-响应协议 (http),这意味着与异步后端技术进行同步通信。

问题如下:使用http,您使用服务器线程池的线程来执行请求并返回响应,但是由于您使用的是消息代理,因此处理请求的线程与线程不同收到响应。

有两种可能的解决方案,如果您想继续使用异步通信来处理查询 (GET),您必须使用一些不使用请求-响应模型(如 SSE 或 WebSocket)的协议。 Spring 可以处理 SSe 在您的控制器中本机返回 Flux 或 Mono。

其他选项是使其同步并对数据库进行查询调用以获取阻塞线程的结果,直到您获得数据

【讨论】:

  • 如果我想在我的微服务之间进行完全异步通信,以响应式编程为目标,我应该如何在不能使用 http GET 之间共享数据(当然,由于 HTTP 的同步性质)?这是我最大的疑问。
猜你喜欢
  • 2016-12-09
  • 2017-10-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
  • 2011-03-20
  • 2012-07-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多