@Alpacadh
2022-09-18T17:18:48.000000Z
字数 1952
阅读 236
kafka
消息队列中消息的消费模型通常有两种:推送模型(push)和拉取模型(pull)。
kafka 给我们提供了两套 Consumer API,分别是 The high-level Consumer API 和 The SimpleConsumer API。(其中 High-level Consumer API 提供了一个从 Kafka 消费数据的高层抽象,而 SimpleConsumer API 则需要开发人员更多地关注细节。)
High-level Consumer API 提供了 Consumer Group 的语义,一个消息只能被 Group 内的一个 Consumer 所消费,且 Consumer 消费消息时不关注 offset,最后一个 offset 由 Zookeeper 保存。
同时 High-level consumer API 还支持多线程消费,但需要注意:
1)如果消费线程大于 Partition 数量,则有些线程将收不到消息。
2)如果 Partition 数量大于线程数,则有些线程多收到多个 Partition 的消息。
3)如果一个线程消费多个Partition,则无法保证接收消息的顺序,只能保证 Partition 内部有序。
使用 The SimpleConsumer API,你可以对 Partition 有更多的控制权,如多次消费一个消息,只消费 Partition 中部分消息等。
但是使用此 API 时,Partition、Offset、Broker、Leader 等不再透明,需要业务去处理:
1)必须在应用程序中跟踪 Offset,从而确定下一条应该消费哪条消息。
2)应用程序需要通过程序获知每个 Partition 的 Leader,同时还需要处理 Leader 的变更。
如果将 Consumer 设置为 autocommit,Consumer 一旦读到数据立即自动 commit,但此处只考虑到了读取消息的过程,那 Kafka 确保了 Exactly once。但实际使用中 Consumer 还要对读取到的消息做进一步处理: