分区和流之间的 Apache Kafka 关系

Apache Kafka relation between partition and stream

  1. 主题的分区和可以使用Java api创建的流之间的关系是什么?

  2. API 喜欢

    背后的基本原理是什么
     Map<String, List<KafkaStream<byte[], byte[]>>>  consumerMap = _consumerConnector.createMessageStreams(topicVsPartitionCountMap);
    

    而不是简单地拥有它

    List<KafkaStream<byte[], byte[]>> consumerStreams = _consumerConnector.createMessageStreams(partitionCountForTopic);
    
  1. 它实际上不是 topicName 到 partitionCount 的映射,而是 到你想要的流的数量。每个流提供一个 无限迭代器,因此按预期用途消耗一个线程 (你总是可以在一个线程上组合两个,但你也可以 创建较少的流开始)。

    与分区的关系是一个分区总是 向同一个流提供数据。因此,在那之内 stream/thread 您将获得与现在相同的订购保证 在您的 kafka 分区中建模。所以,如果事件 A 发生在 分区 X 中的事件 B,并且分区 X 和分区 Y 都流 到流 1,那么,事件 A 保证在之前被处理 如果按顺序处理流 1,则事件 B。

  2. 我认为这只是他们选择的设计决策(它们本质上是相同的,两者都可以实现相同的效果)。我唯一能想到的另一件事是每次对 createMessageStreams 的调用都会到达 ZooKeeper 和 Kafka 设置流不管有多少 您获取的流,因此当您 在同一个调用中获取多个。