rocketmq基础
# mq作用
1、削峰填谷
2、异步解耦
3、数据收集 分布式系统会产生海量级数据流,如:业务日志、监控数据、用户行为等。针对这些数据流进行实时或批量采集汇总,然后对这些数据流进行大数据分析,这是当前互联网平台的必备技术。通过MQ完成此类数据收集是最好的选择。
# rocketmq概念
购买地址: 消息队列RocketMQ版_分布式消息中间件_削峰填谷_容器与中间件-阿里云 (aliyun.com) (opens new window)
# 基本概念
消息message、主题topic、tag、队列queue、消息标识
Topic表示一类消息的集合,每个主题包含若干条消息,每条消息只能属于一个主题,是RocketMQ进行消息订阅的基本单位。 topic:message 主题与消息的关系为1:n message:topic 消息与主题的关系为1:1;
一个生产者可以同时发送多种Topic的消息;而一个消费者只对某种特定的Topic感兴趣,即只可以订阅和消费一种Topic的消息。 producer:topic 生产者与主题的关系为1:n consumer:topic 消费者与主题的关系为1:1
一个主题topic有多个tag,为一对多关系。 Topic是消息的一级分类,Tag是消息的二级分类
Tags是Topic下的次级消息类型/二级类型(注:Tags也支持
TagA || TagB
这样的表达式),可以在同一个Topic下基于Tags进行消息过滤。Tags的过滤需要经过两次比对,首先会在Broker端通过Tag hashcode进行一次比对过滤,匹配成功传到consumer端后再对具体Tags进行比对,以防止Tag hashcode重复的情况。比如交易消息又可以分为:交易创建消息,交易完成消息..... 一条消息可以没有Tag
。RocketMQ提供2级消息分类,方便大家灵活控制。标签,换句话说,为用户提供了额外的灵活性。有了标签,来自同一个业务模块的不同目的的消息可能具有相同的主题和不同的标签。标签将有助于保持您的代码干净和连贯,并且标签还可以为RocketMQ提供的查询系统提供帮助。队列queue为存储消息的物理实体。一个Topic中可以包含多个Queue,每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区(Partition)。 一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费。一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费,允许多个消费者组消费。
RocketMQ中每个消息拥有唯一的MessageId,且可以携带具有业务标识的Key,以方便对消息的查询。不过需要注意的是,MessageId有两个:在生产者send()消息时会自动生成一个MessageId(msgId),当消息到达Broker后,Broker也会自动生成一个MessageId(offsetMsgId)。msgId、offsetMsgId与key都称为消息标识。
- msgId:由producer端生成,其生成规则为:producerIp + 进程pid + MessageClientIDSetter类的ClassLoader的hashCode +当前时间 + AutomicInteger自增计数器
- offsetMsgId:由broker端生成,其生成规则为:brokerIp + 物理分区的offset(Queue中的偏移量)
- key:由用户指定的业务相关的唯一标识
伍总,经过认真权衡,我决定还是离开广美。这一两个月的事情也提醒了我,总有一天我终究会离开广美,那么到那个时候,我还能干什么?因为自己擅长和喜欢的事情,只和软件开发相关,也就只能在这条道上走到黑了。再过几年,我积累的知识就会脱节,如果那时候被广美辞退,我再去其它公司的话,就会很吃力。长痛不如短痛,现在也只能居安思危,趁还年轻逼自己一把,苦点累点,在专业的软件部门历练历练,利用后面几年让自己有所建树。 希望伍总能够理解我做的这个决定。 同时我也知道公司一直待我不薄,我也一直心存感激,我知道我离开的话,也会对公司有些影响,所以对我开发的系统,我会持续免费维护和指导员工使用。 做出辞职这个决定很难,留下有千般好,而离开则意味着前途未知,充满艰险,希望伍总能够支持我这个决定。
# 系统架构
生产者producer、消费者comsumer、name server、broker、工作流程
- RocketMQ中的消息消费者都是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使得在消息消费方面,实现负载均衡(将一个Topic中的不同的Queue平均分配给同一个Consumer Group的不同的Consumer,注意,并不是将消息负载均衡)和容错(一个Consmer挂了,该Consumer Group中的其它Consumer可以接着消费原Consumer消费的Queue)的目标变得非常容易。
- 1)消费者组只能消费一个Topic的消息,不能同时消费多个Topic消息 2)一个消费者组中的消费者必须订阅完全相同的Topic
- 一个队列可以被多个消费者组消费,但是只能被消费者组里面的其中一个消费者消费
# name server主要功能
# 1、Broker管理:
接受Broker集群的注册信息并且保存下来作为路由信息的基本数据;提供心跳检测机制,检查Broker是否还存活。
# 2、路由信息管理:
每个NameServer中都保存着Broker集群的整个路由信息和用于客户端查询的队列信息。Producer和Conumser通过NameServer可以获取整个Broker集群的路由信息,从而进行消息的投递和消费。
参考文章:
RocketMQ之一:RocketMQ整体介绍 - Oops!# - 博客园 (cnblogs.com) (opens new window)
参考视频:
【尚硅谷】2021最新版RocketMQ教程丨轻松入门分布式消息系统_哔哩哔哩_bilibili (opens new window)