DMQ简介
DMQ简y介DMQ简介 - Water2Wine - 博客园原文1. DMQ简介Distributed Message Queue(分布式消息队列),DMQ 是在kafka之上做了一层封装,为AC的其他组件提供分布式消息队列服务。简单来说,DMQ就是一个消息中间件,传递消息。2. DMQ组件DMQ主要由消息提供商Producer,消息消费者Consumer,注册中心Zookeeper以及Kafka
原文
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内的消息是有序的
更多推荐
所有评论(0)