2019年5月最新更新:注意!并不推荐RPC式的mq调用,这么做完全没有发挥mq异步削峰的作用。之所以会有这篇文章完全是因为架构无法更改。
RPC式的mq调用,会使调用端的线程一直阻塞,中间还过了一层mq。虽然仍旧是rpc式的通信,但是效果还不如dubbo,建议需要同步的业务直接使用dubbo。
2018年8月:
一.背景
公司项目的收单前置服务A与收单服务B之间是通过rabbitmq来通信的,而且A服务在给B服务发送信息后,必须收到返回结果(同步通知),于是使用了此方法:
rabbitTemplate.convertSendAndReceive(reqDto);
但是,由于B服务的后续处理时间过长,导致A服务接收B服务处理结果的时间大幅增加,TPS只有每秒近2个,远远不达标。故对rabbitmq进行优化。
二.分析
首先如何实现springboot整合rabbitmq,可以 查看这篇文章点击打开链接。
众所周知,rabbitmq解决的是异步服务之间的调用,即生产者不会关心消费者做了什么,反之亦然。但是此处的情况有些特殊,生产者必须要等待消费者处理完成并且拿到返回结果,才会结束线程。所以,要实现高并发的rpc,必须要能够开启多个让消费者消费的线程,用以同时消费多条消息,用空间换时间。
三.实现
首先在收单前置服务模块中,配置rabbitmq。
用一个RabbitMqConfig类,配置connectionfactory,cacheconnectoionfactory,rabbittemplate,directexchange,此外,除了配置请求队列和请求队列的binding以外,必须还需要配置返回队列(reply-to)以及返回队列的binding,以及用来监听返回队列的监听器simplemessagelistenercontainer,用以接收消费者返回的消息。而在这个simplemessagelistenercontainer中,可以配置消费者数量,每个消费者一次性拉取的消息数,最重要的,它可以配置一个executorservice线程池,给你配置的消费者使用。如果不配置这个线程池&