spring cloud stream kafka 批量消费消息

1,172 阅读2分钟

最近业务上遇到一个问题,需要异步消费消息,避免频繁的去操作数据库。之前也是用 strem kafka 进行消费。但是没有做到批量处理。所以现在需要批量去消费消息

配置

spring:
  cloud:
    stream:
      kafka:
        binder:
          auto-create-topics: true  
          brokers: xxxxxxxx:xxxx
          consumer-properties:
            max:
              poll:
                records: 1000
            fetch:
              min:
                bytes: 20480
              max:
                wait:
                  ms: 20000
      bindings:
        homeworkSocial-out-0:
          destination: homeworkTopic
          contentType: application/json
        homeworkSocial-in-0:
          destination: homeworkTopic
          group: homework 
          consumer:
            batch-mode: true
      function:
        definition: homeworkSocial  

可以看到上面。

fetch.min.bytes

该属性指定了消费者从服务器获取记录的最小字节数。broker 在收到消费者的数据请求时,如果可用的数据量小于 fetch.min.bytes 指定的大小,那么它会等到有足够的可用数据时才把它返回给消费者。这样可以降低消费者和 broker 的工作负载,因为它们在主题不是很活跃的时候(或者一天里的低谷时段)就不需要来来回回地处理消息。如果没有很多可用数据,但消费者的 CPU 使用率却很高,那么就需要把该属性的值设得比默认值大。如果消费者的数量比较多,把该属性的值设置得大一点可以降低 broker 的工作负载。

fetch.max.wait.ms

我们通过 fetch.min.bytes 告诉 Kafka,等到有足够的数据时才把它返回给消费者。而 feth.max.wait.ms 则用于指定 broker 的等待时间,默认是 500ms。

如果没有足够的数据流入 Kafka,消费者获取最小数据量的要求就得不到满足,最终导致 500ms 的延迟。如果要降低潜在的延迟(为了满足 SLA),可以把该参数值设置得小一些。如果 fetch.max.wait.ms 被设为 100ms,并且 fetch.min.bytes 被设为 1MB,那么 Kafka 在收到消费者的请求后,要么返回 1MB 数据,要么在 100ms 后返回所有可用的数据,就看哪个条件先得到满足。

如上面设置的为20s消费一次。测试是正常的。但是如果修改为更长的时间 (大于30s) 貌似不起作用了。目前来说 20s 就足够了。就没有继续查找原因

consumer.batch-mode

从Spring Cloud 3.0开始,可以设置spring.cloud.stream.binding..consumer.batch-mode=true,这样KafkaConsumer.poll回来的批量消息被封装进List<?>中. 详情见: cloud.spring.io/spring-clou…

消费代码

	@Bean
	public Consumer<List<String>> homeworkSocial() {
		// 方法名必须与配置中 function.definition 一致
		return message -> {
			//todo
		};
	}