消息队列学习(四)-kafka

Orianna ·
更新时间:2024-09-21
· 764 次阅读

kafka是一种分布式的,基于发布/订阅的消息系统。

特点:

高效性 对TB级以上数据也能保证常数时间复杂度的访问性能。以时间复杂度为0(1)的方式提供消息持久化能力。

附一篇算法时间复杂度表示法的文章:https://www.zhihu.com/question/21387264

高吞吐率 支持kafaka server间的消息分区,及分布式消费,保证每个Partition内的消息顺序消费。 支持离线数据处理和实时数据处理。 scale out:支持在线水平扩展。

基础概念

生产者(Producer) 也称发布者,创建消息。 消费者(Consumer)也称订阅者,负责消费或读取消息。 主题(Topic) 消息以主题分类,每一个主题对应一个消息队列, 分区(Partition)  对主题水平扩展,example:A->B 多修几条通道,同时进行。 Broker 一台kafka服务器,接受生产者发送的消息并存入磁盘;同时服务消费者拉取分区消息的请求,返回目前已提交的消息。 集群(Cluster) 若干个Broker组成一个集群(Cluster),其中集群内的某个Broker会成为集群控制器(Cluster Controller),负责管理集群,包括分区到Broker,监控Broker故障等,集群内,一个分区由一个Broker负责,称为分区的Leader;

日志保留(retention),可配置主题的消息保留策略,比如保留一段时间内的日志或保留一定大小的日志,也可以针对某个主题单独设置消息过期策略。

多集群:基于数据隔离,安全的隔离,容灾等原因。多个kafakaj集群消息同步可以是用MirrorMaker工具(kafka提供)待验证

kafka存储在文件系统中

预读,后写,磁盘缓存,针对磁盘的顺序访问,某些情况下它可能要比随机的内存访问速度都要快,甚至可以媲美网络速度。

任何发布到 Partition 的消息都会被追加到 Partition 数据文件的尾部,这样的顺序写磁盘操作让 Kafka 的效率非常高。

每一条消息被发送到 Broker 中,会根据 Partition 规则选择被存储到哪一个 Partition。如果 Partition 规则设置的合理,所有消息可以均匀分布到不同的 Partition中。

topic是逻辑上的概念,面向生产者和消费者,物理上存储的是Patition,每一个Partition对应一个目录,里面存储所有的消息和索引文件。默认每一个topic默认会创建一个Partition除非你指定数量。命名规则:-。

| --topic1-0 | --topic2-0 | --topic2-1 | --topic1-0 | --00000000000000000000.index | --00000000000000000000.log | --00000000000000368769.index | --00000000000000368769.log | --00000000000000737337.index | --00000000000000737337.log | --00000000000001105814.index | --00000000000001105814.log | --topic2-0 | --topic2-1

Segment 是 Kafka 文件存储的最小单位。 由 index file 和 data file 组成,他们总是成对出现,后缀 “.index” 和 “.log” 分表表示 Segment 索引文件和数据文件。

Segment 文件命名规则:Partition 全局的第一个 Segment 从 0 开始,后续每个 Segment 文件名为上一个 Segment 文件最后一条消息的 offset 值。数值最大为 64 位 long 大小,19 位数字字符长度,没有数字用0填充。如 00000000006800003769.index 和 00000000000000368769.log。

为什么kafaka是pull模型?

push 模式很难适应消费速率不同的消费者,因为消息发送速率是由 broker 决定的。push 模式的目标是尽可能以最快速度传递消息,但是这样很容易造成 Consumer 来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而 pull 模式则可以根据 Consumer 的消费能力以适当的速率消费消息。

kafaka如何保证可靠性?

Kafka 中的可靠性保证有如下四点:

对于一个分区来说,它的消息是有序的。如果一个生产者向一个分区先写入消息A,然后写入消息B,那么消费者会先读取消息A再读取消息B。 当消息写入所有in-sync状态的副本后,消息才会认为已提交(committed)。这里的写入有可能只是写入到文件系统的缓存,不一定刷新到磁盘。生产者可以等待不同时机的确认,比如等待分区主副本写入即返回,后者等待所有in-sync状态副本写入才返回。 一旦消息已提交,那么只要有一个副本存活,数据不会丢失。 消费者只能读取到已提交的消息。

下一步搭一个简单的环境体验。待完成。


作者:我的天空上



队列 学习 kafka 消息队列

需要 登录 后方可回复, 如果你还没有账号请 注册新账号