kafka关键点

如何保证消息队列的高可用?

replica(复制品)副本机制。每个 partition 的数据都会同步到其它机器上,形成自己的多个 replica 副本。broker宕机,存在leader partition ,则会从其他broker上该partition
 的follower 中,选举leader。

如何保证消息不被重复消费?或者说,如何保证消息消费的幂等性?

Kafka 使用offset记录消息者消费记录,消费者来保证幂等性

  • 写db时,用主键查,存在则更新;使用唯一约束
  • 写redis时,不用处理,天然幂等性
  • 其他使用全局唯一的 id

需要为每个Consumer 指定一个Consumer Group,不同Group可读取相同消息;同一group内不同consumer 互斥,不会消费相同的消息,consumer 相关信息也在zk中维护

broker.id 用来唯一标识每一个 broker,每个broker都有一个唯一的id值用来区分彼此。Kafka在启动时会在zookeeper中/brokers/ids路径下创建一个与当前broker的id为名称的虚节点,Kafka的健康状态检查就依赖于此节点。

bootstrap-servers指的是目标集群的服务器地址,这个和broker-list功能是一样的,只不过我们在console producer要求用后者

0.8以前的kafka,消费的进度(offset)是写在zk中的,所以consumer需要知道zk的地址。后来的版本都统一由broker管理,所以就用bootstrap-server了。

不会丢数据

default.replication.factor=2 (副本数量,要求大于1)

producer.type = sync (同步模式,sync:同步,异步:async)

min.insync.replicas=2 ()

broker.rack

request.required.acks=1(值可设为 0, 1, -1/all, 其中 -1 和 all 等同) producer 发消息到broker

调用read函数,文件数据copy到内核缓冲区

为了提高性能,每个Follower在接收到数据后就立马向Leader发送ACK,而非等到数据写入Log中。因此,对于已经commit的消息,Kafka只能保证它被存于多个Replica的内存中,而不能保证它们被持久化到磁盘中,也就不能完全保证异常发生后该条消息一定能被Consumer消费