使用spring-kafka,每次要写kafka生产者和消费者代码的时候,需要注意的点有哪些

标题使用spring-kafka,每次要写kafka生产者和消费者代码的时候,需要注意的点有哪些

因为kafka配置繁杂,使用的时候需要注意点也比较多,所以整理了一下在我们编写代码的时候需要注意的点,以便每次编写消费端或者生产端的时候,直接可以借鉴。

生产者

1.确认topic是否已经通过命令或者kafka manager这样的工具创建,如果没有创建可以用程序自动创建。创建topic有个关键点就是broker数的确定,分区数最好是broker数量的整数倍;如果预测未来的消息量也并不大,那么和分区数一致即可。如果预测未来的量比较大,那么可以把分区数提前设置大一点,比如broker为3,分区数就可以是6或者9。
2.注意kafka.producer.acks这个关键配置,要万无一失就配all,要速度快一点就配1(leader成功就返回),0肯定不能配(不进行消息接收是否成功的确认)。
3.发送失败后是否需要把消息降级插入数据库,或者就打印一个固定格式的失败日志到log,后续从数据库表或者日志中取出来手动处理。

消费者

1.消费者先确定配置文件的一些关键参数的配置
1)enable-auto-commit:是自动提交偏移量还是手动提交,如果消息是可以容忍在服务器挂掉后消息就丢失的情况那么可以直接使用自动提交;否则使用手动提交。
2)max-poll-records:批量拉取一次拉取最大数据量,默认是500;如果消息的处理速度非常慢,那么一次拉取的数量要改小点,否则一次拉取消息处理总时长超过了max.poll.interval.ms的时长(默认5分钟),kafka认为这个消费者可能已经挂了,这个分区的数据这个消费者已经无法消费了,那么就进行rebalance把这个分区分给其他消费者消费吧。其他消费又可能从上次的偏移量开始拉取,会重复消费。
3)spirng.kafka.listener.concurrency: 这个代表要启动多少个消费者来消费。比如设置为3,那么就会对一个topic启动3个线程来消费,也就是1个后端服务启动了3个消费者。而1个消费者只能消费1个分区,那么如果topic的分区数是6,如果启动了2个后端服务,每个服务有3个消费者,那么就有6个消费者,1个消费者对应1个分区,这样的消费速度就是最快的。最佳实践:通常kafka的broker都是3,去客户部署的后端服务一般是2台,那么topic的分区数就可以设置为6,concurrency设置为3,1个分区对应1个消费者;这样的好处是后面消息量大了,还可以增加后端服务,比如增加一个变为3个后端服务,concurrency改为2,1个服务只消费2个分区肯定比之前1个服务消费3个分区更快,所以一开始分区数不能太小。当然,消息量不大,那么topic=3,concurrency=1,那么其中1台消费1个分区,1台消费2个分区,也没有啥大问题。
4)还有几个配置一般都比较固定,比如spirng.kafka.listener.ack-mode:MANUAL_IMMEDIATE (每处理完业务手动调用Acknowledgment.acknowledge()后立即提交) ,spirng.kafka.listener.type:batch(批量拉取消息并消费),就不用多说了
2.代码中需要注意的事项
1)批量拉取的消息都消费成功,才提交一次偏移量;如果消费失败,根据业务需要可以进行重试(比如使用guava的retry),重试N次还是失败,就直接记录到日志或者入库,待后续手动处理,比如又从库里面查出来重新放回消息队列。
2)注意幂等性处理,因为kafka有多种原因可能导致重复消费,那么业务上如果不能接受重复消费消息,那么就要注意幂等性问题处理,比如根据消息的唯一id去查去重表或某个业务表,存在了就跳过这条消息。伪代码:可以把这批数据的id全部取出来 ids,执行select id from t where id in (ids),就查出来了已存在的id,把这批数据中和这些id一样的剔除掉,剩下的需要处理的数据了。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值