横岗网站建设公司,手机价格大全,重庆网站建设 渝icp,做网站图片像素戳蓝字“CSDN云计算”关注我们哦#xff01;技术头条#xff1a;干货、简洁、多维全面。更多云计算精华知识尽在眼前#xff0c;get要点、solve难题#xff0c;统统不在话下#xff01;大家都知道 Kafka 是一个非常牛逼的消息队列框架#xff0c;阿里的 RocketMQ 也是在 … 戳蓝字“CSDN云计算”关注我们哦技术头条干货、简洁、多维全面。更多云计算精华知识尽在眼前get要点、solve难题统统不在话下大家都知道 Kafka 是一个非常牛逼的消息队列框架阿里的 RocketMQ 也是在 Kafka 的基础上进行改进的。对于初学者来说一开始面对这么一个庞然大物会不知道怎么入手。那么这篇文章就带你先了解一下 Kafka 的技术架构让你从全局的视野认识 Kafka。了解了 Kafka 的整体架构和消息流程之后脑海里就会有一个大致的结构这时候再去学习每个部分就容易得多了。我们先来看一下 Kafka 的整体架构图Kafka 的架构图可以分为四个部分Producer Cluster生产者集群。一般由许多个实际的业务项目组成其不断地往 Kafka 集群中写入数据。Kafka ClusterKafka 服务器集群。这里就是 Kafka 作为重要的一部分这里负责接收生产者写入的数据并将其持久化到文件里最终将消息提供给 Consumer Cluster。Zookeeper ClusterZookeeper 集群。Zookeeper 负责维护整个 Kafka 集群的 Topic 信息、Kafka Controller 等信息。Consumer Cluster消费者集群。与 Producer Cluster 一样其一般是由许多个实际的业务项目组成不断地从 Kafka Cluster 中读取数据。了解了 Kafka 的整体架构那一个消息是怎么从生产者到 Kafka Server又是如何从 Kafka Server 到消费者的呢一般来说一个消息的流转可以分为下面几个阶段服务器启动阶段生产者发送消息阶段Kafka存储消息阶段消费者拉取消息阶段服务器启动阶段首先我们会启动 Zookeeper 服务器作为集群管理服务器。接着启动 Kafka Server。Kafka Server 会向 Zookeeper 服务器注册信息接着启动线程池监听客户端的连接请求。最后启动生产者和消费者连接到 Zookeeper 服务器从 Zookeeper 服务器获取到对应的 Kafka Server 信息[1]。生产者发送消息阶段当需要将消息存入消息队列中时生产者根据配置的分片算法选择分到哪一个 partition 中。在发送一条消息时可以指定这条消息的 keyProducer 根据这个 key 和 Partition 机制来判断应该将这条消息发送到哪个 Parition。Paritition 机制可以通过指定 Producer 的 paritition.class 这一参数来指定该 class 必须实现 kafka.producer.Partitioner 接口。如果不实现 Partition 接口那么会使用默认的分区算法即根据根据 key 哈希后取余[2]。随后生产者与该 Partition Leader 建立联系之后将消息发送至该 partition leader。之后生产者会根据设置的 request.required.acks 参数不同选择等待或或直接发送下一条消息。request.required.acks 0 表示 Producer 不等待来自 Leader 的 ACK 确认直接发送下一条消息。在这种情况下如果 Leader 分片所在服务器发生宕机那么这些已经发送的数据会丢失。request.required.acks 1 表示 Producer 等待来自 Leader 的 ACK 确认当收到确认后才发送下一条消息。在这种情况下消息一定会被写入到 Leader 服务器但并不保证 Follow 节点已经同步完成。所以如果在消息已经被写入 Leader 分片但是还未同步到 Follower 节点此时Leader 分片所在服务器宕机了那么这条消息也就丢失了无法被消费到。request.required.acks -1 表示 Producer 等待来自 Leader 和所有 Follower 的 ACK 确认之后才发送下一条消息。在这种情况下除非 Leader 节点和所有 Follower 节点都宕机了否则不会发生消息的丢失。Kafka存储消息阶段当 Kafka 接收到消息后其并不直接将消息写入磁盘而是先写入内存中。之后根据生产者设置参数的不同选择是否回复 ack 给生产者。之后有一个线程会定期将内存中的数据刷入磁盘这里有两个参数控制着这个过程# 数据达到多少条就将消息刷到磁盘#log.flush.interval.messages10000# 多久将累积的消息刷到磁盘任何一个达到指定值就触发写入#log.flush.interval.ms1000如果我们设置 log.flush.interval.messages1那么每次来一条消息就会刷一次磁盘。通过这种方式就可以达到消息绝对不丢失的目的这种情况我们称之为同步刷盘。反之我们称之为异步刷盘。于此同时Kafka 服务器也会进行副本的复制该 Partition 的 Follower 会从 Leader 节点拉取数据进行保存。然后将数据存储到 Partition 的 Follower 节点中。消费者拉取消息阶段在消费者启动时其会连接到 zk 注册节点之后根据所连接 topic 的 partition 个数和消费者个数进行 partition 分配。一个 partition 最多只能被一个线程消费但一个线程可以消费多个 partition。其分配算法如下1. 将目标 topic 下的所有 partirtion 排序存于PT2. 对某 consumer group 下所有 consumer 排序存于 CG第 i 个consumer 记为 Ci3. Nsize(PT)/size(CG)向上取整4. 解除 Ci 对原来分配的 partition 的消费权i从0开始5. 将第i*N到i1*N-1个 partition 分配给 Ci我们用例子简单描述下这个算法的内容假设我们连接的 topic 有 8 个 partition此时有 3 个消费线程。那么 partition 的分配过程大致是这样的8/32.667向上取整就是3也就是说每个consumer分配3个分区。那么给第一个消费者分配p0/p1/p2三个分区。给第二个消费者分配p3/p4/p5三个分区。给第三个消费者分配p6/p7两个分区。接着消费者连接对应分区的 Kafka Server并从该分区服务器拉取数据。总结这篇文章简单介绍了 Kafka 框架的技术架构以及消息流转过程并介绍了其中的某些细节。通过这篇文章相信大家对 Kafka 框架应该有个大致的了解。参考资料[1].kafka broker启动流程和server结构[2].kafka发送消息分区选择策略详解 福利扫描添加小编微信备注“姓名公司职位”加入【云计算学习交流群】和志同道合的朋友们共同打卡学习推荐阅读Elastic Jeff Yoshimura开源正在开启新一轮的创新 | 人物志深入浅出Docker 镜像 | 技术头条19岁当老板, 20岁ICO失败, 21岁将项目挂到了eBay, 为何初创公司如此艰难?码二代的出路是什么机器学习萌新必备的三种优化算法 | 选型指南小程序的侵权“生死局”996 程序员ICU 你真的去不起真香朕在看了