前言
在RocketMQ中通常有两种获取消息的方式,一个是拉(pull) 消费者主动去broker拉取,一个是推(push) broker主动推送给消费者
push方式里,consumer把轮询过程封装了,并注册MessageListener监听器,取到消息后,唤醒MessageListener的consumeMessage()来消费,对用户而言,感受消息是被推送过来的。
pull方式里,取消息的过程须要用户本身写,首先经过打算消费的Topic拿到MessageQueue的集合,遍历MessageQueue集合,而后针对每一个MessageQueue批量取消息,一次取完后,记录该队列下一次要取的开始offset,直到取完了,再换另外一个MessageQueue。
从下面这张简单的示意图也能够大体看出其中的差异,push的方式是:消息发送到broker后,若是是push,则broker会主动把消息推送给consumer即topic中,而pull的方式是:消息投递到broker后,消费端须要主动去broker上拉消息,即须要手动写代码实现,
2种方式的优缺点对比:
push:实时性高,但增长服务端负载,消费端能力不一样,若是push的速度过快,消费端会出现不少问题函数
pull:消费者从server端拉消息,主动权在消费端,可控性好,可是时间间隔很差设置,间隔过短,则空请求会多,浪费资源,间隔太长,则消息不能及时处理fetch
RocketMQ生产者顶级接口是MQConsumer,他有2个子类DefaultMQPullConsumer和DefaultMQPushConsumer
public interface MQConsumer extends MQAdmin {
@Deprecated
void sendMessageBack(final MessageExt msg, final int delayLevel) throws ...;
void sendMessageBack(final MessageExt msg, final int delayLevel, final String brokerName)throws ...;
Set<MessageQueue> fetchSubscribeMessageQueues(final String topic) throws MQClientException;
}
DefaultMQPullConsumer将在2022年被删除,建议使用更好的实现
DefaultLitePullConsumer
一、MQPushConsumer
1.1 开启和关闭
void start() throws MQClientException;
void shutdown();
1.2 注册监听器
@Deprecated
void registerMessageListener(MessageListener messageListener);
void registerMessageListener(final MessageListenerConcurrently messageListener);
void registerMessageListener(final MessageListenerOrderly messageListener);
1.3 消息的订阅
void subscribe(final String topic, final String subExpression) throws MQClientException;
@Deprecated
void subscribe(final String topic, final String fullClassName,final String filterClassSource) throws...;
void subscribe(final String topic, final MessageSelector selector) throws MQClientException;
void unsubscribe(final String topic);
1.4 动态更新使用者线程池大小
void updateCorePoolSize(int corePoolSize);
1.6 消费的暂停和恢复
void suspend();//暂停消费的
void resume();//恢复消费
1.7 子类DefaultMQPushConsumer
public DefaultMQPushConsumer() ;
public DefaultMQPushConsumer(final String consumerGroup);
public DefaultMQPushConsumer(final String namespace, final String consumerGroup);
public DefaultMQPushConsumer(RPCHook rpcHook);
public DefaultMQPushConsumer(final String consumerGroup, boolean enableMsgTrace) ;
public DefaultMQPushConsumer(final String namespace, final String consumerGroup, RPCHook rpcHook);
public DefaultMQPushConsumer(final String consumerGroup,
RPCHook rpcHook,
AllocateMessageQueueStrategy allocateMessageQueueStrategy) ;
public DefaultMQPushConsumer(final String namespace,
final String consumerGroup,
RPCHook rpcHook,
AllocateMessageQueueStrategy allocateMessageQueueStrategy) ;
public DefaultMQPushConsumer(final String consumerGroup,
boolean enableMsgTrace,
final String customizedTraceTopic);
public DefaultMQPushConsumer(final String consumerGroup,
RPCHook rpcHook,
AllocateMessageQueueStrategyallocateMessageQueueStrategy,
boolean enableMsgTrace,
final String customizedTraceTopic);
public DefaultMQPushConsumer(final String namespace,
final String consumerGroup,
RPCHook rpcHook,
AllocateMessageQueueStrategy allocateMessageQueueStrategy,
boolean enableMsgTrace,
final String customizedTraceTopic) ;
二、LitePullConsumer
2.1 开启和关闭
void start() throws MQClientException;
void shutdown();
boolean isRunning();//判断改消费者是否在运行
2.2 消息的订阅
void subscribe(final String topic, final String subExpression) throws MQClientException;
void subscribe(final String topic, final MessageSelector selector) throws MQClientException;
void unsubscribe(final String topic);
2.3 消息的获取
List<MessageExt> poll();
List<MessageExt> poll(long timeout);
Collection<MessageQueue> fetchMessageQueues(String topic) throws MQClientException;
2.4 注册监听器
void registerTopicMessageQueueChangeListener(String topic,TopicMessageQueueChangeListener topicMessageQueueChangeListener) throws MQClientException;
2.5 指定pull的消息队列
//手动将消息队列列表分配给此使用者
void assign(Collection<MessageQueue> messageQueues);
2.6 消费的暂停和恢复
//暂停从请求的消息队列中提取
void pause(Collection<MessageQueue> messageQueues);
//恢复使用暂停的指定消息队列。
void resume(Collection<MessageQueue> messageQueues);
2.7 偏移量
boolean isAutoCommit();//是否启用自动提交消耗偏移量.
void setAutoCommit(boolean autoCommit);//设置是否启用自动提交消耗偏移量.
void seek(MessageQueue messageQueue, long offset) throws MQClientException;
Long offsetForTimestamp(MessageQueue messageQueue, Long timestamp) throws MQClientException;
void commitSync();//手动提交消耗偏移量
Long committed(MessageQueue messageQueue) throws MQClientException;//获取给定消息队列的最后提交偏移量.
void seekToBegin(MessageQueue messageQueue)throws MQClientException;
void seekToEnd(MessageQueue messageQueue)throws MQClientException;