1.RocketMq名词解释

TagA || TagB ||TagC
订阅topic下的TagA和TagB和TagC
1.1.1.2错误的消费方式
同一个消费者多次订阅某个 Topic 下的 Tag,以最后一次订阅的 Tag 为准:
//如下错误代码中,只能接收到下 TagB 的消息,而不能接收 TagA 的消息 。
consumer.subscribe("MQ_TOPIC", "TagA", new MessageListener() {public Action consume(Message message, ConsumeContext context) {System.out.println(message.getMsgID());return Action.CommitMessage;}});consumer.subscribe("MQ_TOPIC", "TagB", new MessageListener() {public Action consume(Message message, ConsumeContext context) {System.out.println(message.getMsgID());return Action.CommitMessage;}});
1.2 集群消费和广播消费
1.集群:
使用相同的的消费者被认为是同一个集群 。同一个集群下订阅者消费逻辑必须相同,包括Tag的使用 。这些消费者逻辑上可以认为是一个消费点
2.集群消费
消息队列认为队列中的消息只被集群中的任意订阅者消费一次支持顺序消费消费进度在服务端维护,可靠性高不能保证重复投递的消息是路由到同一台机器
3.广播消费
广播消费模式下不支持顺序消息 。每条消息都需要被相同逻辑的多台机器处理 。消费进度在客户端维护,出现重复的概率稍大于集群模式 。广播模式下,消息队列保证每条消息至少被每台客户端消费一次,但是并不会对消费失败的消息进行失败重投,因此业务方需要关注消费失败的情况 。广播模式下,客户端第一次启动时默认从最新消息消费 。客户端的消费进度是被持久化在客户端本地的隐藏文件中,因此不建议删除该隐藏文件,否则会丢失部分消息 。广播模式下,每条消息都会被大量的客户端重复处理,因此推荐尽可能使用集群模式 。目前仅 Java 客户端支持广播模式 。广播模式下服务端不维护消费进度,所以消息队列控制台不支持消息堆积查询和堆积报警功能 。
1.3 发送普通消息(三种方式)
消息队列发送普通消息有三种实现方式:可靠同步发送、可靠异步发送、单向()发送 。本文介绍了每种实现的原理、使用场景以及三种实现的异同,同时提供了代码示例以供参考 。
注意:顺序消息只支持可靠同步发送 。
1.3.1可靠同步发送
原理:同步发送是指消息发送方发出数据后,会在收到接收方发回响应之后才发下一个数据包的通讯方式 。
应用场景:此种方式应用场景非常广泛,例如重要通知邮件、报名短信通知、营销短信系统等 。
1.3.2 可靠异步发送
原理:异步发送是指发送方发出数据后,不等接收方发回响应,接着发送下个数据包的通讯方式 。消息队列的异步发送,需要用户实现异步发送回调接口() 。消息发送方在发送了一条消息后,不需要等待服务器响应即可返回,进行第二条消息发送 。发送方通过回调接口接收服务器响应,并对响应结果进行处理 。
应用场景:异步发送一般用于链路耗时较长,对 RT 响应时间较为敏感的业务场景,例如用户视频上传后通知启动转码服务,转码完成后通知推送转码结果等 。
1.3.3 单向()发送
原理:单向()发送特点为发送方只负责发送消息,不等待服务器回应且没有回调函数触发,即只发送请求不等待应答 。此方式发送消息的过程耗时非常短,一般在微秒级别 。
应用场景:适用于某些耗时非常短,但对可靠性要求并不高的场景,例如日志收集 。
1.4 消息类型
1.4.1 定时消息和延时消息
定时消息:
将消息发送到消息队列服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到进行消费,该消息即定时消息 。