RocketMQ

RocketMQ

特点

1、队列种可靠的先进先出严格的顺序传递。(ActiveMQ无法保证)
2、支持发布/订阅(Pub/Sub)和点对点(P2P)消息模型
3、单一队列百万消息的堆积能力 (RocketMQ提供亿级消息的堆积能力,这不是重点,重点是堆积了亿级的消息后,依然保持写入低延迟)


优势

1、支持事务型消息(消息发送和 DB 操作保持两方的最终一致性)
2、支持指定次数和时间间隔的失败消息重发(Kafka 不支持,RabbitMQ 需要手动确认)
3、支持 Consumer 端 Tag 过滤,减少不必要的网络传输(即过滤由MQ完成,而不是由消费者完成。RabbitMQ 和 Kafka 不支持)
5、支持重复消费(RabbitMQ 不支持,Kafka 支持)


NameServer

NameServer 是整个 RocketMQ 的“大脑” ,它是 RocketMQ 的服务注册中心,所以 RocketMQ 需要先启动 NameServer 再启动 Rocket 中的 Broker。

每个 Broker 在启动的时候会到 NameServer 注册,Producer 在发送消息前会根据 Topic 到NameServer 获取到 Broker 的路由信息,进而和Broker取得连接。Consumer 也会定时获取 Topic 的路由信息。所以从功能上看应该是和 ZooKeeper 差不多,据说 RocketMQ 的早期版本确实是使用的ZooKeeper ,后来改为了自己实现NameServer 。


Name Server 和ZooKeeper的区别

Name Server和ZooKeeper的作用大致是相同的,从宏观上来看,Name Server做的东西很少,就是保存一些运行数据,Name Server之间不互连,这就需要broker端连接所有的Name Server,运行数据的改动要发送到每一个Name Server来保证运行数据的一致性(这个一致性确实有点弱),这样就变成了Name Server很轻量级,但是broker端就要做更多的东西了。

而ZooKeeper呢,broker只需要连接其中的一台机器,运行数据分发、一致性都交给了ZooKeeper来完成。

高可用

NameServer 与每台 Broker 服务保持长连接,并间隔 30S 检查 Broker 是否存活,如果检测到Broker 宕机,则从路由注册表中将其移除,这样就可以实现 RocketMQ 的高可用。

Broker

消息服务器(Broker)是消息存储中心,主要作用是接收来自 Producer 的消息并存储,Consumer 从这里取得消息。它还存储与消息相关的元数据,包括用户组、消费进度偏移量、队列信息等。从部署结构图中可以看出 Broker 有 Master 和 Slave 两种类型,Master 既可以写又可以读,Slave不可以写只可以读

Producer

也称为消息发布者,负责生产并发送消息至 Topic。
生产者向brokers发送由业务应用程序系统生成的消息。RocketMQ提供了发送:同步、异步和单向(one-way)的多种范例。

单向

在这里插入图片描述

集群

在这里插入图片描述

消费者(Consumer)

也称为消息订阅者,负责从 Topic 接收并消费消息。
消费者从brokers那里拉取信息并将其输入应用程序。

消费者组

一类消费同一类消息并且消费逻辑一致Consumer,消费者组与生产者组类似,都是将相同角色的分组在一起并命名。
RocketMQ中的消息有个特点,同一条消息,只能被某一消费组其中的一台机器消费,但是可以同时被不同的消费组消费。

运转流程

1、NameServer 先启动
2、Broker 启动时向 NameServer 注册
3、生产者在发送某个主题的消息之前先从 NamerServer 获取 Broker 服务器地址列表(有可能是集群),然后根据负载均衡算法从列表中选择一台Broker 进行消息发送。
4、NameServer 与每台 Broker 服务器保持长连接,并间隔 30S 检测 Broker 是否存活,如果检测到Broker 宕机(使用心跳机制, 如果检测超120S),则从路由注册表中将其移除。
5、消费者在订阅某个主题的消息之前从 NamerServer 获取 Broker 服务器地址列表(有可能是集群),但是消费者选择从 Broker 中 订阅消息,订阅规则由 Broker 配置决定

消息、主题、标签、消息队列

在这里插入图片描述

消息顺序

消息顺序(Message[消息的最大值为4M] Order)有两种:顺序消费(Orderly)和并行消费(Concurrently)。

顺序消费表示消息消费的顺序和生产者为每个消息队列发送信息时候的顺序一致,所以如果正在处理全局顺序是强制性的场景,需要确保使用的主题只有一个消息队列。

并行消费不再保证消息顺序,消费的最大并行数量受每个消费者客户端指定的线程池限制。

设计理念

NameServer设计及其简单

RocketMQ摒弃了业界常用的zookeeper作为注册中心,而是使用自研的NameServer来实现元数据的管理,因为Topic路由信息无须在集群间保持强一致性,追求最终一致性,并且能容忍分钟级的不一致,所以RocketMQ的NameServer集群间互不通信,极大降低了设计的复杂度,降低了对网络的要求,提升性能。

高效的IO存储机制

RocketMQ追求消息发送的高吞吐量,RocketMQ消息存储文件设计成文件组的概念,组内单个文件大小固定,方便引入内存映射机制。
所有主题的消息存储基于顺序写,提升写性能,同时为了兼顾消息消费与消息查找,引入了消息消费队列文件与索引文件。

容忍存在的设计缺陷

如何保证消息一定能被消息消费者消费,并且保证只消费一次。 RocketMQ的设计者给出的解决办法是不解决这个难题,而是退而求其次,只保证消息被消费者消费,但设计上允许消息被重复消费,如果你们要用RocketMQ那么你们自己在消费端用逻辑实现只消费一次的功能。(RocketMQ通过消息消费确认机制(ACK)来确保消息至少被消费一次,但由于ACK消息有可能丢失等其他原因,RocketMQ无法做到消息只被消费一次,有重复消费的可能。

RocketMQ 架构

关系:

Broker Master 和 Broker Slave 是主从结构,会执行数据同步 Data Sync
每个 Broker 与 NameServer 集群中所有节点建立长连接,定时注册 Topic 信息到所有NameServer
Producer 与 NameServer 集群中的其中一个节点(随机)建立长连接,定期从 NameServer 获取Topic 路由信息,并与提供 Topic 服务的 Broker Master 建立长连接,定时向 Broker 发送心跳
Producer 只能将消息发送到 Broker Master,但是 Consumer 同时和Broker Master和 Broker Slave 建立长连接,既可以从 Master 订阅消息,也可以从 Slave 订阅消息。

NameServer 集群

提供轻量级的服务发现及路由:Broker 管理、路由管理

Broker 集群

通过提供轻量级的 Topic 和Queue 机制处理消息存储。同时支持推(Push)和拉(Pull)两种模型,包含容错机制。提供强大的峰值填充和以原始时间顺序累积数千亿条消息的能力。

  1. 远程处理模块,Broker 入口,处理来自客户端的请求。
  2. 客户端管理,管理客户端(包括消息生产者和消费者),维护消费者的主题订阅。
  3. 存储服务,提供在物理硬盘上存储和查询消息的简单 API
  4. HA 服务,提供主从 Broker 间数据同步。
  5. 索引服务,通过指定键为消息建立索引并提供快速消息查询。

Producer 集群

消息生产者支持分布式部署,分布式生产者通过多种负载均衡模式向 Broker 集群发送消息。

Consumer 集群

消息消费者也支持 Push 和 Pull 模型的分布式部署,还支持集群消费和消息广播。提供了实时的消息订阅机制,可以满足大多数消费者的需求。

事务流程

SpringBoot整合RocketMQ快速使用

导包
<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
	 <version>2.0.4</version>
</dependency>

配置文件
rocketmq.name-server=10.0.0.1:9876
rocketmq.producer.access-key=**********
rocketmq.producer.secret-key=***********
RocketMQTemplate的基本方法

ProcessProducer

import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.configurationprocessor.json.JSONException;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class ApiSubscribeListProcessProducer {

    @Resource
    private RocketMQTemplate rocketMQTemplate;
    
    @Autowired
    private ArticleService articleService; //业务代码

    //==============落地测试数据使用,后续不再使用==================
    //每天1点10分30秒触发任务
    //1、请求接口
    //2、将接口数据放入队列
   // @Scheduled(cron = "0 0 */3 * * ?")
    @Scheduled(cron = "59 23 11 * * ?") //多时间段三次采集
    public void getArticle() throws JSONException {
        //offset
        Integer maxOffset = articleService.findMaxOffset();
        String subscribeList = ApiUtils.getSubscribeList(maxOffset+50);
        rocketMQTemplate.convertAndSend("getSubscribeList", subscribeList);
    }
}

ProcessConsumer

import org.apache.rocketmq.spring.annotation.RocketMQMessageListener;
import org.apache.rocketmq.spring.core.RocketMQListener;
import org.apache.rocketmq.spring.core.RocketMQTemplate;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Date;
import java.util.List;

@Component
@RocketMQMessageListener(consumerGroup = "getSubscribeList", topic = "getSubscribeList", accessKey = "${rocketmq.producer.access-key}", secretKey = "${rocketmq.producer.secret-key}")
public class ApiSubscribeProcessConsumer implements RocketMQListener<String> {
    @Resource
    private RocketMQTemplate rocketMQTemplate;

    @Override
    public void onMessage(String message) {
        System.out.println("=======consumer====="+new Date());
        List <String> dataList = Arrays.asList(message.split("\n"));
    }
}

面试题:

什么是RocketMQ? RocketMQ是一款开源的分布式消息中间件,它可以在大规模分布式系统中进行可靠地、高性能的消息传递,并且提供了可靠的消息顺序传递和事务消息功能。

RocketMQ的核心概念有哪些? RocketMQ的核心概念包括消息生产者(Producer)、消息消费者(Consumer)、主题(Topic)、消息队列(Message Queue)、消息模型(Message Model)等。

RocketMQ与其他消息中间件(如Kafka、ActiveMQ)的区别是什么? RocketMQ相较于其他消息中间件具有以下优点: - 提供了丰富的消息传递模式,支持可靠的异步传输、顺序传输和事务消息。 - 具备高性能和可靠性,能够在大规模分布式系统中承载高并发消息传递。 - 在容错和容灾方面具备较强的能力,支持主从复制和容灾机制。 - 对于分布式事务场景,提供了支持事务消息的功能。

RocketMQ的主要用途有哪些? RocketMQ主要用于以下场景: - 异步解耦:将消息的发送和接收解耦,提高系统的可靠性和稳定性。 - 流量削峰:通过RocketMQ的流量控制和积压队列功能,控制系统的并发量,避免系统瞬时流量过大而导致系统负载过高。 - 日志处理:RocketMQ支持消息顺序传输,适用于大规模日志的采集、存储和分析。 - 分布式事务:通过事务消息的功能,实现分布式事务的一致性。

RocketMQ的消息发送过程是怎样的? RocketMQ的消息发送过程包括以下几个步骤: - 消息生产者向指定的主题发送消息。 - RocketMQ将消息持久化到本地磁盘。 - 根据主题和消息队列数将消息分发到相应的消息队列中。 - 消息消费者消费消息。

RocketMQ的消息确认机制是怎样的? RocketMQ的消息确认机制分为同步刷盘(Sync Flush)和异步刷盘(Async Flush)两种方式。 - 同步刷盘会在消息发送到Broker后,等待Broker将消息持久化到磁盘之后再进行下一步的操作。 - 异步刷盘则是发送消息后,不会等待Broker进行持久化操作,而是继续发送下一批消息。这种方式可以提高发送消息的吞吐量,但也增加了消息丢失的风险。

RocketMQ的顺序消息是如何实现的? RocketMQ的顺序消息是通过将同一个业务的消息发送到同一个消息队列来实现的。这样消费者就可以按照消息队列的顺序进行消费,保证了消息的顺序性。

sh)两种方式。 - 同步刷盘会在消息发送到Broker后,等待Broker将消息持久化到磁盘之后再进行下一步的操作。 - 异步刷盘则是发送消息后,不会等待Broker进行持久化操作,而是继续发送下一批消息。这种方式可以提高发送消息的吞吐量,但也增加了消息丢失的风险。

RocketMQ的顺序消息是如何实现的? RocketMQ的顺序消息是通过将同一个业务的消息发送到同一个消息队列来实现的。这样消费者就可以按照消息队列的顺序进行消费,保证了消息的顺序性。

RocketMQ的容错和容灾机制有哪些? RocketMQ的容错和容灾机制主要包括主从复制和消息重试机制。 - 主从复制:通过将主题的消息复制到多个Broker节点上,实现消息的冗余备份和高可用性。 - 消息重试:当消息发送失败或消费失败时,RocketMQ会根据配置进行消息重试,直到消息发送或消费成功

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值