kafka基本原理

KAFKA

 

Kafka是一个分布式的、可分区、可复制的消息系统。

 

基本术语:

broker:一个kafka集群由一个或者多个broker组成;

topic:Kafka中用来维护的一类消息;

partition:每个topic包含多个分区,每一个分区都存在各个broker中,但是一个分区只选取一个broker作为主节点;

producer:生产并发送消息到Kafka topic中;

consumer:消息消费者;

consumer group:每个consumer属于一个特定的consumergroup,对于一个topic中的消息只能被同一个group下的一个consumer消费。

 

producer在网络上向kafka集群发送消息,集群讲消息提供给consumer,如下图所示:

 


topic

一个topic就是一类消息,每一个topic,kafka都会对其日志进行分区,如下图所示:

 

 

每个partition就是一个队列,其中消息是有序的,且不可变。新消息被连续追加写到partition中,partition中的每个消息都有一个连续的序号,叫做offset,用来唯一标识partition中的每条消息。

Kafka集群保留了所有以发布消息,即使消息被消费,消息仍然会被保留一段时间。例如,如果log被设置为保留两天,那么在一条消息被消费之后的两天内仍然有效,之后它将会被丢弃以释放磁盘空间。Kafuka的性能相对于数据量来说是恒定的,所以保留大量的数据并不是问题。

每个consumer(消费者)的基础元数据只有一个,那就是offset,它表示消息在log文件中的位置,它由consumer所控制,通常情况下,offset将会”线性”的向前驱动,也就是说消息将依次顺序被消费。而事实上,consumer可以通过设置offset来消费任意位置的消息。例如,consumer可以重置offset来从新处理消息。

 

partition/Distribution

 

Kafka集群中,一个Topic的多个partitions被分布在多个server上。每个server负责partitions中消息的读写操作。每个partition可以被备份到多台server上,以提高可靠性。

每一个patition中有一个leader和若干个follower。leader处理patition内所有的读写请求,而follower是leader的候补。如果leader挂了,其中一个follower会自动成为新的leader。每一台server作为担任一些partition的leader,同时也担任其他patition的follower,以此达到集群内的负载均衡。

 

 

producer

producer发布消息到指定的topic中,producer决定将消息发送到具体的哪一个partition。比如基于”round-robin”方式实现简单的负载均衡或者通过其他的一些算法等.

 

consumer

 

消息基本上有两种模式:queuing(队列模式) 和 publish-subscribe(发布-订阅模式) ,在队列模式中,consumer池从server中读取消息,每个消息都会到达一个consumer。在发布-订阅模式中,消息被广播到所有的consumer。Kafka提供了consumer group这个抽象概念来概括这两种模式。

每个consumer属于一个consumer group, 如果consumer group订阅了topic,那么它会接收到该topic发布的每条消息,该消息只会被分配到一个consumer上。consumer实例可以部署在不同的进程或机器上。如果所有的consumer都具有相同的group,这种情况和queue模式很像,消息将会在consumers之间负载均衡。如果所有的consumer都具有不同的group,那这就是“发布-订阅”,消息将会广播给所有的消费者。

然而,我们发现大多数情况下topic只有少量的逻辑上的订阅者 consumer group,每个group由许多的consumer实例组成,以提高扩展性和容错性。这就是发布-订阅模式,订阅者是consumer集群而非单个进程。

相比于传统的消息系统,Kafka具有更强的序列保证。

传统的队列在server上保持有序,如果多个consumer从队列中消费,队列会按序弹出,然后消息被异步分配到consumer上,因此,消息到达consumer时可能会破坏顺序。这意味着在并行处理过程中,消息处理是无序的。为了解决这个问题,消息系统的exclusive consumer机制只允许单进程从队列中消费消息,当然,这就是说,没有了并行处理能力。

 

Kafka具有更好的解决方案。通过parallelism—thepartition—within the topics机制,Kafka能够提提供有序保证,使consumer池能够负载均衡。这是通过把topic中的partition分派给consumer group中的consumer来实现的,因此,每个partition由group中一个确定的consumer来消费。通过这种方式我们保证了consumer是指定partition的唯一reader,并且按顺序消费数据。由于有很多partition,这种方式使得consumer实例可以负载均衡。

kafka只能保证一个partition中的消息被某个consumer消费时,消息是顺序的。事实上,从Topic角度来说,消息仍不是有序的。如果你需要topic范围内的有序,那么你可以只使用一个partition,这也就是说,group中也只有一个consumer。

 

Guarantees

 

在更高的层面,Kafka给出以下保证:
1) 发送到partitions中的消息将会按照它接收的顺序追加到日志中。
2) 对于消费者而言,它们消费消息的顺序和log中消息顺序一致。
3) 如果Topic的”replication factor“为N,那么允许N-1个kafka实例失效。

kafka部署

 

 

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值