RocketMQ源码分析之Broker处理拉取消息请求(2)

本文深入探讨RocketMQ Broker如何处理拉取消息请求,涉及订阅tag匹配、CommitLog读取、消息过滤、下次拉取下标计算以及不同状态判断。分析了在消息不足时如何设置下次拉取,并关注性能优化,如避免Heap操作以提升拉取效率。
摘要由CSDN通过智能技术生成

判断是否有额外信息,暂不考虑。

public boolean isExtAddr(long tagsCode) {
    return ConsumeQueueExt.isExtAddr(tagsCode);
}

public static boolean isExtAddr(final long address) {
    return address <= MAX_ADDR;
}

判断订阅的tag哈希值是否包含该消息的tag哈希值。

public boolean isMatchedByConsumeQueue(Long tagsCode, ConsumeQueueExt.CqExtUnit cqExtUnit) {
    if (null == subscriptionData) {
        return true;
    }

    if (subscriptionData.isClassFilterMode()) {
        return true;
    }

    // by tags code.
    if (ExpressionType.isTagType(subscriptionData.getExpressionType())) {

        if (tagsCode == null) {
            return true;
        }

        if (subscriptionData.getSubString().equals(SubscriptionData.SUB_ALL)) {
            return true;
        }

        return subscriptionData.getCodeSet().contains(tagsCode.intValue());
    } else {
        // no expression or no bloom
        if (consumerFilterData == null || consumerFilterData.getExpression() == null
            || consumerFilterData.getCompiledExpression() == null || consumerFilterData.getBloomFilterData() == null) {
            return true;
        }

        // message is before consumer
        if (cqExtUnit == null || !consumerFilterData.isMsgInLive(cqExtUnit.getMsgStoreTime())) {
            log.debug("Pull matched because not in live: {}, {}", consumerFilterData, cqExtUnit);
            return true;
        }

        byte[] filterBitMap = cqExtUnit.getFilterBitMap();
        BloomFilter bloomFilter = this.consumerFilterManager.getBloomFilter();
        if (filterBitMap == null || !this.bloomDataValid
            || filterBitMap.length * Byte.SIZE != consumerFilterData.getBloomFilterData().getBitNum()) {
            return true;
        }

        BitsArray bitsArray = null;
        try {
            bitsArray = BitsArray.create(filterBitMap);
            boolean ret = bloomFilter.isHit(consumerFilterData.getBloomFilterData(), bitsArray);
            log.debug("Pull {} by bit map:{}, {}, {}", ret, consumerFilterData, bitsArray, cqExtUnit);
            return ret;
        } catch (Throwable e) {
            log.error("bloom filter error, sub=" + subscriptionData
                + ", filter=" + consumerFilterData + ", bitMap=" + bitsArray, e);
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
回答: 当出现"subscription group does not exist"的错误消息时,可能有几个原因。首先,检查当前的broker是否可读,是否由消费组的订阅信息,并且是否可以被消费。如果不满足这些条件,可能会导致该错误消息的出现。\[2\]其次,检查订阅组配置是否存在。如果找不到订阅组配置,也会导致该错误消息的出现。\[2\]最后,检查分发代理作业是否能够获取代理ID。如果配置文件不存在或者配置文件ID不匹配,分发代理作业将无法获取代理ID,并返回"subscription does not exist"的错误消息。\[3\]为了解决这个问题,可以尝试一些解决方法,如检查broker的权限设置、确保订阅组配置存在以及检查分发代理作业的配置文件。 #### 引用[.reference_title] - *1* *3* [“The subscription does not exist” when a distributor primary replica fails over to a replica that ...](https://blog.csdn.net/weixin_30709929/article/details/98833086)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* [RocketMQ源码分析Broker处理拉取消息请求(1)](https://blog.csdn.net/ph3636/article/details/90294000)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^control,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值