1 简介

Kafka是Apache下的一个子项目,是一个高性能跨语言分布式发布/订阅消息队列系统
它采用的是发布 - 订阅模型, 一个消息可以被多次消费, mq不主动删除消息,消息有过期时间,如果到了过期时间,只能确认不能重新该消费,只保留最大可设置天数的消息。超过该天数则删除。
特点:

  • 高吞吐率。即使在非常廉价的商用机器上也能做到单机支持每秒100K条以上消息的传输。
  • 可进行持久化操作,将消息持久化到到磁盘,以日志的形式存储,因此可用于批量消费
  • 分布式系统,易于向外拓展。所有的Producer、broker和consumer都会有多个,均为分布式。无需停机即可拓展机器。

2 消息队列的大致原理

  • 生产者:

    • 生产者先将消息发送给服务端(Broker),Broker在收到消息并将消息写入主题或者队列中后,会给生产者发送确认的响应。
    • 如果生产者没有收到服务端的确认或者收到失败的响应,则会重新发送消息
  • 消费者:

    • 消费者在收到消息并完成自己的消费业务逻辑(比如将数据保存到数据库中)后,也会给broker发送消费成功的确认,broker只有收到消费确认后,才认为一条消息被成功消费
    • 否则broker会给消费者发送这条消息, 直到收到对应的消费成功确认

image.png

Tips:

  • 中间的主题由broker维护, 由于分区的存在, 一个主题可以被多个消费者同时消费
  • 如果生产者没有指定把消息放到哪个分区, 生产者如何选择分区?
    • 若指定了消息的Key, 则基于key的哈希值来选择一个分区
    • 若没有指定消息的Key, 则会随机地放到其中一个分区(上个消息放到分区2, 这个消息就会放分区1)
  • 如果消费者没有指定从哪个分区接收消息, 消费者如何选择分区?

3 为什么要使用消息队列

  • 解耦: 在项目启动之初来预测将来项目会碰到什么需求,是极其困难的。消息系统在处理过程中间插入了一个隐含的、基于数据的接口层,两边的处理过程都要实现这一接口。这允许你独立的扩展或修改两边的处理过程,只要确保它们遵守同样的接口约束。
  • 冗余: 有些情况下,处理数据的过程会失败。除非数据被持久化,否则将造成丢失。消息队列把数据进行持久化直到它们已经被完全处理,通过这一方式规避了数据丢失风险。许多消息队列所采用的”插入-获取-删除”范式中,在把一个消息从队列中删除之前,需要你的处理系统明确的指出该消息已经被处理完毕,从而确保你的数据被安全的保存直到你使用完毕。
  • 扩展性: 因为消息队列解耦了你的处理过程,所以增大消息入队和处理的频率是很容易的,只要另外增加处理过程即可。不需要改变代码、不需要调节参数。扩展就像调大电力按钮一样简单。
  • 峰值处理能力: 在访问量剧增的情况下,应用仍然需要继续发挥作用,但是这样的突发流量并不常见;如果为以能处理这类峰值访问为标准来投入资源随时待命无疑是巨大的浪费。使用消息队列能够使关键组件顶住突发的访问压力,而不会因为突发的超负荷的请求而完全崩溃。
  • 可恢复性: 系统的一部分组件失效时,不会影响到整个系统。消息队列降低了进程间的耦合度,所以即使一个处理消息的进程挂掉,加入队列中的消息仍然可以在系统恢复后被处理。
  • 顺序保证: 在大多使用场景下,数据处理的顺序都很重要。大部分消息队列本来就是排序的,并且能保证数据会按照特定的顺序来处理。Kafka保证一个Partition内的消息的有序性。
  • 缓冲: 在任何重要的系统中,都会有需要不同的处理时间的元素。例如,加载一张图片比应用过滤器花费更少的时间。消息队列通过一个缓冲层来帮助任务最高效率的执行———写入队列的处理会尽可能的快速。该缓冲有助于控制和优化数据流经过系统的速度。
  • 异步通信: 很多时候,用户不想也不需要立即处理消息。消息队列提供了异步处理机制,允许用户把一个消息放入队列,但并不立即处理它。想向队列中放入多少消息就放多少,然后在需要的时候再去处理它们。

4 术语

名词 解释
Broker 缓存代理,Kafka集群中的一台服务器称为broker.
Topic 一个消息的集合,topic存储在broker中,一个topic可以有多个partition分区,一个topic可以有多个Producer来push消息,一个topic可以有多个消费者向其pull消息,一个topic可以存在一个或多个broker中。
Partition 是topic的子集,不同分区分配在不同的broker上进行水平扩展从而增加kafka并行处理能力,同topic下的不同分区信息是不同的,同一分区信息是有序的;每一个分区都有一个或者多个副本,其中会选举一个leader,fowller从leader拉取数据更新自己的log(每个分区逻辑上对应一个log文件夹),消费者向leader中pull信息。
Message 消息,是通信的基本单位,每个producer可以向一个topic(主题)发布一些消息

5 kafka拓扑架构

kafka中不是由broker去push给consumer, 而是由consumer从broker中pull, 这样的好处是consumer可以自行控制消息速率
image.png

6 交付保证级别

在producer向broker push后, 由于网络故障, 导致ack没有响应给producer, producer默认会重试多次, 即At least one

  • At least one(默认): 消息绝不会丢,但可能会重复传输
  • At most once: 消息可能会丢,但绝不会重复传输
  • Exactly once: 每条消息肯定会被传输一次且仅传输一次.