rocketmq中消息消费方式有拉Pull和推Push方式,Push其实是对Pull方式的封装,后台线程不停产生消息拉取请求,不停从broker拉取消息到Consumer消费,这里是伪推模式,不是真正的broker推,而是client端对拉Pull模式的封装,不停滴拉就等于推。
顺序消息,rocketmq只能做到MessageQueue维度的绝对顺序,不能做到topic全局绝对顺序。顺序消息一句话,就是做什么事情之前先获取锁MessageQueue锁和ProcessQueue锁,创建消息拉取请求前获取到锁才能创建拉取请求,拉取消息前获取锁,消费消息前获取锁,消息消费请求在ConsumerMessageService线程池中消费的时候先获取锁。这样就保证了消息的顺序。
消息拉取到client端是乱的,不是按消费偏移量顺序排序的,而且在线程池中消费,所以更新消费进度的时候,防止更新消费偏移量错乱,client端使用了TreeMap来存放消息,保证了更新消息消费偏移量的顺序性。