消息队列学习(四)-kafka

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

特点:

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

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

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

基础概念

  1. 生产者(Producer) 也称发布者,创建消息。
  2. 消费者(Consumer)也称订阅者,负责消费或读取消息。
  3. 主题(Topic) 消息以主题分类,每一个主题对应一个消息队列,
  4. 分区(Partition)  对主题水平扩展,example:A->B 多修几条通道,同时进行。
  5. Broker 一台kafka服务器,接受生产者发送的消息并存入磁盘;同时服务消费者拉取分区消息的请求,返回目前已提交的消息。
  6. 集群(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除非你指定数量。命名规则:<topic_name>-<partition_id>。

| --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状态副本写入才返回。
  • 一旦消息已提交,那么只要有一个副本存活,数据不会丢失。
  • 消费者只能读取到已提交的消息。

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

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

myskybeyond

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值