Java小案例-RocketMQ的11种消息类型,你知道几种?(RocketMQ基本的原理)

这篇具有很好参考价值的文章主要介绍了Java小案例-RocketMQ的11种消息类型,你知道几种?(RocketMQ基本的原理)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

为了让大家对mq理解的更深首先在这里我通过三个问题来给大家解答一下。

第一个:生产者如何发送消息

第二个:发送的消息存在哪里

第三个:消费者如何消费消息

生产者如何发送消息

首先给大家介绍一下Mq中的角色,以及每个都是干什么的。

RocketMQ是一个分布式消息和流平台,提供低延迟、高性能和可靠性。在这个平台中,主要包含了以下四个角色:

  1. Producer(消息生产者):Producer是消息的发送者。在应用程序中,Producer负责创建并发送消息到RocketMQ的服务器。
  2. Consumer(消息消费者):Consumer是消息的接收者。Consumer从RocketMQ的服务器获取消息,并进行相应的处理。
  3. Broker(消息中间件服务节点):Broker是暂存和传输消息的节点,相当于邮局的角色。Broker接收Producer发送过来的消息,然后推送到Consumer。Broker分为Master与Slave,一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。
  4. NameServer(注册中心):NameServer是一个几乎无状态节点,可集群部署,节点之间无任何信息同步。它的主要功能是管理Broker信息与路由表。Producer和Consumer通过NameServer查询Topic对应的Broker信息。

除了以上四个主要角色,RocketMQ中还有两个重要的概念:

  1. Topic(一类消息的集合):用于区分消息的种类。一个发送者可以发送消息给一个或者多个Topic;一个消息的接收者可以订阅一个或者多个Topic的消息。在RocketMQ中,每个Topic默认都会有4个队列,并且每个队列都有一个id,默认从0开始,依次递增
  2. 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);

联系方式

关于文章中大家有任何疑问可以通过关注公众号《编程乐学》进行留言,同时,公众号还有更多有趣的项目以及关于学习编程的笔记资料大家可以看看,欢迎大家进行留言。文章来源地址https://www.toymoban.com/news/detail-751967.html

到了这里,关于Java小案例-RocketMQ的11种消息类型,你知道几种?(RocketMQ基本的原理)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • RocketMQ:一个纯java的开源消息中间件--开发测试环境搭建

    一、简介     RocketMQ的前身是Metaq,当 Metaq 3.0发布时,产品名称改为  RocketMQ     MetaQ2.x版本由于依赖了alibaba公司内部其他系统,对于公司外部用户使用不够友好,推荐使用3.0版本。      项目地址:  https://github.com/alibaba/RocketMQ

    2024年02月11日
    浏览(54)
  • RabbitMQ的基本使用,进行实例案例的消息队列

    目录 一、介绍 1. 概述 2. 作用 3. 工作原理 二、RabbitMQ安装部署 1. 安装 2. 部署 3. 增加用户 三、实现案例 1. 项目创建 2. 项目配置 3. 生产者代码 4. 消费者代码 四、测试 每篇一获 RabbitMQ  是一种开源的消息代理和队列服务器,用于通过简单和可扩展的方式在分布式系统中传递

    2024年01月20日
    浏览(34)
  • java实现阿里云rocketMQ消息的发送与消费(tcp协议sdk)

    登录阿里云官网,先申请rocketMQ,再申请Topic、Group ID,然后就是参考阿里云的JAVA SDK进行编程实现。 环境要求: 安装JDK 1.8或以上版本 安装Maven 安装Java SDK 参照 阿里云 官方文档,来一步一步操作。 文档提供的SDK有 TCP 和Http协议,这里使用 TCP协议 来实现rocketMQ消息的发送与消

    2024年02月07日
    浏览(43)
  • Redis精品小案例:Redis支持五种基本数据类型及案例解析

    Redis支持五种基本数据类型,分别是:string(字符串)、hash(哈希)、list(列表)、set(集合)及zset(sorted set:有序集合)。以下是这些数据类型及其用法的简要说明: String(字符串) : 是Redis最基本的数据类型,你可以理解为与Memcached一模一样的类型,一个key对应一个va

    2024年04月08日
    浏览(41)
  • Java 中数组的排序(基本类型,对象类型)

    前言: 本文主要针对的是 Java 自带的排序函数/接口 实现 Comparable 接口中的 compareTo 函数或实现 Comparator 接口中的 compare 函数 两者存在使用上的区别,大体而言,Comparable 接口是为类服务,Comparator 接口是为 sort (Arrays.sort / Collections.sort)方法服务 基本类型存在很多种,这里举

    2024年02月07日
    浏览(34)
  • java初中级面试题(SSM+Mysql+微服务(SpringCloud+Dubbo)+消息队列(RocketMQ)+缓存(Redis+MongoDB)+设计模式+搜索引擎(ES)+JVM

    目录 基础篇 一、Get 和 Post 的区别 二、Java 多态的具体体现 三、StringBuffer StringBuilder String 区别 四、==和 equals 区别 五、重写 equals 需要重写 hashCode 吗 六、java 的基本数据类型 七、List, Set, Collection, Collections   八、ArrayList 和 LinedList 区别 九、HashMap 和 Hashtable 区别 十、Forward

    2023年04月20日
    浏览(126)
  • JAVA----基本类型与运算

    目录 一、Java提供了哪些基本数据类型? 二、在Java语言中null值是什么?在内存中null是什么? 三、如何理解赋值语句String x=null? 四、int和Integer有什么区别? 五、什么是不可变类 六、在Java语言中,类型转换有哪几种类型? (1)类型自动转换 (2)强制类型转换 七、 强制

    2024年02月16日
    浏览(31)
  • Java--基本数据类型

    在Java中,一共有8种基本类型,其中有4种整形,2种浮点类型,1种字符类型char(用于表示Unicode编码的代码单元)和一种表示真值bloolean类型。 1、整形 整形用于表示没有小数部分的数值,允许是负数。Java提供了4种整形。 在通常情况下,int 类型最常用。但如果想要表示整个地

    2024年02月11日
    浏览(48)
  • Java基本数据类型

    Java是一种强类型语言,它有八种基本数据类型,分为三类:整型、浮点型和字符型。如何选择适当的数据类型是一个程序员需要考虑的重要问题。在本文中,我们将详细介绍Java的基本数据类型,以及它们在程序中的应用。 整型数据类型表示整数。Java有四种整型数据类型,分

    2023年04月09日
    浏览(43)
  • java基本数据类型取值范围

    在JAVA中一共有八种基本数据类型,他们分别是  byte、short、int、long、float、double、char、boolean  整型  其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样  byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)  short的取值范围为-32768~32767,占用

    2024年02月12日
    浏览(36)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包