RocketMQ基本概念与入门

这篇具有很好参考价值的文章主要介绍了RocketMQ基本概念与入门。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

MQ基本结构

RocketMQ基本概念与入门,微服务相关,rocketmq

  • message: 消息数据对象
  • product: 程序代码,生成消息,发送消息到队列
  • consumer: 程序代码,监听(绑定)队列,获取消息,执行消费代码
  • queue: Rocketmq rabbitmq kafka这些消息队列中间件软件.

依赖

<dependency>
    <!--2.2.2底层rocketmq客户端4.9.1-->
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.2</version>
</dependency>

案例:

product

public class MyProducer {
    /**
     * 向rocketmq发送第一条消息
     */
    @Test
    public void sendTest01() throws Exception {
    //1.准备一个生产者对象,开启长链接
        DefaultMQProducer producer=new DefaultMQProducer();
        //对当前producer设置分组
        producer.setProducerGroup("first-producer-group");
        //连接nameserver localhost:9876
        producer.setNamesrvAddr("localhost:9876");
        //开启长链接
        producer.start();
    //2.封装一个消息对象,我们想要发送的内容,只是消息的一部分
        //创建一个消息对象
        Message message=new Message();
        //消息携带的内容 body
        String msg="当前发送的第一条消息";
        message.setBody(msg.getBytes(StandardCharsets.UTF_8));
        //设置消息主题,分类,按业务分类
        message.setTopic("first-topic-a");
        //主题标签 和key标识 
    //3.调用api方法将消息发送,接收返回结果,查看发送的信息比如状态
        //分为异步发送,同步发送,异步发送性能速度更高,但是无法保证成功.
        //同步发送,性能速度没有异步快,但是可以接收反馈结果
        SendResult send = producer.send(message);
        //result解析获取发送相关的信息
        System.out.println("发送状态:"+send.getSendStatus());
        System.out.println("消息到达主题,队列,broker信息:"+send.getMessageQueue());
    }
}

Consumer

public class MyConsumer1 {
    @Test
    public void consumerTest01() throws Exception {
    //1.构建一个消费者对象,连接nameserver创建长链接
        // push pull的区别 push消费端,消费的消息是队列推送给他的
        // pull 消费端代码执行一次pull 拉取过来一条消息
        // 收邮件 推的, 抢红包 拉取的
        DefaultMQPushConsumer consumer=new DefaultMQPushConsumer();
        //设置nameserver地址
        consumer.setNamesrvAddr("localhost:9876");
        //消费者分组
        consumer.setConsumerGroup("first-consumer-group-a");
        //定义监听的主题,消费端代码会根据定义的主题寻找nameserver路由信息,找到主题的队列进行绑定
        //topic 主题名称,subExpression 定义过滤逻辑 *表示匹配所有
        consumer.subscribe("first-topic-a","*");
    //2.执行api开始监听主题,实现队列的消费
        //提供给consumer一个监听器
        consumer.setMessageListener(new MessageListenerConcurrently() {
            /**
             * 推送过来的消息,都会调用consumerMessage执行消费逻辑
             * @param list 消息数据 list表示可以批量处理的消息,不是批量消息,list元素只有1个
             * @param consumeConcurrentlyContext
             * @return
             */
            @Override
            public ConsumeConcurrentlyStatus consumeMessage(
                    List<MessageExt> list,
                    ConsumeConcurrentlyContext consumeConcurrentlyContext) {
                //获取消息 由于不是批量发送只有list一个元素
                MessageExt messageExt = list.get(0);
                messageExt.getMsgId();//唯一的一个标识,每次消息组装的对象都会在发送时,生成一个msgId
                byte[] body = messageExt.getBody();
                //将消息转化
                String message=new String(body, StandardCharsets.UTF_8);
                System.out.println("消费端获取到消息:"+message);
                //context 控制返回确认信息 ackIndex顺序
                //返回消费状态 success 队列会将消息对应当前消费组,移动偏移量,记录消费完成
                return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
            }
        });
        //开启长连接
        consumer.start();
        while (true);
    }
}

核心概念

1.nameserver

NameServer是一个简单的 Topic 路由注册中心,支持 Topic、Broker 的动态注册与发现。
主要包括两个功能:

  • Broker管理,NameServer接受Broker集群的注册信息并且保存下来作为路由信息的基本数据。然后提供心跳检测机制,检查Broker是否还存活;
  • 路由信息管理,每个NameServer将保存关于 Broker 集群的整个路由信息和用于客户端查询的队列信息。Producer和Consumer通过NameServer就可以知道整个Broker集群的路由信息,从而进行消息的投递和消费。

NameServer通常会有多个实例部署,各实例间相互不进行信息通讯。Broker是向每一台NameServer注册自己的路由信息,所以每一个NameServer实例上面都保存一份完整的路由信息。当某个NameServer因某种原因下线了,客户端仍然可以向其它NameServer获取路由信息。

  • 总之: nameserver作为协调器, 谁的信息被用到,就要到nameserver注册,谁要用注册信息,就要到nameserver同步抓取.
    broker要作为rocketmq容器被生产者和消费者代码使用.

2.broker

Broker主要负责消息的存储、投递和查询以及服务高可用保证。

  • NameServer几乎无状态节点,因此可集群部署,节点之间无任何信息同步。Broker部署相对复杂。
  • 在 Master-Slave 架构中,Broker 分为 Master 与 Slave。一个Master可以对应多个Slave,但是一个Slave只能对应一个Master。Master 与 Slave 的对应关系通过指定相同的BrokerName,不同的BrokerId 来定义,BrokerId为0表示Master,非0表示Slave。Master也可以部署多个。

3.主题队列

  • 简单理解,主题是一类消息的集合,每次我们发送消息必须指定消息绑定某一个主题.

  • 生产者发送的某一条消息,只能指向一个主题,多条消息可以指向同一个主题,同一个主题中有多个消息队列保存消息,消费端可以根据订阅的主题消费不同主题的消息.这样可以实现业务隔离.

  • 比如电商主题可以是order,主题也可以是cart,还可以是product相关的…

  • 一类消息,从数据的格式,携带body格式,都是完全一致的. 不会出现"第一条消息的"body是普通字符串,第二条消息是个对象Json,不可能第一条消息延迟消息(支付订单倒计时取消),第二条消息普通同步消息.
    RocketMQ基本概念与入门,微服务相关,rocketmq

4.queue队列

存储消息的物理实体(最小单位)。一个Topic中可以包含多个Queue(分布式体现的关键),每个Queue中存放的就是该Topic的消息。一个Topic的Queue也被称为一个Topic中消息的分区**(Partition**)。

注意:一个Topic的Queue中的消息只能被一个消费者组中的一个消费者消费(消费点位逻辑)。一个Queue中的消息不允许同一个消费者组中的多个消费者同时消费。
RocketMQ基本概念与入门,微服务相关,rocketmq

5. 生产者

问题:通过上述概念的了解,生产者,nameserver,broker之间是如何交互的.

  • 启动 nameserver 保存broker路由信息
  • 主题一旦创建,保存broker里,同时生成队列,这些数据,作为路由信息保存nameserver
  • 生产者从nameserver拿到当前集群所注册信息(路由)
  • 发送消息的时候,连接具体的那个broker找具体的topic的具体queue实现消息发送,使用的具体信息,在返回的SendResult中体现

6.消费者分组和生产者分组

消息生产者,负责生产消息。本质上是程序中的一段代码.Producer投递消息到broker代理中.找到主题,负载均衡存放到队列中.
RocketMQ中的消息生产者都是以生产者组(Producer Group)的形式出现的。生产者组是同一类生产者的集合,产生同一类型的消息,这类Producer发送相同Topic类型的消息。一个生产者组可以同时向多个主题发送消息。
RocketMQ基本概念与入门,微服务相关,rocketmq
RocketMQ中的消息消费者都是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息,对应同一类消息数据。消费者组使得在消息消费方面,实现负载均衡(将一个Topic中的不同的Queue平均分配给同一个Consumer Group的不同的Consumer,注意,并不是将消息负载均衡)和容错(一个Consmer挂了,该Consumer Group中的其它Consumer可以接着执行消费逻辑.

由于主题中有多个队列,一组消费者,最多有和队列一样数量的消费成员,再多,无法绑定队列消费消息了.

7.消费点位

在队列中记录了所有和偏移量有关的数据比如:

  • 最小偏移量:都是0
  • 最大偏移量:当前消息的个数

在消费者中也在记录偏移量文章来源地址https://www.toymoban.com/news/detail-616238.html

  • 当前组对应主题队列的消费最小偏移量,和队列的最大偏移量(通过这两个值,能够知道当前消费者消费到哪个消息,还有多少没消费)
  • RocketMQ基本概念与入门,微服务相关,rocketmq

到了这里,关于RocketMQ基本概念与入门的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 三分钟白话RocketMQ系列—— 核心概念

    目录 摘要 Q1:RocketMQ是什么? Q2: 作为消息中间件,RocketMQ和kafka有什么区别? Q3: RocketMQ的基本架构是怎样的? Q4:RocketMQ有哪些核心概念? 总结 RocketMQ是一个开源的分布式消息中间件。它是一种低延迟、高可用、高可靠、高并发的消息队列系统,用于在分布式系统中进

    2024年02月14日
    浏览(28)
  • 分布式消息队列RocketMQ概念详解

    目录 1.MQ概述 1.1 RocketMQ简介 1.2 MQ用途 1.3 常见MQ产品 2.RocketMQ 基本概念 2.1 消息 2.2 主题 2.3 标签 2.4 队列  2.5 Producer 2.6 Consumer 2.7 NameServer 2.8 Broker 2.9 RocketMQ 工作流程   RocketMQ 是阿里开源的分布式消息中间件,跟其它中间件相比,RocketMQ 的特点是纯JAVA实现,是一套提供了消息

    2024年02月03日
    浏览(48)
  • 动力节点最新RocketMq笔记第一章RocketMQ基本操作

    MQ====Message Queue 官网: http://rocketmq.apache.org/ RocketMQ是阿里巴巴2016年MQ中间件,使用Java语言开发,RocketMQ 是一款开源的 分布式消息系统 ,基于高可用分布式集群技术,提供低延时的、高可靠的消息发布与订阅服务。同时,广泛应用于多个领域,包括异步通信解耦、企业解决方

    2024年02月07日
    浏览(40)
  • Java小案例-RocketMQ的11种消息类型,你知道几种?(RocketMQ基本的原理)

    为了让大家对mq理解的更深首先在这里我通过三个问题来给大家解答一下。 第一个:生产者如何发送消息 第二个:发送的消息存在哪里 第三个:消费者如何消费消息 首先给大家介绍一下Mq中的角色,以及每个都是干什么的。 RocketMQ是一个分布式消息和流平台,提供低延迟、

    2024年02月05日
    浏览(32)
  • rocketmq-console基本使用

    作用:rocketmq-console是rocketmq的一款可视化工具,提供了mq的使用详情等功能。 下载rocketmq组件 rocketmq :下载地址、github地址 下载地址如下图所示: 下载rocketmq-console插件 ​rocketmq-console是一款rocketmq的可视化工具,可在rocketmq-console的可视化界面查看topic信息、消费者组信息、模

    2024年02月11日
    浏览(29)
  • RocketMQ基础API使用以及基本原理探究

    等待消息返回后再继续进行下面的操作 适合可靠性要求较高,数据量小,实时响应 消费者: 生产者: 其中消费者的输出为: 前面都是0说明这种推模式broker是分两次推送的 不等待消息返回直接进入后续的流程 消费者: 生产者: 如果没有countDownLatch.await(),会出现下面的情

    2024年02月09日
    浏览(32)
  • Kafka、RabbitMQ、Pulsar、RocketMQ基本原理和选型

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,削峰填谷等问题。实现高性能、高可用、可伸缩和最终一致性架构。 使用消息队列能够获得如下好处,能够在应用与应用之间降低依赖和实时性要求。 解耦:多个服务监听、处理同一条消息,避免

    2024年04月23日
    浏览(33)
  • Springboot 集成 RocketMq(入门)

    Linux 安装 RocketMq-CSDN博客 Springboot 集成 RocketMQ(进阶-消息)-CSDN博客

    2024年02月05日
    浏览(24)
  • RocketMQ 入门实战(1)--简介

    RocketMQ 是一个纯 Java、分布式、队列模型的开源消息中间件;前身是 MetaQ,是阿里参考 Kafka 研发的一个队列模型的消息中间件,后开源给 Apache 基金会并成为 Apache 的顶级项目,具有高性能、高可靠、高实时、分布式的特点。 Apache RocketMQ 中消息传输和存储的顶层容器,用于标

    2024年02月11日
    浏览(26)
  • RocketMQ 5.0 快速入门

    Apache RocketMQ 自诞生以来,因其架构简单、业务功能丰富、具备极强可扩展性等特点被众多企业开发者以及云厂商广泛采用。历经十余年的大规模场景打磨,RocketMQ 已经成为业内共识的金融级可靠业务消息首选方案,被广泛应用于互联网、大数据、移动互联网、物联网等领域的

    2024年02月16日
    浏览(28)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包