RocketMQ的入门及简单使用


前言

Apache RocketMQ 是一款由阿里巴巴开发并开源给 Apache 软件基金会的分布式消息中间件。这款消息中间件以其高性能、高吞吐量、低延迟和高可靠性而著称,并且能够支持大规模的数据处理。

主要特点:

  • 发布/订阅模型:RocketMQ 支持传统的点对点消息模型以及发布/订阅模型,使得多个消费者可以接收同一个消息。
  • 事务消息:RocketMQ 支持金融级别的事务消息处理能力,确保消息的强一致性。
  • 高可用性:RocketMQ 设计有容错机制,能够在节点故障时继续提供服务。
  • 弹性伸缩:在大规模消息处理场景下,RocketMQ 能够实现平滑的水平扩展。
  • 消息顺序保障:RocketMQ 在某些场景下可以保证消息的全局顺序或分区内的局部顺序。
  • 消息拉取模式:RocketMQ 提供了多种消息拉取策略,以适应不同的应用场景。

架构组件:

  • Producer:消息生产者,负责向 Broker 发送消息。
  • Broker:消息服务器,负责存储消息并转发给 Consumer。
  • Consumer:消息消费者,负责从 Broker 接收并处理消息。
  • NameServer:名称服务,负责管理集群的配置信息,帮助客户端发现 Broker。

消费模式:

  • 集群消费:消息会被集群中的不同消费者消费,每个消息只被集群中的一个消费者消费。
  • 广播消费:所有消息都会被集群中的每一个消费者消费。

使用场景:

  • 消息通知:用于重要的通知、短信通知等需要确保消息可靠投递的场景。
  • 日志聚合:收集来自不同系统的日志数据,并聚合到统一的日志处理系统中。
  • 服务解耦:在微服务架构中作为服务间通信的桥梁,提高系统的灵活性和可扩展性。
  • 流量削峰:在高并发场景下,利用消息队列缓存请求,平滑负载。

一、RocketMQ 的基本架构

在这里插入图片描述

1、NameServer

NameServer 是一个无状态的服务器,角色类似于 Kafka使用的 Zookeeper,但比 Zookeeper 更轻量。

  • 每个 NameServer 结点之间是相互独立,彼此没有任何信息交互。
  • Nameserver 被设计成几乎是无状态的,通过部署多个结点来标识自己是一个伪集群,Producer 在发送消息前从 NameServer 中获取 Topic 的路由信息也就是发往哪个 Broker,Consumer 也会定时从 NameServer 获取 Topic 的路由信息,Broker 在启动时会向 NameServer 注册,并定时进行心跳连接,且定时同步维护的 Topic 到 NameServer。
  • 和Broker 结点保持长连接。
  • 维护 Topic 的路由信息。

2、Broker

消息存储和中转角色,负责存储和转发消息。

  • Broker 内部维护着一个个 Consumer Queue,用来存储消息的索引,真正存储消息的地方是 CommitLog(日志文件)。
  • 单个 Broker 与所有的 Nameserver 保持着长连接和心跳,并会定时将 Topic 信息同步到NameServer,和 NameServer 的通信底层是通过 Netty 实现的。

3、Producer

消息生产者,业务端负责发送消息,由用户自行实现和分布式部署。

  • Producer由用户进行分布式部署,消息由Producer通过多种负载均衡模式发送到Broker集群,发送低延时,支持快速失败。
  • RocketMQ 提供了三种方式发送消息:同步、异步和单向
    • 同步发送:同步发送指消息发送方发出数据后会在收到接收方发回响应之后才发下一个数据包。一般用于重要通知消息,例如重要通知邮件、营销短信。
    • 异步发送:异步发送指发送方发出数据后,不等接收方发回响应,接着发送下个数据包,一般用于可能链路耗时较长而对响应时间敏感的业务场景,例如用户视频上传后通知启动转码服务。
    • 单向发送:单向发送是指只负责发送消息而不等待服务器回应且没有回调函数触发,适用于某些耗时非常短但对可靠性要求并不高的场景,例如日志收集。

4、Consumer

消息消费者,负责消费消息,一般是后台系统负责异步消费。

  • Consumer也由用户部署,支持PUSH和PULL两种消费模式,支持集群消费和广播消费,提供实时的消息订阅机制。
  • Pull:拉取型消费者(Pull Consumer)主动从消息服务器拉取信息,只要批量拉取到消息,用户应用就会启动消费过程,所以 Pull 称为主动消费型。
  • Push:推送型消费者(Push Consumer)封装了消息的拉取、消费进度和其他的内部维护工作,将消息到达时执行的回调接口留给用户应用程序来实现。所以 Push 称为被动消费类型,但其实从实现上看还是从消息服务器中拉取消息,不同于 Pull 的是 Push 首先要注册消费监听器,当监听器处触发后才开始消费消息。

二、代码测试

1、引入依赖

<dependency>
    <groupId>org.apache.rocketmq</groupId>
    <artifactId>rocketmq-spring-boot-starter</artifactId>
    <version>2.2.1</version>
</dependency>

2、启动 NameServer 和 Broker

nohup sh mqnamesrv &
nohup sh mqbroker -c /home/qyy/rocketmq/rocketmq-5.2.0/conf/broker.conf &

3、相关配置

rocketmq.name-server=http://localhost:9876
rocketmq.producer.group=yoel_qin
rocketmq.producer.send-message-timeout= 30000

4、创建生产者

编写一个POST接口,将请求体里面的json数据发送到消息队列

@RestController
public class ProducerController {
    
    private static final Logger log = LoggerFactory.getLogger(ProducerController.class);

    @Autowired
    private RocketMQTemplate rocketMQTemplate;

    @PostMapping("/sendMessage")
    public String sendMessage(@RequestBody FrontEvent frontEvent) {
        String json = JSON.toJSONString(frontEvent);
        SendResult sendResult = rocketMQTemplate.syncSend("topic1", json);
        log.info("Send message=========={}",json);
        return sendResult.getSendStatus().toString();
    }
}

5、创建消费者

@Component
@RocketMQMessageListener(topic = "topic1", consumerGroup = "consumer_yoel_qin")
public class Consumer implements RocketMQListener<String> {

    private static final Logger log = LoggerFactory.getLogger(Consumer.class);

    @Override
    public void onMessage(String message) {
        try {
            FrontEvent frontEvent = JSON.parseObject(message, FrontEvent.class);
            log.info("Received message=========={}", frontEvent.toString());

            // 保存到数据库
            // frontEventRepository.save(frontEvent);
        } catch (Exception e) {
            // 如果发生异常,则事务回滚,消息不会被确认,会重试
            log.error("Failed to process the message: {}", message, e);
        }
    }
}
  • 41
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
一、rocketmq入门到精通视频教程目录大纲 001-001_RocketMQ_简介 002-002_RocketMQ_核心概念详解 003-003_RocketMQ_集群构建模型详解(一) 004-004_RocketMQ_集群构建模型详解(二) 005-005_RocketMQ_双主模式集群环境搭建 006-006_RocketMQ_控制台使用讲解 007-007_RocketMQ_Broker配置文件详解 008-008_RocketMQ_helloworld示例讲解 009-009_RocketMQ_整体架构概述详解 010-010_RocketMQ_Producer_API详解 011-011_RocketMQ_Producer_顺序消费机制详解 012-012_RocketMQ_Producer_事务消息机制详解 013-013_RocketMQ_Consumer_Push和Pull模式及使用详解 014-014_RocketMQ_Consumer_配置参数详解 015-015_RocketMQ_Consumer_重试策略详解 016-016_RocketMQ_Consumer_幂等去重策略详解 017-017_RocketMQ_消息模式及使用讲解 018-018_RocketMQ_双主双从集群环境搭建与使用详解 019-019_RocketMQ_FilterServer机制及使用详解 020-020_RocketMQ_管理员命令 二、rocketmq实战视频教程目录大纲 01_rocketmq_实战项目介绍 02_rocketMQ实战项目设计(一) 03_rocketMQ实战项目设计(二) 04_rocketMQ实战-环境搭建(一) 05_rocketMQ实战-环境搭建(二) 06_rocketMQ实战-生产者与spring结合 07_rocketMQ实战-消费者与spring结合 08_rocketMQ实战-数据库模型设计 09_rocketMQ实战-数据库DAO代码生成 10_rocketMQ实战-远程RPC接口设计与实现(一) 11_rocketMQ实战-远程RPC接口设计与实现(二) 12_rocketMQ实战-远程RPC接口设计与实现(三) 13_rocketMQ实战-下单流程(一) 14_rocketMQ实战-下单流程(二) 15_rocketMQ实战-下单流程(三) 16_rocketMQ实战-下单流程(四) 17_rocketMQ实战-下单流程(五) 18_rocketMQ实战-下单流程(六) 19_rocketMQ实战-下单流程(七) 20_rocketMQ实战-下单流程(八)-商品库存 21_rocketMQ实战-下单流程(九)-商品库存 22_rocketMQ实战-下单流程(十)-支付模块 23_rocketMQ实战-整体联调
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值