Kafka在实时数据开发中的应用

老铁,你还在为9点半开市时的数据陡增导致的数据积压问题而烦恼头秃吗?
你还在为数据传递时的消息阻塞而手足无措吗?
你还在为无法保障消息顺序性及回溯消费而寝食难安吗?
不要怂,不要怕,请允许笔者为你推荐一款实时数据开发必备良药——Kafka
Kafka在实时数据开发中的应用_第1张图片

01 Kafka简介

Kafka是一个分布式的基于发布/订阅模式的消息队列,主要应用于大数据实时处理领域。不同于点对点模式的消息队列,Kafka发布到topic的消息会被所有订阅者消费。

02 Kafka基础架构

Kafka在实时数据开发中的应用_第2张图片

  • Topic:
    可以理解为一个队列,生产者和消费者面向的都是一个topic。
  • Partition:
    为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。
  • Producer:
    消息生产者,就是向kafka broker发消息的客户端。
  • Consumer:
    消息消费者,向kafka broker取消息的客户端。多个consumer组成消费者组,消费者组内每个消费者负责消费不同分区的数据,一个分区只能由一个消费者消费;消费者组之间互不影响。所有的消费者都属于某个消费者组,即消费者组是逻辑上的一个订阅者。
  • Broker :
    一台kafka服务器就是一个broker。一个集群由多个broker组成。一个broker可以容纳多个topic。
  • Replica:
    副本,为保证集群中的某个节点发生故障时,该节点上的partition数据不丢失,且kafka仍然能够继续工作,kafka提供了副本机制,一个topic的每个分区都有若干个副本,一个leader和若干个follower。
    Kafka在实时数据开发中的应用_第3张图片

03 Kafka生产者

3.1 分区策略

为了方便在集群中扩展,且提高并发度,所以考虑分区。
① 指明 partition 的情况下,直接将指明的值直接作为 partiton 值
②没有指明 partition 值但有 key 的情况下,将 key 的 hash 值与 topic的 partition 数进行取余得到 partition 值
③既没有 partition 值又没有 key 值的情况下,第一次调用时随机生成一个整数(后面每次调用在这个整数上自增),将这个值与 topic 可用的 partition 总数取余得到 partition 值,也就是常说的 round-robin 算法

3.2 数据可靠性保证

为保证producer发送的数据,能可靠的发送到指定的topic,topic的每个partition收到producer发送的数据后,都需要向producer发送ack(acknowledgement确认收到),如果producer收到ack,就会进行下一轮的发送,否则重新发送数据。
Kafka在实时数据开发中的应用_第4张图片

3.3 Exactly Once语义

对于某些比较重要的消息,我们需要保证exactly once语义,即保证每条消息被发送且仅被发送一次。

04 Kafka消费者

consumer采用pull(拉)模式从broker中读取数据。相比于push模式,pull模式则可以根据consumer的消费能力以适当的速率消费消息。请记得设置timeout 参数。

4.1 分区分配策略

Kafka有两种分配策略,一是roundrobin,一是range。

4.2 offset的维护

由于consumer在消费过程中可能会出现断电宕机等故障,consumer恢复后,需要从故障前的位置的继续消费,所以consumer需要实时记录自己消费到了哪个offset,以便故障恢复后继续消费。
Kafka 0.9版本之前,consumer默认将offset保存在Zookeeper中,从0.9版本开始,consumer默认将offset保存在Kafka一个内置的topic中,该topic为__consumer_offsets。

05 应用中常见的坑

后续文章,笔者会分享Kafka在实际应用中常见的坑,敬请期待哟

你可能感兴趣的:(实时,kafka,分布式,java)