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

时间:2017-11-01 16:03:52

标签: rabbitmq microservices spring-amqp

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

我正在使用Rabbit MQ进行异步ipc。

尝试使用了带有direct-replyTo选项的RabbitTemplate的convertSendAndRecieve,这使得异步调用中的当前处理线程等待/阻塞完成,这使得它同步。

我不想使用convertAndSend并让服务A监听回复队列并基于相关ID进行处理,因为在回复队列中会有数千个响应,并且根据相关ID映射消息会导致性能不佳

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

很抱歉,如果此问题已经解决,我无法在互联网上获得这方面的帮助。任何帮助,将不胜感激。

1 个答案:

答案 0 :(得分:1)

为了您的目的,AsyncRabbitTemplate在回复之前不会阻止来电者:https://docs.spring.io/spring-amqp/docs/2.0.0.RELEASE/reference/html/_reference.html#async-template

  

1.6版引入了AsyncRabbitTemplate。这与sendAndReceive上的convertSendAndReceive(和AmqpTemplate}方法类似,但不是阻止,而是返回ListenableFuture

 RabbitConverterFuture<String> future = this.template.convertSendAndReceive("foo");
future.addCallback(new ListenableFutureCallback<String>() {

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

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

});