1. 一些主要概念

  1. Broker,kafka集群中每台服务器就是一个broker

  2. 一个partition(分区)代表了一个物理上存在的队列.topic只是一组partition(分区)的总称,也就是说topic仅是逻辑上的概念。一个topic可以创建多个分区,和是否只有一台broker无关。一个partition会由一个broker来负责,一个broker可以负责很多个partition。

  3. 副本replica,一个partition可以有多个副本,当有多个副本时,每个partition会选举出主replica。副本数不能大于集群broker的数量。

  4. 一个Consumer(消费者)的”一个线程”在某个时刻只能接收一个partition(分区)的数据(串行地收),但是一个消费者是可以接收多个分区的数据,一个partition(分区)某个时刻也只会把消息发给一个Consumer(消费者)。这也就意味着必须有多partition才能加大消费者的处理效率。

  5. 每一个消息在一个 partition 上将会有唯一的一个Offset

  6. Consumer Group(消费者分组),对于一个topic中的一条消息,只会被同一个消费者分组中的任意一个消费者消费到。

2. 一些常见配置

关于kafka消息存储时间

kafka持久化消息的时间
是靠log.retention.ms 来指定的,默认168小时,即7天

每个topic可以单独设置消息过期时间,这个168小时是topic的默认值,实际上每个topic都可以单独设置。其它相关设置:https://www.cnblogs.com/angellst/p/9368493.html

kafka也可以永久存储消息,相关案例:https://blog.csdn.net/kozazyh/article/details/79444762

关于kafka消息的可靠性

关于丢消息的避免方案:https://blog.csdn.net/z69183787/article/details/79895721

3. 常见问题

关于出现
WARN [Producer clientId=console-producer] Error while fetching metadata with correlation id 5 : {mytopic=LEADER_NOT_AVAILABLE} (org.apache.kafka.clients.NetworkClient)

这个问题在容器集群环境下出现的概率还挺高的。

目前看起来kafka变更部分参数(例如brokerid变了但是ip端口没变)部署之后,zookeeper可能也要跟着重启(也出现过不用重启就正常的,但是大概率是不正常的),然后再重启kafka,不然会出现这个问题。

那实际上就是要重启下zookeeper就可以了

确定是没问题的情况:

  1. 不改变参数的情况下,重启kafka没有问题(这个实验的kafka未持久化数据)
  2. 不改变参数的情况下,重启zookeeper没有问题(这个实验的zk未持久化数据)
  3. 和zookeeper是否暴露了hostPort没有关系
  4. 当kafka正常启动之后,把zookeeper删除了,居然没有问题,还可以正常发送
  5. 和我封装的zookeeper helm方式部署没有关系,和zookeeper服务叫zookeeper-single也没有关系

出现没有事先创建TOPIC时,消息发不出的问题

默认情况下,kafka是开启了自动创建topic的功能,从kafka的启动日志可以看到:

auto.create.topics.enable = true 

出现过一次没有事先创建topic发不出消息,后来重启了一下kafka消息就又可以了,具体原因还没找到。

4. Java客户端编程:生产者和消费者

详见:https://code.pugwoo.com/learning/kafka-demo

参考博客

  1. Kafka : Kafka入门教程和JAVA客户端使用
文档更新时间: 2020-04-01 09:59   作者:nick