核心概念

  • broker是kafka的节点,多台broker集群就是kafka

  • topic消息分为多个topic

  • partition分区,topic划分了多个partition分区,存在负载均衡策略

    每个分区由一个个消息构成,消息在分区中被标识了递增的序号(表明了消息的偏移量)

    每个分区各自维护一套偏移量

  • producer生产者,选择topic插入消息数据。根据kafka的分配策略,将消息插入某个分区队尾。

  • consumer消费者,选择topic并根据offset偏移量来获取消息数据,记录当前读取的消息的偏移量,下次读取从前一次的偏移量基础上继续读取。

    消费者需要自己保存偏移量,通过修改偏移量实现读取不同位置的消息。多个消费者不会相互影响,线程安全,实现高并发消费。

  • 消息数据的删除时间默认为7天

  • 以partition为单位进行备份,每个partition设置一个leader(本身)和若干follower,随机分配在集群上。leader处理读写请求,follower不对外服务,拉取leader数据。

  • 消费者组

    偏移量实际属于消费者组。用户绑定消费者组,消费者组之间相互独立。

    一条消息在一个组内只能消费一次,组中的多个用户不能多次读取这条消息

    组会阻塞多用户同时访问一个分区

集群部署

消息同步ISR

isr列表监控follower的同步状态,isr列表由leader动态维护。

将同步状态满足条件的follower记录在列表中,将不满足条件的follower移出列表。

leader下线后,从isr列表中的follower中选举新的leader

条件参数

  • follower的fech拉取请求间隔时间(10s)

    replica.lag.time.max.ms=10000

  • leader与follower相差记录数(4000)

    replica.lag.max.messages=4000

API

生产者

消费者

数据丢失和重复读取

生产者消息丢失

原因1:kafka数据先存储在内存中,一段时间后溢写到硬盘中。那么节点宕机,在内存中的消息未持久化,随着内存一起丢失。

原因2:分区主从备份,leader分区宕机,从分区未及时拉取同步,导致数据丢失

处理方式:修改持久化触发参数(数据量,时间)

处理方式:修改。。。。

消息丢失(消费者)

原因:在High level模式下,客户端向zk提交了偏移量,但数据读取时消费节点挂了,导致偏移量之前的数据没处理完毕。消费节点再次上线,从zk获取偏移量并向后读取,之前的数据不再处理,最终导致消费数据的丢失。

解决:客户端每条消息处理完,再手动提交偏移量,关闭偏移量自动提交。

重复消费(消费者)

原因:数据处理完以后,偏移量自动提交,设置间隔时间较长。节点宕机后,获取的偏移量是前一次的,节点会重复执行已执行的消息。

解决:手动提交数偏移量

高吞吐

高吞量

  • pagecache(页缓存),基于系统内存的数据接收

  • 磁盘顺序写,相对随机存效率百倍以上,尤其对于磁盘存储。

高吐量

  • 零拷贝计数

    pagecache -- 网卡bufffer(数据)+socket(描述符)-- 客户端

高吞吐

  • producer消息存入速度与consumer读取数据速度维持均衡,保证在数据flush到磁盘前读取数据,实现只在pagecache内存层面的队列高速吞吐。

kafka高吞吐,低延迟的分布式消息队列的更多相关文章

  1. 高吞吐低延迟Java应用的垃圾回收优化

    高吞吐低延迟Java应用的垃圾回收优化 高性能应用构成了现代网络的支柱.LinkedIn有许多内部高吞吐量服务来满足每秒数千次的用户请求.要优化用户体验,低延迟地响应这些请求非常重要. 比如说,用户经 ...

  2. 深入浅出理解基于 Kafka 和 ZooKeeper 的分布式消息队列

    消息队列中间件是分布式系统中重要的组件,主要解决应用耦合,异步消息,流量削锋等问题.实现高性能,高可用,可伸缩和最终一致性架构,是大型分布式系统不可缺少的中间件. 本场 Chat 主要内容: Kafk ...

  3. Kafka 和 ZooKeeper 的分布式消息队列分析

    1. Kafka 总体架构 基于 Kafka-ZooKeeper 的分布式消息队列系统总体架构如下: 如上图所示,一个典型的 Kafka 体系架构包括若干 Producer(消息生产者),若干 bro ...

  4. 【转】快速理解Kafka分布式消息队列框架

     from:http://blog.csdn.net/colorant/article/details/12081909 快速理解Kafka分布式消息队列框架 标签: kafkamessage que ...

  5. 分布式消息队列 Kafka

    分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala具有高吞吐.可扩展.分布式等特点 适用场景 活动数据 ...

  6. Kafka 分布式消息队列介绍

    Kafka 分布式消息队列 类似产品有JBoss.MQ 一.由Linkedln 开源,使用scala开发,有如下几个特点: (1)高吞吐 (2)分布式 (3)支持多语言客户端 (C++.Java) 二 ...

  7. Kafka分布式消息队列

    基本架构 Kafka分布式消息队列的作用: 解耦:将消息生产阶段和处理阶段拆分开,两个阶段互相独立各自实现自己的处理逻辑,通过Kafka提供的消息写入和消费接口实现对消息的连接处理.降低开发复杂度,提 ...

  8. 一款低延迟的分布式数据库同步系统--databus

    每次看到马路对面摩托罗拉的大牌子,都想起谷歌125亿美元收购摩托罗拉移动,后来又以29亿美元卖给联想的事情.谷歌所做的决策都比较考虑长远利益,在这串交易中,谷歌获得了摩托罗拉最有价值的几千项专利,稳健 ...

  9. 分布式消息队列Apache Pulsar

    Pulsar简介 Apache Pulsar是一个企业级的分布式消息系统,最初由Yahoo开发并在2016年开源,目前正在Apache基金会下孵化.Plusar已经在Yahoo的生产环境使用了三年多, ...

随机推荐

  1. 你不知道的JavaScript下卷

    阿喀琉斯之踵 学习编程最好的办法就是编写代码 比较 隐式类型转换 数字和字符串 比较 字符串会隐式转换为数字,再进行比较 == 类型转换 ecma

  2. [CodeIgniter4]讲解-加载静态页

    讲解 本教程旨在向您介绍CodeIgniter框架和MVC体系结构的基本原理.它将向您展示如何以逐步的方式构造基本的CodeIgniter应用程序. 在本教程中,您将创建一个基本的新闻应用程序.您将从 ...

  3. loj6278 数列分块入门题2

    题意:支持区间加,询问区间中元素排名 维护两个域.一个域维护原序列,一个域维护快内排序序列. 每次修改后更新快内排序序列. 修改时O(sqrt(n)log(sqrt(n))) 询问时O(sqrt(n) ...

  4. 2020牛客寒假算法基础集训营2 J.求函数 (线段树 推公式 单点修改 区间查询)

    https://ac.nowcoder.com/acm/contest/3003/J 题解: #include<bits/stdc++.h> typedef long long ll; u ...

  5. Goland安装与配置

    前言 工欲善其事必先利其器,学习Go语言同样如此,一个强大的集成开发环境(IDE)能够大大提高我们的开发效率,目前市面上比较流行的有下面这几种: GoLand:由 JetBrains 公司开发的一个新 ...

  6. git push出错的解决办法

    今天push代码到线上的时候怎么都不行,尝试了很多办法报了好几种错比如: 反正就是各种错,然后其实不管什么错,你全部Git init 一下然后重新配置 git config --global user ...

  7. Codeforces Round #601 (Div. 2) D Feeding Chicken

    //为了连贯,采取一条路形式,从第一行开始 也就是s型 #include <bits/stdc++.h> using namespace std; ; char str[MAXN][MAX ...

  8. two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想

    two pointers思想 ---- 利用两个i, j两个下标,同时对序列进行扫描,以O(n)复杂度解决问题的一种思想, 如果能用这种思想解决问题,那么会大大降低程序的复杂度. 两个利用这个思想的例 ...

  9. Map中放入对象字符串转义问题

    在做Zuul网关日志处理的时候,有以下需求: (1)记录请求成功的日志,要求记录请求返回的结果. 遇到的问题: (1)当请求的结果事对象时,会将其转成字符串,在put进map的时候,字符串就会被转义 ...

  10. 粗略写了使用GD2制作文字图像demo

    项目要求宽,高为传入参数:文字大小,文字间隔需要自动调节: 由于imagettftext()函数写入文字坐标点不以画布左上角为原点,而是根据文字的字体类型,字体大小,中英文,标点等因素变换(测试多组数 ...