【Broker端进行消息过滤】

在Broker端进行消息过滤,可以减少无效消息发送到Consumer,少占用网络宽带从而提高吞吐量。

【过滤方式1——通过Tag过滤】

[ 关于Tag和Key ]

  对一个应用来说,尽可能只用一个Topic,不同消息子类型用Tag来标识,每条消息只能有一个Tag,服务端基于Tag进行过滤,并不需要读取消息体的内容,效率较高。Producer发送消息设置了Tag以后,Consumer在订阅消息时,才会利用Tag在Broker端做消息过滤。

  消息的Key,发送的消息设置好Key,以后可以根据这个Key来查询消息,这个Key一般用消息在业务层面的唯一标识码识别,这样后续查询消息异常、消息丢失等都很方便。Broker会创建专门的索引文件,来存储Key到消息的映射,由于Hash索引,应尽量使Key唯一,避免潜在的Hash冲突。

  Tag和Key主要差别是试用场景不同,Tag用在Consumer的代码汇总,用来进行服务端消息过滤,Key主要用于通过命令行查询消息。

[ 通过Tag进行消息过滤 ]

  Tag标签是一个普通字符串,在创建Message时添加,一个Message只能有一个Tag,使用Tag方式过滤非常高效,Broker端可以在ConsumerQueue中做这种过滤,只从CommitLog里读取过滤后被命中的消息。

Consumer的存储格式如下:

ConsumerQueue的第三部分存储的是Tag对应的HashCode,是一个定长的字符串通过Tag过滤的过程就是对比定长的Hashcode,经过hashcode对比,符合要求的消息从CommitLog中读取出来,不用担心Hash冲突问题,消息在被消费前,会对比完整的MessageTag字符串,消除Hash冲突造成的误读。

【过滤方式2——用SQL表达式的方式进行过滤】

Tag方式虽然高效,但是支持的逻辑比较简单。

在Producer端构造Message时,还可以通过putUserProperty方法来增加多个自定义的属性,基于这些属性可以做复杂的过滤逻辑。

[ 构建Message的代码 ]

String tag= "AAA";
Message message = new Message("TopicA",tag,"Hello RocketMQ ".getBytes(RemotingHelper.DEFAULT_CHARSET));
message.putUserProperty("a",String.valueOf());
message.putUserProperty("b","hello");

[ 消费端的代码 ]

DefaultMQPushConsumer consumer = new DefaultMQPushConsumer("GROUP_A");
//过滤属性a的值在0-3之间
consumer.subscribe("TopicA", MessageSelector.bySql("a between 0 and 3"));
consumer.registerMessageListener(new MessageListenerConcurrently() {
@Override
public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> msgs, ConsumeConcurrentlyContext context) {
return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
}
});
consumer.start();

类似SQL表达式,支持如下语法:

.数字对比:比如 >、>=、<、<=、BETWEEN、=

.字符串对比:比如=、<>、IN

.IS NULL 或 IS NOT NULL

.逻辑符号 AND、OR、NOT

支持的数据类型:

.数字型,比如123,

.字符型,比如 'abc',注意必须用单引号

.NULL,这个特殊字符

.布尔类型,TRUE或FALSE

SQL表达式的过滤需要Broker先读出消息里的属性内容,然后做SQL计算,增大磁盘压力,没有Tag方式高效。

【过滤方式3——Filter Server 方式过滤】

Filter Server方式是一种比SQL方式更灵活的过滤方式,允许用户自定义Java方法,根据Java方法的逻辑进行过滤。

RocketMQ读书笔记7——吞吐量优先的场景的更多相关文章

  1. RocketMQ读书笔记6——可靠性优先的使用场景

    [顺序消息] 顺序消费是指消息的产生顺序和消费顺序相同. 比如订单的生成.付款.发货,这三个消息必须按顺序处理才可以. [顺序消息的分类] 全局顺序消息和部分顺序消息. 上面订单的例子,其实是部分顺序 ...

  2. RocketMQ读书笔记5——消息队列的核心机制

    [Broker简述] Broker是RocketMQ的核心,大部分“重量级”的工作都是由Broker完成的,包括: 1.接受Producer发过来的消息: 2.处理Consumer的消费信息请求: 3 ...

  3. RocketMQ读书笔记3——消费者

    [不同类型的消费者] DefaultMQPushConsumer 由系统控制读取操作,收到消息后自动调用传入的处理方法来处理. DefaultMQPullConsumer 读取操作中的大部分功能由使用 ...

  4. RocketMQ读书笔记1——简述

    [消息队列的功能介绍] 分布式消息队列可以提供应用解耦.流量削峰.消息分发.保证最终一致性.方便动态扩容等功能. [MQ使用场景1——应用解耦] 复杂的系统如电商系统,会存在多个子系统,如订单系统.库 ...

  5. Spring4读书笔记(2)- 使用场景

    Spring使用场景 完成规模的spring web应用程序 Spring做中间层,与第三方web框架集成 spring远程调用场景 EJB集成-重用现有的POJOs

  6. RocketMQ读书笔记4——NameServer(MQ的协调者)

    [NameServer简述] 对于一个消息队列集群来说,系统由很多机器组成,每个机器的角色.IP地址都不相同,而且这些信息是变动的(如在某些情况下,会有新的Producer或Consumer加入). ...

  7. RocketMQ读书笔记2——生产者

    [生产者的不同写入策略] 生产者向消息队列里写入数据,不同的业务需要生产者采用不同的写入策略: 同步发送.异步发送.延迟发送.发送事务消息等. [DefaultMQProduce示例] public ...

  8. MySQL性能优化总结___本文乃《MySQL性能调优与架构设计》读书笔记!

    一.MySQL的主要适用场景 1.Web网站系统 2.日志记录系统 3.数据仓库系统 4.嵌入式系统 二.MySQL架构图: 三.MySQL存储引擎概述 1)MyISAM存储引擎 MyISAM存储引擎 ...

  9. 《深入java虚拟机》读书笔记之垃圾收集器与内存分配策略

    前言 该读书笔记用于记录在学习<深入理解Java虚拟机--JVM高级特性与最佳实践>一书中的一些重要知识点,对其中的部分内容进行归纳,或者是对其中不明白的地方做一些注释.主要是方便之后进行 ...

随机推荐

  1. 04-树5 Root of AVL Tree (25 分)

    An AVL tree is a self-balancing binary search tree. In an AVL tree, the heights of the two child sub ...

  2. [转] flume使用(六):后台启动及日志查看

    [From] https://blog.csdn.net/maoyuanming0806/article/details/80807087 处理的问题flume 普通方式启动会有自己自动停掉的问题,这 ...

  3. 本地docker镜像上传Docker Hub,并且在腾讯云上pull该镜像,最后运行成功。

    1:在docker hub 上注册一个账号(本人直接能注册,有的说不能),然后创建自己的仓库. 2:登录docker hub ( longdbdocker --hub账号,longdb --仓库名称) ...

  4. Xamarin Mono For Android 4.6.07004看不到新建android

    有很多朋友安装了Xamarin Mono For Android 4.6.07004看不到新建android项目 PS 官方安装包有BUG,在某些情况下可能会出现丢失VS插件的情况 (遇到此BUG请下 ...

  5. (转)生活中的OO智慧——大话面向对象五大原则

    一·单一职责原则(Single-Responsibility Principle) 定义:一个对象应该只包含单一的职责,并且该职责被完整地封装在一个类中. 宿舍里并不能好好学习,自习还是得去图书馆.这 ...

  6. javascript006_Object_模拟java的Map

    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/stri ...

  7. js小技巧--摘录1

    原文地址https://github.com/loverajoel/jstips 1.数组中插入元素 a.尾部追加 var arr = [1,2,3,4,5]; var arr2 = []; arr. ...

  8. Kubernetes是什么

    目录 简介 主要概念: 总体结构 参考 Kubernetes概念 简介 kubernetes是一个Google开源的容器编排系统,用于自动部署,扩展和管理容器化应用程序. 随处运行:支持公有云,私有云 ...

  9. ReferenceError: “alert” is not defined

    用Node.js单独运行js文件时,其中定义的alert不可用 alert is not part of JavaScript, it's part of the window object prov ...

  10. WeifenLuo.WinFormsUI.Docking.dll的用法

    基本框架 说明 weiFenLuo.winFormsUI.Docking.dll是开源项目DockPanel Suite的一个类库,可以实现像Visual Studio的窗口停靠.拖拽等功能.Weif ...