Java小案例-RocketMQ的11种消息类型,你知道几种?(RocketMQ基本的原理)
前言
为了让大家对mq理解的更深首先在这里我通过三个问题来给大家解答一下。
第一个:生产者如何发送消息
第二个:发送的消息存在哪里
第三个:消费者如何消费消息
生产者如何发送消息
首先给大家介绍一下Mq中的角色,以及每个都是干什么的。
RocketMQ是一个分布式消息和流平台,提供低延迟、高性能和可靠性。在这个平台中,主要包含了以下四个角色:
- Producer(消息生产者):Producer是消息的发送者。在应用程序中,Producer负责创建并发送消息到RocketMQ的服务器。
- Consumer(消息消费者):Consumer是消息的接收者。Consumer从RocketMQ的服务器获取消息,并进行相应的处理。
- Broker(消息中间件服务节点):Broker是暂存和传输消息的节点,相当于邮局的角色。Broker接收Producer发送过来的消息,然后推送到Consumer。Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。
- NameServer(注册中心):NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。它的主要功能是管理Broker信息与路由表。Producer和Consumer通过NameServer查询Topic对应的Broker信息。
除了以上四个主要角色,RocketMQ中还有两个重要的概念:
- Topic(一类消息的集合):用于区分消息的种类。一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic的消息。在RocketMQ中,每个Topic默认都会有4个队列,并且每个队列都有一个id,默认从0开始,依次递增
- Message Queue(消息队列):相当于是Topic的分区,用于并行发送和接收消息。
当mq的服务端在启动的是时候就会往注册中心注册自己的信息,信息包括自己的ip地址,端口,topic的名称以及每个topic有几个队列,当生产者和消费者在启动的时候就会从注册中心拉去这些信息,这样生产者和消费者就会从注册中心获取到服务端的信息(主要是IP,端口),然后就可以和服务端进行通信。
当生产者在发送消息的时候,就会从消息所在的Topic中根据一定的算法选择一个然后拿到这个队列的id,紧接着发送给Broker;所以消息虽然是在Topic下,但是实际上就是分布在不同的队列上,每个队列都会有这个Topic下的部分消息;
发送的消息存在哪里
Broker在接收到消息的时候,除了消息本身的内容数据还会包含其他信息比如消息的Topic,队列id,ip,端口等等。。。
Broker就会将这些消息按照一定的顺序存到本地的文件中,这个文件叫做CommitLog,保证服务端在重启之后消息也不会丢失;由于消息会有很多为了防止文件过大CommitLog在物理磁盘上被划分为多个磁盘文件,每个文件默认的固定大小是1G。这么多消息在后期查找的时候是挨着找吗?其实mq为了方便快速查找和消费消息在每个topic的队列单独创建一个文件叫做ComsumeQueue(默认存30万条数据,每条数据20字节),在消息被存到CommitLog的时候还会网ComsumeQueue文件中插入一条数据具体什么数据我们会在后面讲到。
消费者如何消费消息
在讲消费者如何消费消息之前我们首先了解一下消费者是如何拉取消息的。
上面说在消息被存到CommitLog的时候还会往ComsumeQueue文件中插入一条数据,这些数据
包含三部分信息,第一部分是消息在Commit的起始位置,第二部分就是消息在CommitLog存储的长度,第三部分是消息标签的hashCode,每条数据也有自己的编号,默认从0开始依次递增,所以在消费者拉取消息的时候就会告诉服务端自己的队列id表示要消费哪个队列,以及哪个位置的消息(offset),服务端在接受到消息的时候就会根据队列id查找到在offset中的数据然后根据这条数据到CommitLog文件查找到真正的消息内容。
所以ConsumeQueue相当于一个索引文件为了方便我们的查找。
在mq中几个消费者在一起就组成了一个消费者组,一个消费者组中可以有多个消费者,不同消费者组之间消费消息的互不干扰的。
DefaultMQPushConsumer?consumer?=?new?DefaultMQPushConsumer("sanyouConsumer");
上面这段代码就是创建一个消费者然后指定这个消费者属于哪个组。
在同一个消费者组中,消息消费分为两种模式,集群模式和广播模式,集群模式就是同一条消息在同一个消费者组地下只会被消费一次,广播模式恰恰相反就是同一条消息能够被一个消费者组底下的所有消费者进行消费,mq默认是集群模式如果要设置为广播模式通过下面这段代码来实现
consumer.setMessageModel(MessageModel.BROADCASTING);
联系方式
关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!