啥为编码规范?
编程规范也就是编写出简洁、可维护、可靠、可测试、高效、可移植的代码,提高产品代码的质量。
规范与规则的区别:
• 规范是业内程序员统一形成的编码习惯,即你不遵循编程规范,但并不会影响你的代码‘跑’起来。
• 但规则不同,一但违反编程的规则,则会直接报错,代码编译也不能通过。
为什么要有规范?
适当的规范和标准绝不是消灭代码内容的创造性、优雅性,而是限制过度个性化, 以一种普遍认可的统一方式一起做事,提升协作效率,降低沟通成本。 代码的字里行间流淌的是软件系统的血液,质量的提升是尽可能少踩坑,杜绝踩重复的坑,切实提升系统稳定性,码出质量。
作用:
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)
代码使用规范
可以写一个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可以用来消费消息时做幂等的判断
在发送,消费的代码中尽量加入一些日志,在后续方便来定位问题,如果生产和消费的频率很高,这里需要注意控制日志输出的大小,
消费方在解析消息体时,尽量用统一的解析方式对string进行解析(不建议拿消息对象直接做业务处理,获取所需字段重新封装对象)文章来源:https://www.toymoban.com/news/detail-654479.html
在生产者发送消息时,建议过滤掉字段值为null的属性,这样可以减少消息体的大小(这里也视业务情况来定)文章来源地址https://www.toymoban.com/news/detail-654479.html
到了这里,关于Kafka开发编码规范的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!