kafka视频观看小结

来源:互联网 发布:苏梅岛 知乎 编辑:程序博客网 时间:2024/05/17 03:19

Apache kafka:一个高吞吐量的分布式发布订阅消息系统

 

小结

  • 消息队列有2种:点对点和发布订阅模式,现在点对点的模式已经不多了,毕竟一个消息可能有多个消费者,所以发布订阅的模式是有需求的,kafka就是发布订阅的模式,但是如果一个消息只有一个消费者,也可以说是一种伪点对点模式,为什么是伪呢?因为即使没有消费者订阅,消息也不会消失,即使有一个消费者,消费者完成了消费,该消息也不会消失。

 

  • 消息持久化,保证了安全,但是IO操作会损失一些性能,如何使性能的损失最小化呢,请看kafka的文件系统存储,以及使用零拷贝,内核参数配置等的设计与优化。
    • kafak发现线性的访问磁盘,很多时候比随机的内存访问快得多,传统的使用内存做为磁盘的缓存,Kafka直接将数据写入到日志文件中(零拷贝),读操作不会阻塞写操作和其他操作,数据大小不对性能产生影响;没有容量限制(相对于内存来说)的硬盘空间建立消息系统;
  • kafka的broker是无状态的,状态由消费者在zookeeper端维护。
  • kafka支持在线和离线的应用场景
  • Kafka的Producer、Broker和Consumer之间采用的是一套自行设计基于TCP层的协议,根据业务需求定制,而非实现一套类似Protocol Buffer的通用协议。
  • producer通常指定broker,topic,以及确认选项等
  • consumer指定broker,topic,partition等

 

分区

  1. 消息分类存储,每一类称之为Topic,topic又被划分为若干分区partition(创建topic的时候可以指定分区个数),每个分区由一组有序的消息序列组成,新生产的消息则追加至末尾。
  2. 每条消息有一个序列号id,称之为offset,唯一标记partition内的一条消息;
  3. 消费者需要维护的唯一元数据信息是其消费的offset值,理论上offset是线性增长的,但consumer可以指定offset的值,所以这些设计机制使consumer very cheap,开发者可以随意增删consumer,不会影响kafka集群或者其他消费者,broker也是无状态的;
  4. 分区partition存在的意义:将一个topic的消息进行切分,分开存储在不同的broker上,从而使topic能够容纳更多的数据量,不受单台服务器存储能力的限制;另外一点是:作为并行处理的基本单元:(我的理解:1、一个partition对应一个leader broker以及若干follower,生产者消费者仅和leader通信进行读写操作,只要集群内的leader均匀分布,则可保证每台服务器的负载相对均衡;2、消费者又属于某个consumer group,一条消息只能被一个group内的一个consumer消费,所以一般情况下,一个消费者消费topic的一个分区,可见分区越多,便可以有更多的消费者并发消费,所以partition是kafka并行化的基本单位)

消费者API

  • 传统的消息系统有两种模型:队列queuing和发布订阅publish-subscribe。队列模型中,一条消息只能被一个消费者消费;发布订阅模型中,一条消息会广播给所有的消费者。kafka通过consumer group能同时满足这两种需求。
  • 消息的顺序性保证:传统的队列保证消息在server上顺序存储,但当他将消息按照存储顺序分发给并行消费的consumer时,顺序就会被打乱,无法保障有序性。当然,可以只让一个消费者来消费,这样消息依然是顺序的,但又违背了并行处理的初衷。
  • kafka通过partition很好的保证了顺序性以及消费者的负载均衡:(这是partition存在的另一个意义吧)consumer group中的一个consumer消费一个partition,所以保证了一个分区内的消息总是被顺序消费,消费者的负载也相对均衡。但是要注意:如果group内的consumer数量大于topic的partition个数,则一些消费者处于空闲状态,而且不能保证partition之间消息的顺序性,特殊场景下,可以使一个topic只有一个分区,只让一个consumer进行消费,这样便是全局有序的。


 

 

 

0 0
原创粉丝点击