【rocketmq系列】【四】【消息发送】

消息队列RocketMQ版提供三种方式来发送普通消息:同步(Sync)发送、异步(Async)发送和单向(Oneway)发送。

了解点

  1. 发送方式的原理
  2. 应用场景
  3. 消息队列如何进行负载
  4. 消息发送如何实现高可用
  5. 批量消息发送如何实现一致性

3种发送方式

同步发送

原理同步发送是指消息发送方发出一条消息后,会在收到服务端返回响应之后才发下一条消息的通讯方式。
应用场景应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等。

原理
同步发送是指消息发送方发出一条消息后,会在收到服务端返回响应之后才发下一条消息的通讯方式。

sync

异步发送

原理
异步发送是指发送方发出一条消息后,不等服务端返回响应,接着发送下一条消息的通讯方式。消息队列RocketMQ版的异步发送,需要您实现异步发送回调接口(SendCallback)。消息发送方在发送了一条消息后,不需要等待服务端响应即可发送第二条消息。发送方通过回调接口接收服务端响应,并处理响应结果。

async

应用场景
异步发送一般用于链路耗时较长,对响应时间较为敏感的业务场景,例如,您视频上传后通知启动转码服务,转码完成后通知推送转码结果等。

单向发送(oneway)

原理
发送方只负责发送消息,不等待服务端返回响应且没有回调函数触发,即只发送请求不等待应答。此方式发送消息的过程耗时非常短,一般在微秒级别。
oneway

应用场景
适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集。

对比

在这里插入图片描述

消息描述

org.apache.rocketmq.common.message.Message

public class Message implements Serializable {
    private static final long serialVersionUID = 8445773977080406428L;
	// 主题
    private String topic;
    // org.apache.rocketmq.common.sysflag.MessageSysFlag
    private int flag;
    // 扩展属性
    private Map<String, String> properties;
    private byte[] body;
    private String transactionId;

	public Message(String topic, String tags, String keys, int flag, byte[] body, 			boolean waitStoreMsgOK) {
        this.topic = topic;
        this.flag = flag;
        this.body = body;

        if (tags != null && tags.length() > 0)
            this.setTags(tags);

        if (keys != null && keys.length() > 0)
            this.setKeys(keys);

        this.setWaitStoreMsgOK(waitStoreMsgOK);
    }

	public void setTags(String tags) {
        this.putProperty(MessageConst.PROPERTY_TAGS, tags);
    }
    public void setKeys(Collection<String> keys) {
        StringBuffer sb = new StringBuffer();
        for (String k : keys) {
            sb.append(k);
            sb.append(MessageConst.KEY_SEPARATOR);
        }

        this.setKeys(sb.toString().trim());
    }
    public void setKeys(String keys) {
        this.putProperty(MessageConst.PROPERTY_KEYS, keys);
    }
    public void setWaitStoreMsgOK(boolean waitStoreMsgOK) {
        this.putProperty(MessageConst.PROPERTY_WAIT_STORE_MSG_OK, Boolean.toString(waitStoreMsgOK));
    }

}

Message的扩展属性

  1. tag:消息Tag,用于消息过滤
  2. keys:Message索引键,多个用空格分开,rocketmq可以根据这些key快速检索到消息
  3. waitStoreMsgOK:消息发送时是否等消息存储完成后再返回
  4. delayTimeLevel:消息延迟级别,用于定时消息或消息重试

生产者启动流程

代码都在client模块,相对于rocketmq来说,他就是客户端。

org.apache.rocketmq.client.MQAdmin
org.apache.rocketmq.client.producer.DefaultMQProducer

在这里插入图片描述

参考

https://help.aliyun.com/document_detail/29547.html

图解RocketMQ消息发送和存储流程

https://kunzhao.org/docs/rocketmq/rocketmq-send-message-flow/#%E4%B8%80%E6%9C%8D%E5%8A%A1%E5%99%A8%E5%90%AF%E5%8A%A8

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值