kafka使用指南

  1. 消费者消费后偏移量如果是使用自动提交,在两次提交之间如果发生了再平衡,则会造成上次提交后新加入的消息被重复处理。比如自动提交间隔为5秒,在最近一次提交后3秒发生了在平衡,消费者从最后一次提交的位置开始读消息,在这3秒内到达的消息会被重新读取。
  2. 2.消费者在订阅主题时可以使用通配符,当有新的主题被创建时,消费者能自动从新的主题中读取消息。

  3. 在只有一个消费者的情况下,可以直接设置要读取的分区和偏移量,而不用加入到消费者组中,这样可以不受再平衡的影响。代码如下:
  4.          List<PartitionInfo> pinfos = null;
             pinfos = consumer.partitionsFor(topic);
             List<TopicPartition> partitions = new ArrayList<>();
             if (pinfos!=null){
                 for (PartitionInfo pi : pinfos){
                     partitions.add(new TopicPartition(pi.topic(),pi.partition()));
             consumer.assign(partitions);
    

    注意:这种方式和订阅分区不能同时使用,否则会报错。

  5. 不同步分区副本是否可以被选举成为首领,会对系统的可用性和可靠性造成影响。设置参数为unclean.leader.election.enable。该参数为true时,不同步的分区副本成为首领时可能会造成消费者访问数据混乱和丢失部分数据。 设为false时,系统的可用性会受影响,系统必须等待原来发生错误的broker恢复到可用状态。需要针对不同情况进行权衡。

  6. 只发送一次的实现方法。将数据中的唯一键或者kafka的主题+分区+偏移量组成的唯一键保存到一个键值数据库中,每次发送时先检查键值库中是否存在相同的键,如果存在则不用再次发送。这种方法会降低处理性能,只有在严格要求发送一次的情况下才考虑使用。如果消息写入的系统支持事务,可以将消息和偏移量放到一个事务中保存到系统,消费者启动时从系统中读出偏移量,用seek()从该偏移量的位置继续读取消息。

  7. 6.kafka监控工具:推荐使用yahoo的kafka-manager,该工具可以管理多个cluster,对主题和分区的管理可以实现和系统脚本一样的功能,都是在页面上进行操作,比命令行方便。启动脚本中打开JMX端口:export JMX_PORT="9999",这样可以在kafka-manager中通过JMX看到kafka吞吐量情况。