RocketMQ 实战篇——RocketMQ 概念解析

作者:禅与计算机程序设计艺术

1.简介

随着互联网的飞速发展和业务的不断发展,越来越多的人开始利用云计算、大数据、人工智能等新兴技术解决实际问题。这些技术正在重塑企业IT架构,包括组织结构、人员角色、开发流程、测试规范等方面。在这种变化之下,分布式消息系统(Distributed Messaging System)已成为构建健壮、高可用、可扩展性强、低延迟的应用系统的必要组件。

Apache RocketMQ 是由国内知名的开源社区贡献的分布式消息中间件产品,其从设计之初就注重性能、高吞吐量和高可用性。RocketMQ 的优点主要体现在其具有以下几个方面:

  1. 快速启动时间

    Apache RocketMQ 使用了“队列模型”作为其核心通信机制。简单来说,就是发送者把消息发送到一个队列中,接收者从队列中读取消息并消费。由于采用队列模型,RocketMQ 的启动速度非常快,几乎可以在秒级完成。

  2. 小文件存储

    RocketMQ 支持通过分片的方式将消息存储到多个服务器上,从而实现了小文件的存储,同时也降低了磁盘 IO 的压力。这种架构可以有效地避免单机磁盘容量限制。

  3. 丰富的消息路由策略

    RocketMQ 提供了丰富的消息路由策略,包括广播、集群、标签(标签是一个主题下的子集)、单播等,能够满足不同场景下的消息分发需求。

  4. 高可用

    Apache RocketMQ 在设计之初就提供了集群部署模式,支持主备同步方式,保证了消息不丢失,并且在集群出现故障时,依然可以提供服务。

  5. 消息回溯

    Apache RocketMQ 可以通过消息回溯功能,帮助用户根据某些业务规则,重新处理已经发生错误的消息。比如某个生产者一直无法正常工作,但是其发送的消息却没有被消费者正常消费,此时就可以借助消息回溯功能,定位到失败的消息并进行重试或补偿处理。

本系列文章,首先会对RocketMQ相关概念及架构做出详细阐述,然后基于官方示例,结合实际案例,让读者能够对RocketMQ有更深刻的理解,提升工作效率和系统稳定性。

2.基本概念术语说明

2.1 消息队列

2.1.1 概念定义

消息队列(Message Queue),即消息的队列,是一种用于存放或传输消息的线性表。它只允许在队尾(rear)添加元素,在队头(front)删除元素。先进先出的原则即消息先进入队列,再按照顺序向外传递。它具有以下特点:

  1. 异步通信:信息发送方只管把消息放入队列,不管对方是否收到或处理了消息,对方也不知道自己收到了消息。信息接受方需要不断询问是否有新的消息。

  2. 削峰填谷:消息队列可以在应用服务器瞬间承载大量访问请求,不会因为突发流量激增导致服务器崩溃,也不会因为堆积的过多任务导致内存或CPU占用过高。因此,它可以在短期内突发流量时应对请求,还能较好地平衡各个节点负载。

  3. 松耦合:消息队列降低了应用程序之间的耦合度。应用程序可以独立地运行,不需要其他应用程序的配合。

  4. 顺序一致性:对于特定类型的消息,消息队列确保了严格的顺序性,可以方便地实现一些特殊类型的应用。例如,实现复杂交易系统中的订单一致性。

总的来说,消息队列是应用程序之间通信的一种方式,用来协调分布式系统的异步通信。

2.1.2 发起者/接受者模式

消息队列又分为发布/订阅和点对点两种模式。

发布/订阅模式:发布者发送的消息可以被多个订阅者消费;订阅者可以订阅一个或多个主题。其特点是发布者和订阅者之间没有直接的关系,允许一对多或多对多的形式存在。

点对点模式:每个消息只有唯一的一个发送者和一个接受者。这种模式最适合需要精准控制发送和接收速率的应用场景,如事件驱动的应用。

2.2 生产者/消费者模式

生产者/消费者模式,又称为一对多或者多对多的通信方式,是指多个生产者(Producer)发送同样的数据流至消息队列,但是只给其中部分消费者(Consumer)消费,以达到节省资源或加快处理速度的目的。其基本思想是通过引入专门的“消费者”线程池,将不同消费者分配不同的任务,提高消费能力和并发度。

生产者发送的消息,在消息队列中以先进先出的方式排列,等待消费者消费。消费者消费消息,是采用轮询的方式,即在每隔一段时间取出一个消息进行消费。如果没有消息可取,则线程休眠,直到消息到来。因此,在大多数情况下,消费者的消费速率要远大于生产者的发送速率。

2.3 消息(Message)

消息是一个承载数据的实体。消息的属性一般包含:

  1. 消息ID:唯一标识一条消息的编号。

  2. 消息体:消息的内容,可以是任何数据类型。

  3. 消息属性:可以附带额外的一些属性信息,以便于后续处理。

  4. 消息标签:可以给消息添加一个标签,以便于对消息进行分类和检索。

2.4 主题(Topic)

主题是消息队列的逻辑概念,用于承载各种消息。消息以主题为单位进行分类,生产者和消费者都可以向指定主题发送和接收消息。当消费者需要处理特定类型消息时,只需订阅该主题即可,从而达到消息过滤的效果。

2.5 集群(Cluster)

集群是消息队列的物理部署形态,由多台服务器组成,以提供消息队列所需的存储、传输和处理功能。集群可以设置主备方式,主节点负责写入和消费消息,备节点负责冗余备份。

2.6 Broker(代理器)

Broker是消息队列服务器软件,作为消息队列的存储代理层。Broker服务器向消费者提供消息存储服务,为生产者提供消息投递服务。一般消息队列服务提供商都会提供一个或多个Broker服务器,用户可以通过API与Broker服务器交互。

2.7 NameServer

NameServer是RocketMQ的命名服务,用于存储Topic和Group信息,以提供路由信息的查询。当生产者或者消费者启动时,需要向Namesrv发起注册请求,Namesrv对相应的Topic和Group进行管理,并返回对应的路由信息。

2.8 Producer(发布者)

Producer是向消息队列发送消息的客户端应用进程。生产者通过指定的路由策略将消息发送给消息队列的Broker服务器。RocketMQ提供了三种消息发送接口,分别是同步、异步、Oneway三种。

  • 同步接口(Sync Producer): 调用send方法,则当前线程同步等待broker响应,直到消息发送成功或者超时,之后才向下执行。

  • 异步接口(Async Producer): 默认创建的是非持久化的producer,调用send方法立即返回,生产者内部采用netty框架异步写日志。

  • Oneway接口(Oneway Producer): 不等待broker的响应,生产者发送消息后立即返回,适用于不关注消息发送结果的应用场景。

2.9 Consumer(订阅者)

Consumer是从消息队列获取消息的客户端应用进程。RocketMQ提供了四种消息接收接口,分别是推送、拉取、长轮询、批量(事务)消费。

  • 拉取接口(Pull Consumer): 缺省采用拉取模式,采用pull模式向broker请求消息,只返回感兴趣的消息。

  • 推送接口(Push Consumer): broker将消息推送到consumer端,consumer端不自己拉取消息。

  • 长轮询接口(Long Polling Consumer): consumer向broker注册一个长连接,broker保持空闲状态,直到消息到达,然后broker主动推送给consumer。

  • 批量接口(Transactional Message): 通过事务消息可以一次完整地消费多条消息。开启事务消息之后,如果在事务半径下,服务器没有遇到异常情况,则消费者可以正确消费所有消息,否则可以根据反馈情况来调整事务半径继续消费。

2.10 Namesrv

Namesrv是RocketMQ的名字服务器,提供服务发现的功能。它保存了RocketMQ所使用的所有topic和group信息,同时监听客户端的访问请求,返回对应的路由信息。RocketMQ需要启动Nameserver才能正常运行。

猜你喜欢

转载自blog.csdn.net/universsky2015/article/details/133565640