乐趣区

关于代码质量:好代码实践基于Redis的轻量级分布式均衡消费队列

简介:好代码,给人第一个印象的感觉,就像一篇好文章一样,读起来朗朗上口。不同的文章有不同的格调体裁,不同的代码也有不同的编程格调要求。Python 有严格的缩进,像诗歌一样工整对仗;C 语言面向过程像散文一样形散神聚,意境高深;Java 语言面向对象又像是写小说一样,能勾画出一个一个人物形象。然而无论哪一种文章体裁,他的可读性和可了解性都十分重要,只有文章是可读的可了解的,才会吸引更多的读者去读它,让他流传下去,代码也一样,它的可维护性和可读性也十分重要,保障代码可用性,进步代码的简洁水平和可保护水平,能力让咱们的代码在计算机上跑的更远,更久。

作者 | 玄翰
起源 | 阿里技术公众号

一 我对好代码的认识

1 什么是好代码

如果你读过《设计模式之美》,你可能会感觉玩转各种设计模式,合乎设计模式的 6 大根本准则的代码就是好代码;如果读过《clean code》,你可能会感觉好代码的一个规范——整洁;如果你常常研读 spring 源码,你可能会感觉精妙的设计、高度的形象,灵便的配置才是好代码;就像是一本书,一千个读者一千个哈姆雷特,每个人依照本人的认知都会有本人的判断。

2 我认为的好代码

如前文所述,不同的人对好代码的认知规范是不同的,我认为的好代码,也局限于我的认知程度,兴许明天我感觉是好代码,随着认知的晋升,改天也会有不同的想法;就目前的认知而言,我认为的好代码的一些特点:

可用性

对,你没看错,好代码,肯定是可用的,能够 work 的,如果一段代码只是看着难看,用了各种花里胡哨的编码技巧、手法,然而不能 work,那就失去了它存在的意义了。所以,好代码,最最最重要的一个特点就是可用性。

可读性

我认为好代码的第二个特点就是可读性,咱们的写代码的指标用户有两类,第一类是给编译器看的;第二类是给保护它的程序员看的。针对第一类用户,只有你合乎它的语法标准,它就意识,它就能够执行;而第二类用户,就是前期一直的保护它、降级它的程序员同学,如果这段代码,保护它的人都读不懂,那他的长期存在的意义也就不大了。

其余优良的特点

可维护性、可扩展性、可复用性、强鲁棒性、可测试性等。

好代码的其余优良特点太多了,不一一列举了。

3 让 code 在计算机上起舞

回到本源,咱们写代码的是干嘛?为的是把咱们的所思所想通过计算机意识的指令通知它,让它来替咱们做咱们想做的事件。好代码,不仅能够简略的实现咱们所思所想,更可能疾速、高效、齐备的执行。让咱们的 code 一起在计算机上起舞吧。

二 咱们为什么要做

2020 年五一期间,当大家都在享受五一假期的高兴时光时,咱们忽然收到 hbase 报警,整个 hbase 的 IO 压力曾经靠近瓶颈,间接影响数据读写,长期扩容 hbase 才勉强撑持过来。依照这个发展趋势,一旦遇到业务顶峰时,hbase 的读写间接会给整个业务链路带来瓶颈问题。为了可能解决海量巴枪数据实时写入 hbase+solr 时产生的高 IO 压力,咱们设计出一款基于 redis 实现的轻量级分布式平衡生产队列,实现巴枪数据依照肯定规定进行 sharding 到不同的队列中,实现批量数据攒批去重,而后按批写入 hbase+solr,从而升高 hbase+solr 的 IO 压力。

三 咱们怎么做的

组件整体设计思路:

整个组件次要分为三大外围模块,master(主节点)、writer(数据写入节点)、worker(工作节点)。

设计机制:弱核心机制,任何一个配置好的节点都可能成为 master(主节点)、writer(数据写入节点)、worker(工作节点),具备高可用能力,不存在单机单点瓶颈问题。

master(主节点)职责:

  • 负责实时探活 worker(工作节点)是否有变动,掉线状况;
  • 负责分配任务队列到存活的 worker(工作节点);
  • 负责实时检测整个 redis 队列的负载状况。

writer(数据写入节点)职责:

  • 负责调配实时写入工作 sharding 到不同的队列;
  • 负责检测以后写入队列的负载状况。

worker(工作节点)职责:

  • 负责实时汇报以后 worker(工作节点)的状态,放弃心跳;
  • 负责定时生产该 worker(工作节点)负责的数据。

平凡的 linux 大神曾说过,”Talk is cheap,让我看看代码 ”。

四 咱们做了什么

1 整个组件的包结构图

2 简洁的代码构造

  • 清晰的正文,介绍类的作用和职责
  • 启动项配置,灵便的配置,管制模块是否启动。
  • lambda-logger/lambda 表达式,通过简洁语法结构,轻量化代码冗余,进步代码简洁度。
  • 断言判断,替换传统的 if-else 判断,进步代码的可读性。

整个工程一共 60 个类,外围代码共 1623 行,均匀每个类的代码行数为 27.05 行,最大的一个类代码行数不超过 200 行。

3 弱小的扩展性

通过钩子回调形式的设计,不便接入的用户可能疾速的注入本人的回调实现办法,进行疾速扩大业务能力。

4 线上日志展现截图
日志文件

master 队列调配日志

worker 数据生产日志

writer 队列负载检测日志

redis 生产队列监控大盘

五 咱们的收益

组件部署上线之时,hbase 服务端监控指标变动,实现 hbase 整体应用水位靠近 50% 的优化。

hbase IOPS 应用监控

hbase CPU 应用监控

六 咱们的瞻望

  • 独立形象组件,基于 Redis 的轻量级分布式平衡生产队列,是一个全自主翻新研发进去的,高可用,可扩大的根底组件,目前曾经封装成为一个独立的 spring-boot-starter,具备高复用性和高扩展性能力。
  • 广大的应用场景,基于组件灵便的配置,在波及的分布式工作队列场景时,都能够应用到它,例如工作核心散发等能够做到人造的平衡负载。
  • 拥抱开源,将来心愿将组件开源进来。

七 我的一些了解

好代码,给人第一个印象的感觉,就像一篇好文章一样,读起来朗朗上口。不同的文章有不同的格调体裁,不同的代码也有不同的编程格调要求。Python 有严格的缩进,像诗歌一样工整对仗;C 语言面向过程像散文一样形散神聚,意境高深;Java 语言面向对象又像是写小说一样,能勾画出一个一个人物形象。然而无论哪一种文章体裁,他的可读性和可了解性都十分重要,只有文章是可读的可了解的,才会吸引更多的读者去读它,让他流传下去,代码也一样,它的可维护性和可读性也十分重要,保障代码可用性,进步代码的简洁水平和可保护水平,能力让咱们的代码在计算机上跑的更远,更久。

原文链接
本文为阿里云原创内容,未经容许不得转载。

退出移动版