Water2Wine

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理
1. DMQ简介

Distributed Message Queue(分布式消息队列),DMQ 是在kafka之上做了一层封装,为AC的其他组件提供分布式消息队列服务。简单来说,DMQ就是一个消息中间件,传递消息。

2. DMQ组件

DMQ主要由消息提供商Producer,消息消费者Consumer,注册中心Zookeeper以及Kafka集群组成。

消息提供商提供信息到kafka集群,消息消费者从kafka集群获取信息,kafka集群为了提高消息的安全性,会创建多个备份,而为了保持备份与原信息的一致性,我们需要增加一个注册中心zookeeper,它用来维护备份信息的同步。

3. KAFAKA介绍

Producer:生产者,即消息发送者,push消息到Kafka集群中的broker(就是server)中

Consumer:消费者,从Kafka集群的broker中pull消息、消费消息

Consumer group:每个 consumer 都属于一个consumer group,每条消息只能被 consumer group 中的一个 Consumer 消费,但可以被多个 consumer group消费

Broker:Kafka集群由多个Kafka实例(Server)组成,每个实例构成一个broker,说白了就是服务器

topic:producer向kafka集群push的消息会被归于某一类别,即Topic,这本质上只是一个逻辑概念,面向的对象是producer和consumer,producer只需要关心将消息push到哪一个Topic中,而consumer只需要关心自己订阅了哪个Topic

partition:每一个Topic又被分为多个Partitions,即物理分区;出于负载均衡的考虑,同一个Topic的Partitions分别存储于Kafka集群的多个broker上;而为了提高可靠性,这些Partitions可以由Kafka机制中的replicas来设置备份的数量

replicas:partition 的副本,保障 partition 的高可用

Zookeeper:kafka通过zookeeper来存储集群的meta信息及统一topic不同partition的原子性和一致性

leader:replicas 中的一个角色, producer和consumer只跟leader交互

follower:replica 中的一个角色,从leader中复制数据

controller:kafka 集群中的其中一个服务器,用来进行leader election以及各种failover

4. Zookeeper介绍

在zookeeper中分为
Zookeeper是一个分布式的,开放源码的分布式应用程序协调服务,它包含一个简单的原语集,分布式应用程序可以基于它实现同步服务,配置维护和命名服务等。

Zookeeper的核心是原子广播,这个机制保证了各个Server之间的同步。

实现这个机制的协议叫做Zab协议。Zab协议有两种模式,它们分别是恢复模式(选主)和广播模式(同步)。

当服务启动或者在领导者崩溃后,Zab就进入了恢复模式,当领导者被选举出来,且大多数Server完成了和leader的状态同步以后,恢复模式就结束了。状态同步保证了leader和Server具有相同的系统状态。

5. Kafka架构与Zookeeper的交互

首先要明白为什么在producer-kafka-consumer的机制中要引入zookeeper。

上面说过,为了保障数据的可靠性,一个topic会在多个kafka服务器上备份partition,但是这就引入了数据的一致性问题,因此要引入zookeeper。

基于zookeeper,kafka为每一个partition找一个节点作为leader,其余备份作为follower,在整个工作过程中,producer充当了client。

6. DMQ全程解析
1. Producer发布消息

采用push模式将消息发布到broker,每条消息都被append到partition中,属于顺序写磁盘

2. Broker存储消息

物理上把 topic 分成一个或多个 patition,每个 patition 物理上对应一个文件夹(该文件夹存储该 patition 的所有消息和索引文件)

3. Consumer消费消息

high-level consumer API 提供了consumer group的语义,一个消息只能被group内的一个consumer所消费

如果消费线程大于patition数量,则有些线程将收不到消息

如果patition数量大于线程数,则有些线程多收到多个patition的消息

如果一个线程消费多个patition,则无法保证你收到的消息的顺序,而一个patition内的消息是有序的

posted on 2020-08-01 16:33  Water2Wine  阅读(7985)  评论(0编辑  收藏  举报