一、基本概念
1.为什么要用kafka:
缓冲和削峰:上游数据时有突发流量,下游可能扛不住,或者下游没有足够多的机器来保证冗余,kafka在中间可以起到一个缓冲的作用,把消息暂存在kafka中,下游服务就可以按照自己的节奏进行慢慢处理。
解耦和扩展性:项目开始的时候,并不能确定具体需求。消息队列可以作为一个接口层,解耦重要的业务流程。只需要遵守约定,针对数据编程即可获取扩展能力。
冗余:可以采用一对多的方式,一个生产者发布消息,可以被多个订阅topic的服务消费到,供多个毫无关联的业务使用。
健壮性:消息队列可以堆积请求,所以消费端业务即使短时间死掉,也不会影响主要业务的正常进行。
异步通信:很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。
2.定义:
kafka:Kafka是最初由Linkedin公司开发,是一个分布式、支持分区的(partition)、多副本的(replica),基于zookeeper协调的分布式消息系统,它的最大的特性就是可以实时的处理大量数据以满足各种需求场景:比如基于hadoop的批处理系统、低延迟的实时系统、storm/Spark流式处理引擎,web/nginx日志、访问日志,消息服务等等,用scala语言编写,Linkedin于2010年贡献给了Apache基金会并成为顶级开源项目。中间件。
3.与其他主流分布式消息系统的对比
定义解释:
(1)事务的概念:在数据库中,多个操作一起提交,要么操作全部成功,要么全部失败。举个例子, 在转账的时候付款和收款,就是一个事务的例子,你给一个人转账,你转成功,并且对方正常行收到款项后,这个操作才算成功,有一方失败,那么这个操作就是失败的。
对应消在息队列中,就是多条消息一起发送,要么全部成功,要么全部失败。3个中只有ActiveMQ支持,这个是因为,RabbitMQ和Kafka为了更高的性能,而放弃了对事物的支持 。
(2)集群:多台服务器组成的整体叫做集群,这个整体对生产者和消费者来说,是透明的。其实对消费系统组成的集群添加一台服务器减少一台服务器对生产者和消费者都是无感知的。
(3)负载均衡,对消息系统来说负载均衡是大量的生产者和消费者向消息系统发出请求消息,系统必须均衡这些请求使得每一台服务器的请求达到平衡,而不是大量的请求,落到某一台或几台,使得这几台服务器高负荷或超负荷工作,严重情况下会停止服务或宕机。
(4)动态扩容是很多公司要求的技术之一,不支持动态扩容就意味着停止服务,这对很多公司来说是不可以接受的。
(5)broker:一个独立的kafka服务器就被称为broker,broker接收来自生产者的消息,为消息设置偏移量,并提交消息到磁盘中。
(6)偏移量:偏移量(Consumer Offset)是一种元数据,他是一个不断递增的整数值,用来记录消费者发生重平衡时候的位置,以便用来恢复数据。
注:
阿里巴巴的Metal,RocketMQ都有Kafka的影子,他们要么改造了Kafka或者借鉴了Kafka,最后Kafka的动态扩容是通过Zookeeper来实现的。
4.kafka的消息队列
kafka的消息队列一般分为两种模式:点对点模式、发布订阅模式。
如果一个生产者或者多个生产者产生的消息能够被多个消费者同时消费的情况,这样的消息队列成为发布订阅模式的消息队列
kafka是支持消费者群组的,也就是说kafka中会有一个或者多个消费者,如果一个生产者生产的消息是有一个消费者消费,这种模式就是点对点的模式。(消息被消费以后,queue中不在存储,所以消息消费者不可能消费到已经被消费的消息。。但是Queue中支持存在多个消费者,但对同一个消息而言只会有一个消费者消费)
一个典型的kafka集群中包含若干个Producer(可以是前端产生的PageView,或者是服务器日志,系统的CPU、Memory等),若干个broker(Kafka支持水平扩展,一般broker数量越多,集群吞吐率越高),若干个Consumer Group,以及一个Zookeper集群。Kafka通过Zookeeper管理集群遏制,选举leader,以及Consumer Group发生变化时进行rebalance。Producer使用push模式将消息发布到broker,Consumer使用pull模式从broker订阅消息。
5.核心API
四个核心API:Producer API、Consumer API、Stream API、Connector API
Producer API,它允许应用程序向一个或多个topics上发送消息记录
Consumer API,允许应用程序订阅一个或多个topics并处理为其生成的记录流
Stream API,它允许应用程序作为流处理器,从一个或多个主题中消费输入流并为其生成输出流,有效的将输入流转换为输出流。
Connector API,它允许构建和运行将kafka主题连接到吸纳有应用程序或数据系统的可用生产者和消费者。例如关系数据库的连接器可能会捕获对表的多有更改
6.Kafka为什么这么快
(1)顺序读写
(2)零拷贝
(3)消息压缩
(4)分批发送
Kafka实现了零拷贝原理来快速移动数据,避免了内核之间的切换。Kafka可以将数据记录分批发送,从生产者到文件系统到消费者,可以端到端的查看这些批次的数据。
批处理能够进行更有效的数据压缩并减少I/O延迟,Kafka采取顺序写入磁盘的方式,避免了随机磁盘寻址的浪费。
7.一些特点
点对点(PTP):
producer生产消息到queue,然后sonsumer从queue中取出并且消费信息。
消息被消费后,queue将不再存储消息,其他所有consumer不可能消费到已经被其他consumer消费过的消息。
queue支持存在多个producer,但是对一条消息而言,只会有一个consumer可以消费,其他consumer则不能再次消费。
但consumer不存在时,消息则由queue一直保存,直至有consumer把它消费。
发布订阅(Topic):
publisher(消息发布者)将消息发布到主题(topic)中,同时又多个消息消费者(subscriber)消费该消息。
和PTP方式不同,发布到Topic的消息会被所有订阅者消费。
当发布者发布消息,不管是否有订阅者,都不会报错信息。
一定要先有消息发布者,后有消息订阅者。