关闭。这个问题是基于意见的。它目前不接受答案。
**想改进这个问题吗?**更新这个问题,这样就可以通过编辑这篇文章用事实和引文来回答。
去年关门了。
改进这个问题
由于缺乏知识,我遇到了一个问题。你能帮我解决这个问题吗?
我有2台服务器:
宁静的微服务
与数据库交互的微服务
第一个微服务包含一个端点(让它成为 GET .../{id}
为简单起见)在 Controller
返回类型为的类 DeferredResult<String>
.
@GetMapping(/{id})
public DeferredResult<String> get(@PathVariable("id") final String id) {
final DeferredResult<String> deferredResult = new DeferredResult<>();
service.get(id, deferredResult);
return deferredResult;
}
第一台和第二台服务器通过apache kafka相互交互:
第一台服务器获得 GET
请求并调用在名为“getdata”的主题中生成消息“{id}”的服务
第二个服务器在的帮助下使用主题中的“{id}” @KafkaListener
2nd检索必要的数据并在主题“returndata”中生成它(当然,数据包含请求的{id})
第一个服务器在 @KafkaListener
一切都是以异步方式完成的。
在第一个服务器得到数据后,它需要用它来响应( .setResult(data)
在 DeferredResult<String>
示例)。
这意味着我需要以某种方式将Kafka的数据与正确的 DeferredResult<String>
示例。
在这一点上,我的方法似乎毫无结果。如何保持连接打开,并在使用kafka的数据后将其返回到正确的连接?
2条答案
按热度按时间9rnv2umw1#
我会避免这种做法。没有任何保证你的命令会被执行,但如果它会,没有保证的响应时间。
相反,从主题上的事件构建一个“投影”(例如,持久存储/数据库),并通过restapi以正常的方式从中读取。
然而,“写”的一方可能会对你的post请求做出React,就你的kafka主题发布一条消息(这最终会被上面提到的projectbuilder接收)
djmepvbi2#
根据定义,kafka是异步的,如果在处理请求之后需要响应,则不应使用kafka延迟处理。Kafka的正确用例更像是:您的请求已收到,这是您的跟踪号,或者。。。在请求中提供回调并调用第二个进程的回调部分。如果您需要同步响应,但担心背压,请尝试使用reactivestreams之类的方法,dropwizard使用asyn endpoint效果很好。在您的解决方案中,进程线程(或请求)挂起,等待可能永远不会出现的消息。如果您直接处理请求,则会得到相同的结果,但速度更快。我猜您在其他流中使用kafka主题,它们是同步的,在这种情况下回调对您来说可能更好。