咨询一下大佬们。Apache RocketMQ中Message 中包含的 flag 属性,有什么特殊用处吗? 看了一下代码提交记录,应该是设计之初就加了该字段,但是没找到说明,官方文档也没有说明。
Apache RocketMQ中的消息(Message)对象包含一个flag
属性,它是一个int类型的整数,用于控制消息的一些特殊标志。具体来说,flag
属性的作用如下:
事务消息 如果想要将消息发送为事务消息,可以将flag
设置为MessageConst.PROPERTY_TRANSACTION_PREPARED
。RocketMQ中支持两种事务消息的处理方式:预处理(Prepared)和提交(Commit)。在向发送半消息时,可以将flag
设置为MessageConst.PROPERTY_TRANSACTION_PREPARED
,表示这是一个预处理事务消息。在事务消息处理器将事务状态更改为提交或回滚时,再发送提交或回滚的消息,这些消息的flag中应该是MessageConst.PROPERTY_TRANSACTION_COMMIT
或MessageConst.PROPERTY_TRANSACTION_ROLLBACK
。
批量消息 如果想要将消息发送为批量消息,可以将flag
设置为MessageConst.PROPERTY_BATCH
。同一个批量消息中可以包含多条消息,每条消息的key和tag应该相同。发送批量消息可以提高消息的发送效率,但是会影响消息的可靠性。
压缩消息 如果想要对消息进行压缩,可以将flag
设置为MessageConst.PROPERTY_COMPRESS
。RocketMQ支持自定义的消息压缩算法,将消息压缩后可以节省存储空间和网络带宽。
例如,下面的代码演示了如何使用 flag
属性将消息发送为批量消息:
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.common.message.MessageConst;
// 创建一组相同的消息
Message msg1 = new Message("TopicTest", "TagA", "key1", "Hello RocketMQ 1".getBytes());
Message msg2 = new Message("TopicTest", "TagA", "key1", "Hello RocketMQ 2".getBytes());
Message msg3 = new Message("TopicTest", "TagA", "key1", "Hello RocketMQ 3".getBytes());
// 设置批量发送的标志位
msg1.putUserProperty(MessageConst.PROPERTY_BATCH, "true");
msg2.putUserProperty(MessageConst.PROPERTY_BATCH, "true");
msg3.putUserProperty(MessageConst.PROPERTY_BATCH, "true");
// 将消息发送到Broker
producer.send(Arrays.asList(msg1, msg2, msg3));
flag
属性并不是必须设置的,通常情况下可以使用默认值。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
涵盖 RocketMQ、Kafka、RabbitMQ、MQTT、轻量消息队列(原MNS) 的消息队列产品体系,全系产品 Serverless 化。RocketMQ 一站式学习:https://rocketmq.io/