Kafka开发编码规范

啥为编码规范?

编程规范也就是编写出简洁、可维护、可靠、可测试、高效、可移植的代码,提高产品代码的质量。

规范与规则的区别:

• 规范是业内程序员统一形成的编码习惯,即你不遵循编程规范,但并不会影响你的代码‘跑’起来。

• 但规则不同,一但违反编程的规则,则会直接报错,代码编译也不能通过。

为什么要有规范?

适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化, 以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。 代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。

作用:

1. 减少排查问题的难度;

2. 方便团队成员之间能够相互backup,并能够快速上手并解决问题;

3. 统一的代码实现方式方便后续项目维护难度;

4. 减少漏洞代码不易被黑客攻击等;

kafka topic使用规范

命名规则: 比如,我们给kafka的topic命名为user_r2p10,表示user这个topic的副本因子(r)是2,分区数(p)是10。 这样后期在写消费者代码的时候,根据topic名称就知道分区有多少个,可以很方便的设置多少个消费者线程。

假如从业务层面考虑,如果是微服务并且拆了领域,命名可以是域-业务-操作,eg: order-stock-update, 全部小写,禁止使用大写,以横杠作为占位符并控制个数在3个内。

partition:这个可以根据服务部署的情况来定,可以设置partition的个数和consumer个数相等,但consumer的个数不要大于partition的个数,否则过多的consumer导致资源浪费,当topic存在大量的写入时,可以增大partition,利用多个consumer或多线程来提升消费的速度。

replica: 2-3个合适,过多会增加网络IO传输。

保留天数:可以默认设置72小时,对于写入量比较大的topic建议保留24小时,甚至够短(主要取决于磁盘大小)。

所在集群:如有多个集群建议相同业务使用同一个集群。

高峰期每秒写入量:预估一天中高峰期写入量,主要用来评估一个新业务上线后,在高峰阶段给kafka所造成压力所带来不可预知的问题。

消息体大小:最大不超过1MB,单条消息控制在10KB以内,10KB以内的性能测试指标最优。

存储空间:在保留天数内,预估总共占用的空间,单位G

producer:生产者所在的服务

consumer:消费所在的服务|对应的消费组id

状态:正常使用,已废弃

描述:简单描述topic的用途及业务场景

以上信息在实际工作中针对每个topic的使用情况希望是能够进行文档落地的,因为我们在使用kafka时,项目周期越长,topic越来越多,到后期topic成了一个黑盒,我不知道topic用在哪些业务场景,有哪些服务在进行消费,哪些topic实际已经不再用了。

Producer使用规范

1) 【强制】消息大小:不能超过1MB

2) 【推荐】acks参数严格保证可靠性可配置为all,保证高吞吐性可配置为1

3) 【推荐】retries参数可结合实际业务调整。注意:这些重试与客户端接收到发送错误时的重试没有什么不同。允许重试将潜在的改变数据的顺序,如果这两个消息记录都是发送到同一个partition,则第一个消息失败第二个发送成功,则第二条消息会比第一条消息出现要早。

producer配置

spring.kafka.producer.acks =1 (当前生产使用值,1为数据安全性和性能的折中方案值)

spring.kafka.producer.compression-type=none (如启用压缩推荐选择lz4可提高系统吞吐)

spring.kafka.producer.retries =0 (配置值如果大于0,请保证consumer的幂等性)

Comsumer使用规范

1) 【强制】确保处理完消息后再做消息commit,避免业务消息处理失败,无法重新拉取处理失败的消息。

2) 【强制】Kafka不能保证消费重复的消息,业务侧需保证消息处理的幂等性。

3) 【强制】auto.commit.enable需设置为false,避免在消息消费失败但因commit而使offset更新而导致消息丢失

4) 【推荐】consumer不能频繁加入和退出group,频繁加入和退出,会导致consumer频繁做rebalance,阻塞消费

5) 【推荐】consumer数量不能超过topic分区数,否则会有consumer拉取不到消息。

consumer配置

spring.kafka.consumer.auto-offset-reset = latest (如enable-auto-commit =false,建议此值配置为earliest,否则可能会出现丢失数据的情况)

spring.kafka.consumer.enable-auto-commit = true ( 建议使用false, 消费者接Acknowledgment入参)

spring.kafka.listener.ack-mode =MANUAL(BATCH为默认值,enable-auto-commit= false, ack-mode建议使用MANUAL)

spring.kafka.consumer.group-id = servicename(服务名)-group(默认group)

代码使用规范

  1. 可以写一个kafka mq的starter,提供一些标准的代码供其他服务使用,比喻kafka的发送,消息体的定义

eg: public <T extends AbstractEvent> void send(final T event)

如上AbstractEvent是消息体的base class,所有发送消息的业务调用send方法传入消息体时都需要extend AbstractEvent,

AbstractEvent包含字段:topic,dateTime,msgId等,msgId可以用来消费消息时做幂等的判断

  1. 在发送,消费的代码中尽量加入一些日志,在后续方便来定位问题,如果生产和消费的频率很高,这里需要注意控制日志输出的大小,

  1. 消费方在解析消息体时,尽量用统一的解析方式对string进行解析(不建议拿消息对象直接做业务处理,获取所需字段重新封装对象)

  1. 在生产者发送消息时,建议过滤掉字段值为null的属性,这样可以减少消息体的大小(这里也视业务情况来定)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

code.song

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值