「这是我参与11月更文挑战的第13天,活动详情查看:2021最后一次更文挑战」
什么是Kafka
Kafka是最初由Linkedin公司开发,是一个分布式、分区的、多副本的、多订阅者,基于zookeeper协调的分布式日志系统(也可以当做MQ系统),常见可以用于web/nginx日志、访问日志,消息服务等等,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。
主要应用场景是:日志收集系统和消息系统。
Kafka主要设计目标如下:
- 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能保证常数时间的访问性能。
- 算法复杂度:时间复杂度和空间复杂度
- 以时间复杂度为O(1)的方式:常数时间运行和数据量的增长无关,假如操作一个链表,那么无论链表的大还是小,操作时间是一样的
- 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条消息的传输。
- 支持普通服务器每秒百万级写入请求
- Memory mapped Files
- 支持Kafka Server间的消息分区,及分布式消费,同时保证每个partition内的消息顺序传输。
- 同时支持离线数据处理和实时数据处理。
- Scale out:支持在线水平扩展
kafka的特点
- 解耦。Kafka具备消息系统的优点,只要生产者和消费者数据两端遵循接口约束,就可以自行扩展或修改数据处理的业务过程。
- 高吞吐量、低延迟。即使在非常廉价的机器上,Kafka也能做到每秒处理几十万条消息,而它的延迟最低只有几毫秒。
- 持久性。Kafka可以将消息直接持久化在普通磁盘上,且磁盘读写性能优异。
- 扩展性。Kafka集群支持热扩展,Kaka集群启动运行后,用户可以直接向集群添。
- 容错性。Kafka会将数据备份到多台服务器节点中,即使Kafka集群中的某一台加新的Kafka服务节点宕机,也不会影响整个系统的功能。
- 支持多种客户端语言。Kafka支持Java、.NET、PHP、Python等多种语言。
- 支持多生产者和多消费者。
kafka的主要应用场景
-
消息处理(MQ)
KafKa可以代替传统的消息队列软件,使用KafKa来实现队列有如下优点- KafKa的append来实现消息的追加,保证消息都是有序的有先来后到的顺序,
- 稳定性强队列在使用中最怕丢失数据,KafKa能做到理论上的写成功不丢失
- 分布式容灾好
- 容量大相对于内存队列,KafKa的容量受硬盘影响
- 数据量不会影响到KafKa的速度
-
分布式日志系统(Log)
在很多时候我们需要对一些庞大的数据进行存留,日志存储这块会遇到巨大的问题,日志不能丢,日志存文件不好找,定位一条消息成本高(遍历当天日志文件),实时显示给用户难,这几类问题KafKa都能游刃有余- KafKa的集群备份机制能做到n/2的可用,当n/2以下的机器宕机时存储的日志不会丢失
- KafKa可以对消息进行分组分片
- KafKa非常容易做到实时日志查询
-
流式处理
流式处理就是指实时地处理一个或多个事件流。
流式的处理框架(spark, storm , flflink) 从主题中读取数据, 对其进行处理, 并将处理后的结果数据写入新的主题, 供用户和应用程序使用,kafka的强耐久性在流处理的上下文中也非常的有用