kafka(1)

Kafka是一个分布式、分区的、复制的日志系统,提供消息队列功能。文章介绍了Kafka的基本概念,包括topics、logs、分布、生产者、消费者和保障的特性。每个topic由分区组成,每个分区有顺序的、不可变的消息,允许多个消费者并行消费以实现高吞吐。Kafka提供序列一致性,并通过分区和复制确保数据可用性。

Introduction


kafka是一个分布式、分区的、复制因子的日志系统。它提供了信息系统的功能,但具有独特的设计。

上面这句话包含了什么含义呢?

首先,让我们再回顾下一些消息队列的术语:

  • kafka包含一个topic的概念,它是消息的订阅者
  • 我们称向topic中发布消息的程序为生产者
  • 我们称向topic订阅消息和消费消息的程序为消费者
  • kafka是由一个或者多个broker进程组成的。

所以,整体来看,生产者通过网络发送消息到kafka集群,然后消费者从kafka集群中抓取消息。如下图:


客户端和服务端之间的通信是很简单的,高性能的。底层使用的是TCP protocol,kakfa是提供原生的java客户端,但是也支持其他的语言,比如C,C++等。


topics and logs

我们先来看看kafka高级的抽象-topic

每一个topic是一个分类,即消息要被发送到的部门。对于每个topic,kafka集群包含一个分区日志,如下图:


每一个分区是有序的、不可变的,持续的写入的提交日志。在分区内的数据分配一个有序的id号,称为offset。offset是有序不可改变的,用来定义该消息在分区内的位置。

kafka集群包含所有发布的消息,无论该消息有没有被消费掉。例如现在设置日志保留策略设置为2天,2天后有一个消息被发布了,它是可以被消费的,2天以后该消息会被清空以便留出空间。kafka的性能从长远看是恒定的,所以留存大量的数据并不是一个问题。

事实上,对于每个消费者来说唯一需要保留的元数据信息即offset(消费者所消费的偏移量信息)。offset是被消费者端所控制的:通常一个消费者会不断的增长它所持有的offset的大小,但是这个位置信息是可以改变的,根据消费者端的逻辑来控制,比如消费者端可以重置offset的值。

这样看来消费者的特性对于kafka来说是非常廉价的-消费者们能够来去自如并且对kafka和其他消费者没有太大的影响。比如,你可以使用命令行工具去执行“tail”,去查看任何topic中的内容而无需改变现存的消费者们。

分区设计对于日志服务是有目的的:首先,分区允许日志扩展超过单独的服务器容量,每一个独立的分区必须服从它所在的服务器的硬盘大小,但是一个topic可以有很多分区所以topic是可以保留任意大小数据的。其次,分区可以作为并行单元-提高并行度

Distribution

每个日志的分区是分布式的存储在kafka集群中的,所以kafka集群中的机器操控数据并且分担数据请求对于每个分区。每个分区是有容错备份因子的,这个数值是可以配置的。

每一个分区会有一个服务器担任“leader”的角色,并且会有0到多台服务器担任“follower”的角色。leader操控该分区所有的读和写的操作,其他的follower被动的复制该leader的操作。如果leader失效了,会从follower中选出一位担任新的leader。每台服务器扮演一个leader对于该服务器所持有的分区,并且扮演follower作为其他的分区,这样就实现了负载均衡。

Producers

顾名思义,生产者即发布数据到指定的topic。生产者的任务很明确,即选择什么消息被发送到topic的哪个分区中。这个过程可以在一个循环中完成,实现了简单的负载均衡或者实现了语义的自定义分区。


Consumers

传统的消息的传递有两种:队列和订阅发布。在队列模式中,一组消费者会共享一个消息队列中的信息,一条消息同一时间只会被一个消费者拿到并处理。在订阅发布模式中,消费会被广播发送给那些订阅了消息的消费者们。两者差别还是蛮大的。在kafka中提供了一个消费者抽象,概括了这些即消费者群组(consumer group).

消费者们标记自己使用同一个消费者群组名称,每一个被发布到topic的消息只会传递给订阅了该主题的消费者群组里面的一个消费者实例。消费者实例可以是同一台机器的不同进程或者不同的机器。

如果所有的消费者实例拥有相同的消费者群组,这个过程相当于传统的队列模式,平衡了消费者群组内的负载。

如果消费者实例拥有不同的消费者群组名称,这个过程类似于传统的订阅-发布模式,消息会被广播的发送给所有的消费者。

通常情况下,我们发现topic由一小部分的消费者群组来订阅,每一个消费者群组成为逻辑用户。每一个群组由许多的消费者实例来实现可扩展性和容错机制。



kafka系统比传统的系统拥有更强大的序列一致性。

传统的队列模式采用的是把数据的顺序在服务端保证,如果有多个消费者来消费数据,服务端发放数据是按照服务端存储的先后顺序发放的。然而,服务端发放的数据是有序的,消息的传递是异步到达消费者的。所以消息到达的顺序可能是不一致的,这样就意味着在并行模式下,传统模式就失去了效果。消息的传递通常工作在一个“独家消费”的模式,仅允许一个进程从队列中消费,当然这样也意味着没有并行的处理过程。

在这一点上kafka可以实现的更好,kafka的topic拥有一个并行的概念-partition。kafka能够提供序列保证和负载均衡对于一组的消费者。简单来说就是topic中的每一个分区由消费者群组里面的某一个消费者来消费,这样一来这个消费者就是这个分区的唯一消费者并且能保证数据的时序。这样看来,就算有很多的分区仍然能够保证负载均衡对于每个消费者群组。但是这里要注意一点,消费者实例的数量不能比分区数量多。

kafka只能保证在一个分区内的所有数据的时序性,但是不同分区的之间的是无法保证的。每个分区的有序性能够满足大多数应用的需求的。如果需要一个全局有序的消息系统,也是可以实现的,即topic只有一个分区,这样一来也只能有一个消费者实例去消费。

Guarantees

在kafka的高级特性中给出了如下的保证:

  • 生产者生产数据发送到特定topic中的特定分区,在消息被消费时是保证有序的。也就是说,如果信息M1被同一个生产者当做M2生产,并且M1先被发送,这M1将会拥有一个更小的offset相对比M2。而且更早的追加进日志中。
  • 消费者实例看到消息是有序的存储在日志中
  • 如果一个topic拥有复制因子为N,我们将拥有至少N-1份的数据保证。






评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值