RocketMQ消息消费二:长轮询

RocketMQ的消费模式实际上是通过pull实现,为提高效率,未获取到消息时会挂起请求。本文介绍了长轮询和短轮询的分类,详细讲解了拉取请求的挂起与唤醒逻辑,涉及PullRequestHoldService关键类的作用。
摘要由CSDN通过智能技术生成

概述

前面提到了,RocketMQ没有真正实现push模式消费,而是通过pull来实现。为了提高性能,未拉取到消息时,并不会返回消息未找到,而是将拉取请求挂起,直到有消息到来被唤醒或者超时。

轮询分类

分为长轮询和短轮询。短轮询1s,长轮询push模式为15s,pull模式为20s。

轮询触发逻辑

在 PullMessageProcessor.processRequest() 中

                case ResponseCode.PULL_NOT_FOUND:
                    // broker 允许挂起,拉取请求设置了挂起标记
                    if (brokerAllowSuspend && hasSuspendFlag) {
   
                        long pollingTimeMills = suspendTimeoutMillisLong;
                        if (!this.brokerController.getBrokerConfig().isLongPollingEnable()) {
   
                            // 短轮询
                            pollingTimeMills = this.brokerController.getBrokerConfig().getShortPollingTimeMills();
                        }

                        String topic = requestHeader.getTopic();
                        long offset = requestHeader.getQueueOffset();
                        int queueId = requestHeader.getQueueId();
                        PullRequest pullRequest = new PullRequest(request, channel, pollingTimeMills,
                            this.brokerController.getMessageStore().now(), offset, subscriptionData, messageFilter);
                        // 挂起请求
                        this.brokerController.getPullRequestHoldService().suspendPullRequest(topic, queueId, pullRequest);
                        response = null; // 设置response为null,不会返回数据
                        break;
                    }

PullRequestHoldService 关键类

PullRequestHoldService执行具体挂起逻辑,它继承自 ServiceThread。
先来看挂起拉取请求方法:

    public void suspendPullRequest(final String topic, final int queueId, final PullRequest pullRequest) {
   
        String key = this.buildKey(topic, queueId);
        // 以 topic@queueId为key,保存拉取请求
        ManyPullRequest mpr = this.pullRequestTable.get(key);
        if (null == mpr) {
   
            mpr = new ManyPullRequest();
            ManyPullRequest prev = this.pullRequestTable.putIfAbsent(key, mpr);
            if (prev != null) {
   
              
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值