Apache Kafka 12个最佳实践


Apache Kafka,也被称为Kafka,是一个企业级的消息传递和流媒体代理系统。Kafka是一项伟大的技术,可用于架构和建立实时数据管道和流媒体应用程序。
我强烈建议架构师们熟悉Kafka生态系统,特别是Kafka集群、代理、主题、分区、消费者、生产者和偏移的概念。

本文将强调我在使用Kafka时学到的12条重要经验:

  • 为了实现消息的并行处理,在一个主题中创建多个分区。这使得多个消费者能够平行地处理消息。在一个消费者组中,每个分区只能被一个消费者消费。因此,如果一个消费者组中有多个消费者,他们可以消费不同分区的消息。因此,如果我们想使消息的消费并行化,就在一个主题中创建多个分区。
  • 每条消息都会传给订阅了某个主题/分区的每个消费者组,但在一个组内,它只传给一个消费者。因此,所有订阅了主题的消费者组都会得到消息,但在一个消费者组内只有一个消费者会得到一个分区的消息。因此,如果你想把消息广播给多个消费者,请给他们分配不同的消费者组。
  • Kafka中消息大小的默认设置是1MB。消息在被传递到Kafka之前可以被压缩。为了在一个主题中存储更多的数据,我们可以在多个服务器上创建多个分区
  • 确保需要发布或消费的消息是可序列化的。要特别注意日期时间和嵌套结构。
  • 使用函数 seek(TopicPartition, long) 来指定新的位置。
  • 如果我们在设计一个应用程序时,消息的顺序很重要,我们希望消息的顺序得到保证,那么在所有的消息中使用相同的Partition Id。原因是,排序保证适用于分区级别。因此,如果你在一个主题中有多个分区,你需要确保你被要求出现的消息有相同的分区ID。所有被推送到一个主题的分区中的消息,如果它们有相同的分区ID,就会被正确排序。
  • 如果我们想在所有的主题中进行全局排序,请使用单个分区的主题。
  • 保持你的日志可管理,并定期监测磁盘空间。
  • 为了设计一个持久的系统,确保在Kafka设置中设置一个高复制系数。Kafka会在多个服务器上复制每个主题的分区的日志。当一个服务器发生故障时,这允许自动故障切换到这些副本,因为在故障的情况下,消息仍然可用。我们可以在每个主题的基础上设置复制因子。另外,我们可以将生产者的批次大小设置为1。这将确保每条消息都保存在磁盘上,而且消息不会被分批刷新。这将影响性能。对于持久和高可用的系统,有高主题复制是很重要的。通常情况下,为了实现可靠的故障转移,建议至少有3个broker服务器。
  • 如果我们想删除旧的消息,可以使用压缩的主题,当新的事件发布到主题时,一个键的旧事件就会被删除。
  • 为了保证Kafka的安全,可以使用TLS客户端证书,对消息进行加密,并添加用户权限。
  • 我们还可以使用Java DSL或Kafka的类似SQL的流语言来创建和处理存储在Kafka中的数据流。