🏆【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!
应一些小伙伴们的私信,希望可以介绍一下RocketMQ的基础,那么我们现在就从0开始,进入RocketMQ的基础学习及概念介绍,为学习和使用RocketMQ打好基础!
RocketMQ的定位
RocketMQ是一款快速地、可靠地、分布式、容易使用的消息中间件,由Alibaba开发,其前身是 Metaq,Metaq 可以看成是linkedin的Kafka(scala)的java版本,并对其增加了事务的支持。
RocketMQ的定义
RocketMQ为Metaq3.0,相比于原始kafka,其擅长点出了原始的log collecting之外,还增加诸如HA、事务等特性,使得从功能上可以替代传统大部分 MQ。
RocketMQ具有特点
- 可靠的FIFO和严格的消息顺序
- Pub/Sub 和 P2P 消息模型
- 单队列容纳百万消息的能力
- 拉(Pull)和推(push)队列
- 各种消息协议,如 JMS,MQTT 等
- 分布式集群,支持容错
- Docker images for isolated testing and cloud Isolated clusters
- 丰富的配置和监控功能的管理
RocketMQ的基本部件
Topic(订阅主题)
Topic 是一个主题。一个系统中,我们可以将消息划成 Topic ,这样,将不同的消息发送到不同的 queue。
Queue(队列)
一个topic下,我们可以设置多个queue,每个queue就是我们平时所说的消息队列;
因为queue是完全从属于某个特定的topic的,所以当我们要发送消息时,总是要指定该消息所属的topic是什么。
通过equeue就能知道该topic下有几个queue了,但是到底发送到哪个queue呢?比如topic下有4个queue,那对于这个topic下的消息,发送时,到底该发送到哪个queue呢?
消息被路由的过程
目前,equeue的做法是在发送一个消息时,需要用户指定这个消息对应的topic以及一个用来路由的一个object类型的参数。
equeue会根据topic得到所有的queue,然后根据该object参数通过hash code然后取模queue的个数最后得到要发送的queue的编号,从而知道该发送到哪个queue。
这个路由消息的过程是在发送消息的这一方做的,也就是下面要说的producer。之所以不在消息服务器上做是因为这样可以让用户自己决定该如何路由消息,具有更大的灵活性。
Producer(生产者)
消息队列的生产者。我们知道,消息队列的本质就是实现了publish-subscribe的模式,即生产者-消费者模式。生产者生产消息,消费者消费消息。所以这里的Producer就是用来生产和发送消息的。
Consumer
消息队列的消费者,一个消息可以有多个消费者。
Consumer Group
消费者分组,这可能对大家来说是一个新概念。之所以要搞出一个消费者分组,是为了实现下面要说的集群消费。一个消费者分组中包含了一些消费者,如果这些消费者是要集群消费,那这些消费者会平均消费该分组中的消息。
Broker
equeue中的broker负责消息的中转,即接收producer发送过来的消息,然后持久化消息到磁盘,然后接收consumer发送过来的拉取消息的请求,然后根据请求拉取相应的消息给consumer。
所以,broker可以理解为消息队列服务器,提供消息的接收、存储、拉取服务。
broker对于equeue来说是核心,它绝对不能挂,一旦挂了,那producer,consumer就无法实现publish-subscribe了。
NameServer(命名服务)
客户端寻找NameServer地址的方式
代码中指定NameServer地址;
java启动参数中指定NameServer地址:-Drocketmq.nameerv.addr
环境变量指定NameServer地址:NAMESRV_ADDR
HTTP静态服务器寻址,客户端启动后,会定时访问一个静态HTTP服务器,该URL返回NameServer地址列表。推荐使用HTTP静态服务器寻址方式,对于客户端部署简单,而且NameServer集群可以热升级。
消息过滤的方式
简单消息过滤。订阅时指定topic下面tags;
高级消息过滤。
Broker所在的机器会启动多个FilterServer过滤进程;
Consumer启动后,会向FilterServer上传一个过滤的Java类;
Consumer从FilterServer拉消息,FilterServer将请求转发给Broker,FilterServer从Broker收到消息后,按照Consumer上传的java过滤程序做过滤,过滤完成后返回给Consumer。
两种方式的总结:
使用CPU资源来换取网卡流量资源;
FilterServer与Broker部署在同一台机器,数据通过本地回环通信,不走网卡;
一台Broker部署多个FilterServer,充分利用CPU资源,因为单个JVM难以全面利用高配的物理机CPU资源;
因为过滤代码使用Java编写,应用几乎可以做任意形式的服务器端消息过滤,例如通过Messgae Header进行过滤,甚至可以按照Message Body进行过滤;
使用Java语言进行作为过滤表达式是一个双刃剑,方便了应用的过滤操作,但是带来了服务器端的安全风险。需要应用来保证过滤代码安全,例如在过滤程序中尽可能不做申请大内存,创建线程等操作,避免Broker服务器发生资源泄露。
发送消息注意事项
应用尽可能用一个Topic,消息子类型用tags来标识,tags可以由应用只有设置。只有发送消息设置了tags,消费方在订阅消息时,才可以利用tags在broker做消息过滤;
每个消息在业务层面的唯一标识码,要设置到keys字段,方便将来定位消息丢失问题。服务器会为每个消息创建索引,应该可以通过topic、key来查询这条消息内容以及消息被谁消费,由于哈希索引,请务必保证key尽可能唯一。
消息发送成功或者失败,要打印消息日志,务必输出sendResult和key字段;
send消息方法,只要不抛异常,就代表发送成功,但是发送成功会有多个状态,在sendResult里定义。
发送信息的结果状态
SEND_OK:消息发送成功;
FLUSH_DISK_TIMEOUT:消息发送成功,但是服务器刷盘超时,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失;
FLUSH_SLAVE_TIMEOUT:消息发送成功,但是服务器同步到slave时超时,消息已经进入服务器队列,只有此次服务器宕机,消息才会丢失;
SLAVE_NOT_AVAILABLE:消息发送成功,但是此时slave不可用,消息已经进入服务器队列,只有此时服务器宕机,消息才会丢失;
消费信息注意事项
集群消费
集群消费是指,一个consumer group下的consumer,平均消费topic下的queue。
假如一个topic下有4个queue,然后当前有一个consumer group,该分组下有4个consumer,那每个consumer就被分配到该topic下的一个queue,这样就达到了平均消费topic下的queue的目的。
如果consumer group下只有两个consumer,那每个consumer就消费2个queue。
如果有3个consumer,则第一个消费2个queue,后面两个每个消费一个queue,从而达到尽量平均消费。
应该尽量让consumer group下的consumer的数目和topic的queue的数目一致或成倍数关系。这样每个consumer消费的queue的数量总是一样的,这样每个consumer服务器的压力才会差不多。当前前提是这个topic下的每个queue里的消息的数量总是差不多多的。这点我们可以对消息根据某个用户自己定义的key来进行hash路由来保证。
广播消费
广播消费是指一个consumer只要订阅了某个topic的消息,那它就会收到该topic下的所有queue里的消息,而不管这个consumer的group是什么。所以对于广播消费来说,consumer group没什么实际意义。consumer可以在实例化时,我们可以指定是集群消费还是广播消费。
对于集群消费和广播消费,消费进度持久化的地方是不同的,集群消费的消费进度是放在broker,也就是消息队列服务器上的,而广播消费的消费进度是存储在consumer本地磁盘上的。
集群消费目的
- 由于一个queue的消费者可能会更换,因为consumer group下的consumer数量可能会增加或减少,然后就会重新计算每个consumer该消费的queue是哪些,所以,当出现一个queue的consumer变动的时候,新的consumer如何知道该从哪里开始消费这个queue呢?
如果这个queue的消费进度是存储在前一个consumer服务器上的,那就很难拿到这个消费进度了,因为有可能那个服务器已经挂了,或者下架了,都有可能。而因为broker对于所有的consumer总是在服务的,所以,在集群消费的情况下,被订阅的topic的queue的消费位置是存储在broker上的,存储的时候按照不同的consumer group做隔离,以确保不同的consumer group下的consumer的消费进度互补影响。
广播消费目的
广播消费,由于不会出现一个queue的consumer会变动的情况,所以我们没必要让broker来保存消费位置,所以是保存在consumer自己的服务器上。
消费进度(offset)
消费进度是指,当一个consumer group里的consumer在消费某个queue里的消息时,equeue是通过记录消费位置(offset)来知道当前消费到哪里了。以便该consumer重启后继续从该位置开始消费。
比如一个topic有4个queue,一个consumer group有4个consumer,则每个consumer分配到一个queue,然后每个consumer分别消费自己的queue里的消息。
equeue会分别记录每个consumer对其queue的消费进度,从而保证每个consumer重启后知道下次从哪里开始继续消费。
实际上,也许下次重启后不是由该consumer消费该queue了,而是由group里的其他consumer消费了,这样也没关系,因为我们已经记录了这个queue的消费位置了。
消费位置和consumer其实无关,消费位置完全是queue的一个属性,用来记录当前被消费到哪里了。另外一点很重要的是,一个topic可以被多个consumer group里的consumer订阅。
不同consumer group里的consumer即便是消费同一个topic下的同一个queue,那消费进度也是分开存储的。也就是说,不同的consumer group内的consumer的消费完全隔离,彼此不受影响。
🏆【Alibaba中间件技术系列】「RocketMQ技术专题」小白专区之领略一下RocketMQ基础之最!的更多相关文章
- 大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app
大前端技术系列:TWA技术+TensorFlow.js => 集成原生和AI功能的app ( 本文内容为melodyWxy原作,git地址:https://github.com/melodyWx ...
- 🏆【Java技术专区】「探针Agent专题」Java Agent探针的技术介绍(1)
前提概要 Java调式.热部署.JVM背后的支持者Java Agent: 各个 Java IDE 的调试功能,例如 eclipse.IntelliJ : 热部署功能,例如 JRebel.XRebel. ...
- ☕【Java技术指南】「并发原理专题」AQS的技术体系之CLH、MCS锁的原理及实现
背景 SMP(Symmetric Multi-Processor) 对称多处理器结构,它是相对非对称多处理技术而言的.应用十分广泛的并行技术. 在这种架构中,一台计算机由多个CPU组成,并共享内存和其 ...
- ☕【Java技术指南】「并发编程专题」CompletionService框架基本使用和原理探究(基础篇)
前提概要 在开发过程中在使用多线程进行并行处理一些事情的时候,大部分场景在处理多线程并行执行任务的时候,可以通过List添加Future来获取执行结果,有时候我们是不需要获取任务的执行结果的,方便后面 ...
- 🏆【Java技术专区】「并发编程专题」教你如何使用异步神器CompletableFuture
前提概要 在java8以前,我们使用java的多线程编程,一般是通过Runnable中的run方法来完成,这种方式,有个很明显的缺点,就是,没有返回值.这时候,大家可能会去尝试使用Callable中的 ...
- 🏆【Java技术专区】「延时队列专题」教你如何使用【精巧好用】的DelayQueue
延时队列前提 定时关闭空闲连接:服务器中,有很多客户端的连接,空闲一段时间之后需要关闭之. 定时清除额外缓存:缓存中的对象,超过了空闲时间,需要从缓存中移出. 实现任务超时处理:在网络协议滑动窗口请求 ...
- 🏆【Java技术专区】「开发实战专题」Lombok插件开发实践必知必会操作!
前言 在目前众多编程语言中,Java 语言的表现还是抢眼,不论是企业级服务端开发,还是 Andorid 客户端开发,都是作为开发语言的首选,甚至在大数据开发领域,Java 语言也能占有一席之地,如Ha ...
- ☕【Java技术指南】「并发编程专题」Fork/Join框架基本使用和原理探究(基础篇)
前提概述 Java 7开始引入了一种新的Fork/Join线程池,它可以执行一种特殊的任务:把一个大任务拆成多个小任务并行执行. 我们举个例子:如果要计算一个超大数组的和,最简单的做法是用一个循环在一 ...
- ☕【Java技术指南】「并发编程专题」针对于Guava RateLimiter限流器的入门到精通(含实战开发技巧)
并发编程的三剑客 在开发高并发系统时有三剑客:缓存.降级和限流. 缓存 缓存的目的是提升系统访问速度和增大系统处理容量. 降级 降级是当服务出现问题或者影响到核心流程时,需要暂时屏蔽掉,待高峰或者问题 ...
随机推荐
- 3.docker容器常用命令
docker容器的常用命令 docker有很多命令,让我们一个一个全部背下来,基本是不可能的,帮助文档的作用就很大了,想要查询那个命令,直接去找帮助文档,帮助文档地址:https://docs.doc ...
- PC Register简介
PC Regiter介绍: JVM中的程序计数寄存器(Program Counter Register)中,Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载 ...
- spring boot处理跨域请求代码
@Configuration @WebFilter(filterName = "CorsFilte") public class CorsFilter implements Fil ...
- Jetpack Compose学习(6)——关于Modifier的妙用
原文: Jetpack Compose学习(6)--关于Modifier的妙用 | Stars-One的杂货小窝 之前学习记录中也是陆陆续续地将常用的Modifier的方法穿插进去了,本期就来详细的讲 ...
- a标签的href属性拼接问题
<a id="nickName" href="/community/user/userinfo?nickName="></a> 如上所示 ...
- TWAIN-v2.4-说明文档翻译(1)介绍
介绍 Introduction 一致性需求(Need for Consistency) 对于扫描仪,数字摄像仪,以及其他图像获取设备,用户渴望发现将图像合并到他们的文档以及其他工作的价值.然而,支持展 ...
- Java基础之(十二):数组
数组 数组概述 定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组 ...
- 专业网络损伤仪HoloWAN meme只需5999元!
在人们对互联网的依赖度越来越高的今天,人类社会逐步买入元宇宙时代,为了大大提高整个互联网的用户体验,HoloWAN团队推出每一个互联网应用开发团队都能用得起的专业网络损伤仪HoloWAN meme!售 ...
- 内网渗透DC-1靶场通关(CTF)
最新博客见我的个人博客地址 DC系列共9个靶场,本次来试玩一下DC-1,共有5个flag,下载地址. 下载下来后是 .ova 格式,建议使用vitualbox进行搭建,vmware可能存在兼容性问题. ...
- clock时钟
①时钟的偏移(skew):时钟分支信号在到达寄存器的时钟端口过程中,都存在有线网等延时,由于延时,到达寄存器时钟端口的时钟信号存在有相位差,也就是不能保证每一个沿都对齐,这种差异称为时钟偏移(cloc ...