Java 在同一执行中处理同步API调用(REST/Spring)和异步消息(Kafka)

Java 在同一执行中处理同步API调用(REST/Spring)和异步消息(Kafka),java,spring,concurrency,apache-kafka,Java,Spring,Concurrency,Apache Kafka,我有一个用例来响应应该同步发生的对客户端的API调用。但在api执行过程中,系统A需要将kafka消息发布到另一个系统B,系统B向系统A返回其使用的响应,并应作为api响应响应到客户端 因此,这里的问题有异步发布子模型和同步API处理。我可以将producer和consumer作为两个不同的@Async方法来处理pub-sub,但是在同步执行中发现了将两者关联起来的问题 API生成的主线程可以等待使用者得到响应,但这将成为阻塞线程 我们高度赞赏任何关于实施该计划的建议 谢谢你没有说同步和异步部分

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

因此,这里的问题有异步发布子模型和同步API处理。我可以将producer和consumer作为两个不同的@Async方法来处理pub-sub,但是在同步执行中发现了将两者关联起来的问题

API生成的主线程可以等待使用者得到响应,但这将成为阻塞线程

我们高度赞赏任何关于实施该计划的建议


谢谢你没有说同步和异步部分是用什么编程语言编写的,但是一般来说你应该使用EIP书中描述的异步请求-响应模式


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

Hans,感谢您的回复。程序是用Java编写的,我在问题上加了标记。在同一个同步调用中关联请求和响应是这里的挑战。我可以阻止线程,但这不是一个可伸缩的选项。你不应该阻止线程。您需要它来轮询Kafka的响应。我的意思是,在从Kafka获得响应后,在相同的上下文中关联请求和响应,而不阻塞原始请求线程是一个挑战。您可能应该在原始同步API调用上设置一个超时,并在超时后返回null或error。否则,您可能会死锁并永远等待,这是一个糟糕的设计。您找到解决方案了吗?如果你能分享,我将不胜感激。。