【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. mysql工具——使用mysqlshow查看mysql对象信息,查看mysql表大小

    关键词:查看表大小,mysqlshow mysqlshow --count -uroot -p test

  2. C++ class和struct的区别

    class和struct定义类唯一的区别就是默认的访问权限. 如果我们使用struct关键字,则定义在第一个访问说明符之前的成员是public的:相反,如果我们使用class关键字,组这些成员是pri ...

  3. compact framework windows mobile wm c#代码 创建快捷方式

    已经2018年了,windows mobile已经宣布不维护狠多年了,不要问我为什么还在开发windows mobile的程序,我也不想.公司有一批手持扫描枪设备依然是windows mobile的程 ...

  4. Homebrew下安装的软件自启动服务管理工具:Launchrocket

    帮助管理Homebrew安装的服务的软件,比如使用Homebrew安装的Mysql.Redis.MongoDB,传统方式需要使用命令行的命令,而使用LaunchRocket则可以在图形界面中进行管理. ...

  5. 【Kafka】Kafka集群搭建

    一.准备工作 服务器:最好是多台,大于等于2 已经搭建好的zookeeper集群 下载软件kafka_2.11-0.10.0.1.tgz 二.创建目录 #创建目录 cd /opt/ mkdir kaf ...

  6. 关于chrome下的bug

    最近看了大神的一篇文章,于是尝试了一下里面说的bug以及修复 1.Chrome下absolute绝对定位元素部分display属性值不渲染bug 首先还原一下bug.. ff下的下效果 点击按钮后的效 ...

  7. C# virtual abstract

    virtual和abstract都是用来修饰父类的,通过覆盖父类的定义,让子类重新定义. 它们有一个共同点:如果用来修饰方法,前面必须添加public,要不然就会出现编译错误:虚拟方法或抽象方法是不能 ...

  8. PHP之string之ord()函数使用

    ord (PHP 4, PHP 5, PHP 7) ord - Return ASCII value of character ord - 返回字符的 ASCII 码值 Description int ...

  9. MultipartFile的使用小结

    Multipartfile转File?File转MultipartFile?可千万别转晕了. 题图:from Google 1. MultipartFile类型转File类型 想要将Multipart ...

  10. hibernate 中addScalar的用法与作用

    作用: 1.提高性能 2.指定要返回哪几个字段,为指定的不返回(主要用于select *查询全部) 3.也可指定返回字段的具体类型 常用于自定义本地sql中 如: StringBuffer sql=n ...