Java | 一分钟掌握异步编程 | 6 - 消息队列异步

224 阅读3分钟

作者:Mars酱

声明:本文章由Mars酱编写,部分内容来源于网络,如有疑问请联系本人。

转载:欢迎转载,转载前先请联系我!

前言

前面几篇都是讲的JDK提供的原生的异步实现方式,其实在互联网行业中,用得最多的属消息队列了。消息队列开源的也多:Kalfka、RabbitMQ、RocketMQ等等。我只知道RocketMQ 😅。

RocketMQ的系统架构说明

三个角色

简单的讲,消息队列分三个角色:生产者、消费者、消息队列服务。但是呢,实际上消息队列服务又分成两大角色:命名服务、消息代理人,所以总共是四个角色。

四个角色

生产者(Producer):生产者负责产生内容;

消费者(Consumer):消费者负责处理内容:

命名服务(NameServer): 负责协调生产和消费;

消息代理(Broker):负责存储、转发消息;

再深一点

Producer:生产者都是以生产者组(Producer Group)的形式出现。生产者组是同一类生产者的集合,这类Producer发送相同Topic类型的消息。一个生产者组可以同时发送多个主题的消息。

Consumer:消费者也是以消费者组(Consumer Group)的形式出现的。消费者组是同一类消费者的集合,这类Consumer消费的是同一个Topic类型的消息。消费者组使得在消息消费方面,实现 负载均衡(将一个Topic中的不同的Queue平均分配给同一个Consumer Group的不同的Consumer)和 容错(一个Consmer挂了,该Consumer Group中的其它Consumer可以接着消费原Consumer消费的Queue)的目标变得非常容易。

NameServer:NameServer是一个Broker与Topic路由的注册中心,支持Broker的动态注册与发现。 其中包含了两个部分的内容:

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

Broker:Broker是个消息中转角色,负责存储消息、转发消息。Broker在RocketMQ系统中负责接收并存储从生产者发送来的消息,同时为消费者的拉取请求作准备。Broker同时也存储着消息相关的元数据,包括消费者组消费进度偏移offset、主题、队列等。 一个Broker包含四个部分:

  • Client Manager:客户端管理器。负责接收、解析客户端(Producer/Consumer)请求,管理客户端。例如,维护Consumer的Topic订阅信息
  • Store Service:存储服务。提供方便简单的API接口,处理消息存储到物理硬盘和消息查询功能。
  • HA Service:高可用服务,提供Master Broker 和 Slave Broker之间的数据同步功能。
  • Index Service:索引服务。根据特定的Message key,对投递到Broker的消息进行索引服务,同时也提供根据Message Key对消息进行快速查询的功能。

其他概念

Topic

Topic是 RocketMQ 中消息传输和存储的顶层容器,用于标识同一类业务逻辑的消息。

Group

具有相同角色的组合 称之为 Group,分为生产者组 和 消费者组。组名相同的角色,会处理同一类消息。

最后

网上关于RocketMQ使用的资料很多,这里没写代码了,所以这一分钟是不是觉得舒爽?