Kafka初探(五)

124 阅读3分钟

「这是我参与2022首次更文挑战的第15天,活动详情查看:2022首次更文挑战」。

  • 怎么保证kafka的消费有序性 kafka只能保证partition内是有序的,但是partition间的有序是没办法的。 除非你只用一个partion,或者人为的把消息都放在一个partition中,这样肯定是有序的,但是这样就舍弃了分布式的优势,似乎你就不应该选择kafka。

  • 杂记: kafka设计消费者主动去poll队列中的消息。那么消费者怎么确定去哪个broker里那数据呢?通过zookeeper,zookeeper里面有全部broker集群的信息,包括partition,topic有多少个,在哪里。 producer怎么发现集群呢,先去一个broker,如果失败就去重连,访问缓存,获取全部broker,topic信息。 producer发送的所有信息,都要指定要发送到那个topic中。consumer在订阅的时候也要指定要订阅哪个topic消息。 消费者消费以后要到zookeeper中记录offset,发布到哪里了 消费者,只能消费leader kafka是只能消费者消费队列数据的,没有推送的模式 6)Partition:为了实现扩展性,一个非常大的topic可以分布到多个broker(即服务器)上,一个topic可以分为多个partition,每个partition是一个有序的队列。partition中的每条消息都会被分配一个有序的id(offset)。kafka只保证按一个partition中的顺序将消息发给consumer,不保证一个topic的整体(多个partition间)的顺序; 7)Offset:kafka的存储文件都是按照offset.kafka来命名,用offset做名字的好处是方便查找。例如你想找位于2049的位置,只要找到2048.kafka的文件即可。当然the first offset就是00000000000.kafka。

    • 消费者是以consumer group消费者组的方式工作,由一个或者多个消费者组成一个组,共同消费一个topic。
    • consumer采用pull(拉)模式从broker中读取数据。 push(推)模式很难适应消费速率不同的消费者,因为消息发送速率是由broker决定的。它的目标是尽可能以最快速度传递消息,但是这样很容易造成consumer来不及处理消息,典型的表现就是拒绝服务以及网络拥塞。而pull模式则可以根据consumer的消费能力以适当的速率消费消息。 对于Kafka而言,pull模式更合适,它可简化broker的设计,consumer可自主控制消费消息的速率,同时consumer可以自己控制消费方式——即可批量消费也可逐条消费,同时还能选择不同的提交方式从而实现不同的传输语义。 pull模式不足之处是,如果kafka没有数据,消费者可能会陷入循环中,一直等待数据到达。为了避免这种情况,我们在我们的拉请求中有参数,允许消费者请求在等待数据到达的“长轮询”中进行阻塞(并且可选地等待到给定的字节数,以确保大的传输大小)。