Асинхронна відповідь HTTP
Привіт, спільното!
Робимо сервіс який повинен приймати HTTP запити і відповідати кліенту.
Цей метод повинен відправляти в кафку топік send дані від кліента і забути про це на деякий час (але не блокуватися). Наприклад
@GetMapping("/comp")public Mono<ShareObj> handleRequest() {CompletableFuture<ShareObj> future = new CompletableFuture<>();
ShareObj objectC = new ShareObj();
objectC.setReq(UUID.randomUUID().toString());
kafkaTemplate.send("send", objectC);futureMap.put(objectC.getReq(), future);
return Mono.fromFuture(future);
}
Десь дані с топіку send прочиталися і відповідь відправилась в топік resp. В тому методі де в нас @GetMapping("/comp") буде знаходитися KafkaListener який слухає топік resp звідки потрібно забрати дані для кліента.
@KafkaListener(topics = "resp", groupId = "consGroup")
public void listen(@Payload ShareObj req) {System.out.println(req);
var future = futureMap.get(req.getReq());
if (future != null) {future.complete(req);
futureMap.remove(req.getReq());}}
Я не зміг придумати краще ніж з CompletableFuture щоб повертати відповідь пізніше. Але втут дуже погана пропускна спроможність.
Як можна по іншому вирішити цю проблему або взагалі якийсь інший підхід?
26 коментарів
Додати коментар Підписатись на коментаріВідписатись від коментарів