一、概念入门
### --- [kafka高级特性解析]
~~~ [消费者/消费组]
~~~ [心跳机制]
### --- 消费者、消费组
~~~ # 消费者从订阅的主题消费消息,
~~~ 消费消息的偏移量保存在Kafka的名字是__consumer_offsets 的主题中。
~~~ 消费者还可以将自己的偏移量存储到Zookeeper,需要设置offset.storage=zookeeper。
~~~ 推荐使用Kafka存储消费者的偏移量。因为Zookeeper不适合高并发。
~~~ # 多个从同一个主题消费的消费者可以加入到一个消费组中。
~~~ 消费组中的消费者共享group_id。
~~~ configs.put("group.id", "xxx");
~~~ group_id一般设置为应用的逻辑名称。
~~~ 比如多个订单处理程序组成一个消费组,可以设置group_id为"order_process"。
~~~ group_id通过消费者的配置指定: group.id=xxxxx
~~~ # 消费组均衡地给消费者分配分区,每个分区只由消费组中一个消费者消费。
~~~ 一个拥有四个分区的主题,包含一个消费者的消费组。
~~~ 此时,消费组中的消费者消费主题中的所有分区。并且没有重复的可能。
~~~ 如果在消费组中添加一个消费者2,则每个消费者分别从两个分区接收消息。
二、如果消费组有四个消费者,则每个消费者可以分配到一个分区。
三、如果向消费组中添加更多的消费者超过主题分区数量,则有一部分消费者就会闲置,不会接收任何消息。
~~~ 向消费组添加消费者是横向扩展消费能力的主要方式。
~~~ 必要时,需要为主题创建大量分区,在负载增长时可以加入更多的消费者。
~~~ 但是不要让消费者的数量超过主题分区的数量。
~~~ 除了通过增加消费者来横向扩展单个应用的消费能力之外,
~~~ 经常出现多个应用程序从同一个主题消费的情况。
~~~ 此时,每个应用都可以获取到所有的消息。
~~~ 只要保证每个应用都有自己的消费组,就可以让它们获取到主题所有的消息。
~~~ 横向扩展消费者和消费组不会对性能造成负面影响。
~~~ 为每个需要获取一个或多个主题全部消息的应用创建一个消费组,
~~~ 然后向消费组添加消费者来横向扩展消费能力和应用的处理能力,则每个消费者只处理一部分消息。