RocketMQ发送普通消息有三种方式:可靠同步发送、可靠异步发送、单向发送【OneWay】。[RocketMQ消息结构-消息生产者启动流程-消息发送流程-批量消息发送]
一、RocketMQ消息发送
支持三种发送方式:同步、异步、单向。
RocketMQ消息发送需要考虑的几个问题:消息队列如何进行负载、消息发送如何实现高可用、批量消息发送如何实现一致性。
二、RocketMQ消息-Message
Message消息类:
package org.apache.rocketmq.common.message;
import java.io.Serializable;
import java.util.Arrays;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
public class Message implements Serializable {
private static final long serialVersionUID = 8445773977080406428L;
private String topic;
private int flag;
private Map<String, String> properties;
private byte[] body;
private String transactionId;
public Message() {
}
public Message(String topic, byte[] body) {
this(topic, "", "", 0, body, true);
}
public Message(String topic, String tags, String keys, int flag, byte[] body, boolean waitStoreMsgOK) {
}
public Message(String topic, String tags, byte[] body) {
this(topic, tags, "", 0, body, true);
}
public Message(String topic, String tags, String keys, byte[] body) {
this(topic, tags, keys, 0, body, true);
}
void clearProperty(final String name) {
if (null != this.properties) {
this.properties.remove(name);
}
}
public void putUserProperty(final String name, final String value) {
}
public boolean isWaitStoreMsgOK() {
}
}
Message消息属性主要包括所属主题topic、消息flag、扩展属性、消息体;
Message扩展属性主要包含以下几个:
tag:消息TAG,用于消息过滤;
keys:Message索引键,多个用空格隔开,RocketMQ可以根据这些key快速检索到消息 ;
waitStoreMsgOK:消息发送时是否等消息存储完成后再返回;
delayTimeLevel:消息延迟级别,用于定时消息或者消息重试;这些扩展属性在Message的properties中。
三、生产者启动流程
消息生产模块的代码在Client中,对于RocketMQ来讲,它是消息的提供者,也就是客户端。
1、DefaultMQProducer【消息发送者】
DefaultMQProducer是默认的消息生产者实现类,实现MQAdmin接口,
该方法用于创建主题。
//key:目前未实际应用,可以与newTopic相同
//newTopic: 主题名称
//queueNum : 队列数量
//topicSysFlag : 主题系统标签
void createTopic(String key, String newTopic, int queueNum, int topicSysFlag)
throws MQClientException;
根据时间戳从队列中查找其偏移量。
long searchOffset(final MessageQueue mq, final long timestamp) throws MQClientException;
DefaultMQProducer核心属性:
package org.apache.rocketmq.client.producer;
public class DefaultMQProducer extends ClientConfig implements MQProducer {
private final InternalLogger log = ClientLogger.getLog();
protected final transient DefaultMQProducerImpl defaultMQProducerImpl;
//生产者所属组,消息服务器在回查事务状态时会随机选择该组中任何一个生产者发起事务回查请求
private String producerGroup;
//默认topic
private String createTopicKey = MixAll.AUTO_CREATE_TOPIC_KEY_TOPIC;
//默认主题在每一个Broker队列数量
private volatile int defaultTopicQueueNums = 4;
//发送消息默认超时时间,默认3秒
private int sendMsgTimeout = 3000;
//消息体超过该值则启用压缩,默认4K
private int compressMsgBodyOverHowmuch = 1024 * 4;
//同步方式发送消息重试次数,默认为2,总共执行三次。
private int retryTimesWhenSendFailed = 2;
//异步方式发送消息重试次数,默认为2.
private int retryTimesW