kafka问题分析

来源:互联网 发布:数据库日志已截断 编辑:程序博客网 时间:2024/06/06 10:54
  1. kafka一个topic会有多个partition,那么生产者怎么确定发送到哪个partition,消费者又怎么确认收取的是哪一个partition的数据呢?

    要想探究这个问题,我们首先需要确定topic是什么? topic是用户设定的基于某一类型的消息的抽象。那么用户确定下来消息的topic之后,我们需要完成的是对该topic下的消息进行消费。所以就是说一个topic代表的是一个消息的集合,那么partition就是该topic消息的分段了!

    为什么需要partition呢?
    其实一个topic可以满足消息的发送订阅,那么partition的原因就在于消除单个topic的负载了,想想如果topic里面的信息数目很多怎么办,实际工作中1G,10G甚至可能更高。如果有多个partition的话,我们就可以将topic的消息分段存储。此外,对于一个partition会有一个消费者,那么可以实现单个topic消息数据的均衡负载!

    消息发送的partition区分
    一个topic可以指定多个partition,在发送过程中我们可以设定选取partition策略,如果不指定则kafka根据partition数据做一个负载均衡(对递增字段取模等方式)

    消息接收的partition区分
    在消息接收过程中,我们无法指定具体的partition进行消费。但是我们可以开启多个线程对同一个topic进行消费,那么对不同的线程我们需要消费至少一个partition,这个是在kafka中协定的。kafka会根据消费者的数目与partition的数目进行分配,通常是range分配。range分配的策略在于,某一范围的partition会被单个消费者消费。另外一种分配方式是roundrobin方式。

    该内容参考:http://m.blog.csdn.net/yu280265067/article/details/69390094

  2. kafka与zookeeper的联系是什么?
    我们先看一张图,zookeeper的存储结构图:

    这里写图片描述

    可以看到在zookeeper中存储的信息有broker,consumer等重要znode信息。可以感知到,每个kafka节点会在zookeeper中注册该机器的配置信息。然后注册完的kafka节点的topic信息会存在topics目录下面。
          根据zookeeper目录列表可以看到,zookeeper存储了kafka集群的所有信息,那么发送和接收消息是怎样的流程呢?
          kafka的发送与接收
          kafka的发送程序会指定broker服务地址,那么消息的发送会直接发送到broker提供的地址中,如果地址是列表,那么则随机选择一个可用的发送。接收到消息的kafka机器会向zookeeper查询拥有该topic下partition决定权(leader)的机器,然后由该leader选择机器存储数据,最终存储数据。
          kafka的接收会指定zookeeper地址,那么接收到消费任务的zookeeper将任务报告给该topic下partition的leader,由该leader指定follower完成数据的获取并返回

原创粉丝点击