背景:
因为项目是分布式项目,已经集成过rocketmq.但是没有单独将消息服务提取出来.而是每个model之间相互进行消息发布与消费.
这样解耦性比较差.且仍需要model与model之间进行服务的调用..还是多多少少会影响服务器的性能.
所以考虑将消息服务提取出来.单独建一个model.进行专门的管理rocketmq的消费.这样虽然也需要其他model进行调用rocketmq.但是与原有model项目进行了隔离...只需要利用rocketmq的异步消息在消息服务中进行各个model的调用....做到对rocketmq的消费者影响最小.解耦提高.
这里解释下为什么要使用rocketmq而不使用springboot的@async异步多线程处理.这里讲一下spring异步方法的理解.
Spring中用@Async注解标记的方法,称为异步方法,它会在调用方的当前线程之外的独立的线程中执行,其实就相当于我们自己new Thread(()-> System.out.println("hello world !"))这样在另一个线程中去执行相应的业务逻辑
优点:适合单机服务.使用简单只需要加一个注解@async.即可实现异步操作. (这里使用@async注解的方法不能跟调用者的方法在一个类里面.不然会造成不生效.可以理解为一个类就是一个线程池,调用者的方法就是一个线程,这里需要单独开一个线程去调用.)
缺点:适合单机服务.不适合分布式项目,本着解耦的目的.此种方式可以酌情使用.但是对于那种数据交互比较多的方法.不建议使用,因为会造成线程开销问题.线程开销请参考:springboot-@Async默认线程池导致OOM问题 所以,如果使用过多的线程异步,会成造成oom的风险. 但是也不是不可以使用了.请参考