1.kafka概述
kafak是一款高度可拓展的消息系统,在数据管道中扮演着很重要的角色,因其水平拓展和高吞吐率被广泛使用。被多家大型公司作为数据管道和消息系统。
2. kafka的出现带来了什么
如果没有kafka,不同的系统之间的数据的传输需要构建自定义的数据传输管道,会造成系统与系统之间的耦合性变大。
image.png
所以我们需要一个新的数据系统,能够在任意的系统之间进行数据的传输,作为之间的数据管道或者是消息系统来为不同的系统之间进行解耦。
这个新系统便是kafka,kafka作为神经系统,管理各个应用程序汇聚到此的信息流,这些数据经过处理后被分发到目的地系统(kafka的流处理功能),kafka作为一个消息系统,进行消息的传递,同时他也是一个日志存储系统,以日志的形式来存储流经kafka的所有的数据
image.png
3 kafka的三个主要的功能
发布订阅(消息系统),流处理,存储
image.png
4 kafka在linkedin内部的使用场景
linkedin内部把kafka打造成为管理系统所有的信息流的开源的解决方案。把kafka作为消息神经中枢,帮助公司内各个应用,以松耦合的方式在一起工作,已经严重依赖kafka,并基于kafka构建了消息中枢系统。
(1)系统监控,公司内所有的主机都会醒kafka发送系统健康信息和运行信息。负责运维信息展示和报警的系统则从kafak里面获取数据,进行展示和预警业务的触发。
(自见)我们公司使用的是zabbix进行集群中所有的主机的监控的,但是zabbix进行系统主机的监控,可视化并不是做的很好。最近我又学习了grafana,他可以使用插件的形式来连接zabbix,进行监控数据的可视化展示,以及设置预警的功能,非常的漂亮。其实这些监控应用的底层实现都是调用Linux的获取系统运行的接口来获取数据,例如meminfo,free,top等,然后用来进行界面的展示。原理类似与java的jmx接口规范。《JMX连接》
(2)传统的消息队列,kafka最本质的作用,还是作为消息队列,其他的功能也是在某些方面增强kafka消息队列的功能。(自见)kafka是不仅仅是可以在不同的应用系统之间进行数据的传输,也可以直接文件存储系统或者是数据库进行数据的交互,其实质的原理是通过对应的连接器进行数据的传输,一般这样的做法在普通的公司是比较少见的,大公司也是有使用kafka进行数据库的操作数据的读取,以此来实现自己的数据监控系统。
5 linkedin开发的kafka组件
这里我只写restful接口的主键,其实质也是很简单的。传统的向kafka里面写数据要么是使用api接口,比如kafka-cli.jar调用里面的Producer,然后向里面写数据,或者是命令行kafka-console-producer.sh。这里的resetful其实也就是对上面的api进行一个封装的,将接口封装为resetful的接口提供调用,原理是很简单的。
6 kafka设计的目标
kafka是一款分布式的发布订阅的消息系统。
---数据的持久化以时间复杂度为O(1)的方式提供消息的持久化,既是对TB级别的数据也支持在常数时间内访问的性能。但是这个持久化是有时间限制的,kafka默认只对数据进行一周的持久化,时间到了就会删除,来保证有足够的空间持久化。
---高吞吐率,既是在廉价的机器上面也支持每秒100K条消息的发送。其底层的实现原理要归功于,分区,高效的读写(顺序读写),和pagechache等功能的支持。《kafka高吞吐连接》https://blog.csdn.net/stark_summer/article/details/50144591
---支持消息分区,以及分布式消费,同时保证每个分区内消息是有序的。
---支持在线的水平拓展
7 为什么使用kafka(只写我理解的几个功能)
(1)应用解耦,在项目启动的时候,预测项目将来的需求是极其困难的,消息系统是在两个应用系统进行数据传输的过程中插入了一个隐含的,基于数据的接口(注意这里数据的无关性,只进行数据的传输),两边系统只需要实现这一接口就可以了,可以使得两边的人员可以独立的拓展和修改两边的处理逻辑。
(2)数据的持久化,保证数据在被消费之后,才会被删除,避免了数据的丢失。许多的消息队列采用 插入-获取-删除的范式来保证数据的消费的可靠性。
(3)流量削峰
(4)缓冲,这里其实kafka在一定程度上面也实先了buffer的作用。
(5)异步通信
网友评论