Kafka使用过程中的一些最佳实践

组内最近一年都在使用Kafka做消息中间件做数据的流式处理,总结一下使用过程的经验教训

1.一些参数值的设定,主要是保证数据的不丢失

  • block.on.buffer.full = true

开启buffer缓存

 

  • acks = all
  • retries = MAX_VALUE

生产者Producer端想kafka发送数据,要想数据不丢失,应该设置以上两个配置

 

  • max.in.flight.requests.per.connection = 1

如果需要严格保证每个partition消息到达的有序性,需要保证每次处理的请求连接为1

 

  • 使用KafkaProducer.send(record, callback)
  • callback逻辑中显式关闭producerclose(0) 

Producer使用回调函数,处理异常情况, 并进行生产者的显式关闭

 

  • unclean.leader.election.enable=false

关闭unclean的leader选举,避免在所有某个partitiond的所有副本都挂了的情况下造成数据丢失

 

  • replication.factor = 3 
  • min.insync.replicas = 2
  • replication.factormin.insync.replicas

对于每个partition都设置为3个副本,同时保证某个时刻处于同步状态的副本数至少为2,ps:这里遇到过生产环境的issue,原因就是当时6台服务器挂了两台,导致某个partition的最小同步副本小于2,producer无法往kafka上发送数据

 

  • enable.auto.commit=false
  • 消息处理完成之后再提交位移

consumer端要在提交offset时,最好采用手动提交的方式,关闭自动提交,对于数据完整性要求很高的业务时,可以采用事务,把consumer的处理数据的逻辑和提交offset的逻辑放在同一个事务当中,避免处理了数据但是没有及时提交offset,consumer如果此时挂了,会造成数据的重复消费,但是引入事务,也会导致并发量下降,所以需要综合考虑业务情况

 

2,遇到kafka数据大量堆积,此时consumer没办法及时消费,这个原因可能是上游发来的速度突然过大或者我们消费者消费速度过慢造成的,对于这个问题,我们组设计了一个可拓展的应急方法

 如图所示,假如之前我们的kafka有3个partition,由于消息大量积压,比如积压了1000万条,我们的消费者无法再短时间内处理完这些数据,那我们可以对消费者端进行修改,不在进项业务逻辑的处理,而是优先将数据在转发到一个有30个partition的topic上,然后开30个consumer线程进程处理,这样会大大增加处理效率

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java Kafka流处理的最佳实践有以下几个方面: 1. 使用Spring Kafka库进行流处理:Spring Kafka提供了与Kafka集成的注解处理器和消费者,使得编写和管理Kafka消费者变得更加简单和方便。通过使用@KafkaListener注解,可以轻松创建和配置Kafka消费者,同时可以通过参数指定消费者组和其他配置选项来实现更高级的功能。 2. 使用Kafka Streams API进行复杂处理:对于更复杂的流处理需求,可以使用Kafka提供的完全集成的Streams API。Streams API允许构建执行非平凡处理的应用程序,如流的聚合和流的连接。使用Streams API可以更灵活地处理和转换数据流,实现更复杂的业务逻辑。 3. 优化Kafka消费者的性能:为了提高Kafka流处理的性能,可以采取一些优化措施。例如,可以使用多线程来并行处理多个数据流,使用批量消费来减少网络开销,设置适当的消费者配置参数来优化消费者的性能等[2]。 4. 处理消息顺序和重复问题:在流处理,消息的顺序和重复问题是需要考虑的重要因素。可以通过使用分区器和键来确保消息按顺序处理,并使用幂等性和事务来处理重复消息,从而解决这些问题。 总结起来,Java Kafka流处理的最佳实践包括使用Spring Kafka库进行简单的流处理,使用Kafka Streams API进行复杂的流处理,优化Kafka消费者的性能,以及处理消息顺序和重复问题。通过遵循这些最佳实践,可以更好地实现和管理Java Kafka流处理应用程序。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [【项目实战】Java 开发 Kafka 消费者](https://blog.csdn.net/qq_37967783/article/details/131715447)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [超详细 kafka 入门(最佳实践)](https://blog.csdn.net/weixin_38405253/article/details/117393362)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值