【问题标题】:Handling Sync API call (REST/Spring) and Async message (Kafka) in the same execution在同一执行中处理同步 API 调用 (REST/Spring) 和异步消息 (Kafka)
【发布时间】:2017-04-09 03:55:59
【问题描述】:

我有一个用例来响应应该在同步中发生的对客户端的 API 调用。但是在 api 执行过程中,系统 A 需要向不同的系统 B 发布 kafka 消息,系统 B 将响应返回给系统 A,它消耗并应作为 API 响应响应客户端。

所以,这里这个问题有异步发布-订阅模型和同步 API 处理。我可以将 pub-sub 与 producer 和 consumer 作为两种不同的 @Async 方法来处理,但是在 Sync 执行中发现了一个问题。

API 产生的主线程可以等待消费者得到响应,但这变成了阻塞线程。

任何关于实施这一点的建议都非常感谢。

谢谢

【问题讨论】:

  • 您找到解决方案了吗?如果你能分享,不胜感激..

标签: java spring concurrency apache-kafka


【解决方案1】:

您没有说明同步和异步部分是用什么编程语言编写的,但通常您应该使用此处 EIP 书中描述的异步请求响应模式 http://www.enterpriseintegrationpatterns.com/patterns/conversation/RequestResponse.html

处理同步 API(例如通过 HTTP 的 REST API 调用)的应用将发布到请求主题,包括在请求消息中的唯一 CorrelationID(您在应用中生成),然后在另一端,您的异步应用程序可以处理来自请求主题的这些请求,并使用 CorrelationID 作为键和/或将其包含在响应消息中来回复响应主题(因此原始请求者知道哪个响应与哪个请求相关联)。

【讨论】:

  • 汉斯,感谢您的回复。编程是用 Java 编写的,我在我的问题上标记了它。在同一个 Sync 调用中关联请求和响应是这里的挑战。我可以阻止线程,但这不是一个可扩展的选项。
  • 你不应该阻塞线程。您需要它来轮询 Kafka 以获取响应。
  • 我的意思是,在从 Kafka 获得响应后,在同一上下文中关联请求和响应,而不阻塞原始请求线程是挑战。
  • 您可能应该在原始同步 API 调用上设置一个超时,并在超时后返回 null 或错误。否则你可能会陷入僵局并永远等待,这是一个糟糕的设计。
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 1970-01-01
  • 2018-01-13
  • 2018-09-22
  • 2021-11-13
  • 1970-01-01
  • 2011-08-22
相关资源
最近更新 更多