微服务-Spring AMQP/RabbitMQ,微服务之间的异步调用最佳模式

微服务-Spring AMQP/RabbitMQ,微服务之间的异步调用最佳模式,rabbitmq,microservices,spring-amqp,Rabbitmq,Microservices,Spring Amqp,我有三个微服务-服务A、B和C。 服务A应该异步调用B和C,A应该构建基于B和C响应的响应 我使用rabbitmq实现异步ipc 尝试使用RabbitTemplate的convertSendAndRecieve和direct replyTo选项,这使当前处理线程等待/阻止异步调用完成,从而使其同步 我不想使用convertAndSend并让服务A基于相关id侦听应答队列和进程,因为应答队列中会有数千个响应,而基于相关id映射消息会导致性能低下 为每个会话创建单独的队列也不是一个选项,因为它有自己

我有三个微服务-服务A、B和C。 服务A应该异步调用B和C,A应该构建基于B和C响应的响应

我使用rabbitmq实现异步ipc

尝试使用RabbitTemplate的convertSendAndRecieve和direct replyTo选项,这使当前处理线程等待/阻止异步调用完成,从而使其同步

我不想使用convertAndSend并让服务A基于相关id侦听应答队列和进程,因为应答队列中会有数千个响应,而基于相关id映射消息会导致性能低下

为每个会话创建单独的队列也不是一个选项,因为它有自己的警告(在创建新队列时获得所有集群的确认也会影响性能)


对不起,如果这个问题以前已经解决了,我在网上找不到太多的帮助。任何帮助都将不胜感激

AsyncRabbitTemplate
出于您的目的,在收到以下回复之前,不要阻止调用者:

版本1.6引入了
异步rabbitmplate
。这与
amqpmetplate
上的
sendAndReceive
(和
convertSendAndReceive
)方法类似,但它们不是阻塞,而是返回一个
ListenableFuture

RabbitConverterFuture=this.template.convertSendAndReceive(“foo”);
future.addCallback(新ListenableFutureCallback(){
@凌驾
成功时的公共void(字符串结果){
...
}
@凌驾
失效时的公共无效(可丢弃的ex){
...
}
});

非常感谢,这正是我想要的。
 RabbitConverterFuture<String> future = this.template.convertSendAndReceive("foo");
future.addCallback(new ListenableFutureCallback<String>() {

    @Override
    public void onSuccess(String result) {
        ...
    }

    @Override
    public void onFailure(Throwable ex) {
        ...
    }

});