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

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

 

image.png


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

 

一 我对好代码的看法

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压力。

三 我们怎么做的

组件整体设计思路:

 

image.png

 

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

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

master(主节点)职责:

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

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

  • 负责分配实时写入任务sharding到不同的队列;
  • 负责检测当前写入队列的负载情况。

worker(工作节点)职责:

  • 负责实时汇报当前worker(工作节点)的状态,保持心跳;
  • 负责定时消费该worker(工作节点)负责的数据。
伟大的linux大神曾说过,"Talk is cheap,让我看看代码"。

四 我们做了什么

1 整个组件的包结构图

 

image.png

 

2 简洁的代码结构

 

image.png

 

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

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

3 强大的扩展性

 

image.png

 

通过钩子回调方式的设计,方便接入的用户能够快速的注入自己的回调实现方法,进行快速扩展业务能力。

4 线上日志展示截图

日志文件

 

image.png

 

 

image.png

 

master队列分配日志

 

image.png

 

worker数据消费日志

 

image.png

 

writer队列负载检测日志

 

image.png

 

redis消费队列监控大盘

 

image.png

 

五 我们的收益

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

hbase IOPS使用监控

 

image.png

 

hbase CPU使用监控

 

image.png

 

六 我们的展望

  • 独立抽象组件,基于Redis的轻量级分布式均衡消费队列,是一个全自主创新研发出来的,高可用,可扩展的基础组件,目前已经封装成为一个独立的spring-boot-starter,具备高复用性和高扩展性能力。
  • 广阔的使用场景,基于组件灵活的配置,在涉及的分布式任务队列场景时,都可以使用到它,例如任务中心分发等可以做到天然的均衡负载。
  • 拥抱开源,未来希望将组件开源出去。

七 我的一些理解

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

原文链接

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/513553.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

浅析低功耗广域网及在智慧城市中的应用

作者 | 沈建华、冷咏雪根据知名物联网分析机构IoT Analytics预测,到2025年,物联网连接数将达到非物联网连接数的3倍。低功耗广域网(LPWAN)作为物联网连接的核心基础设施,其业务特点是发送数据极小,并且为了维持电池供电设备的长时…

rocketmq怎么保证数据不会重复_RocketMQ保证信息有序性和防止重复

分布式开放消息系统(RocketMQ)的原理与实践分布式消息系统做为实现分布式系统可扩展、可伸缩性的关键组件,须要具备高吞吐量、高可用等特色。而谈到消息系统的设计,就回避不了两个问题:java消息的顺序问题消息的重复问题RocketMQ做为阿里开源…

云效Codeup代码评审中的代码协同

简介: 云效 Codeup 汇集了阿里巴巴最新的代码托管、代码协同技术,希望能够造福更多中国和世界的开发者。 大神说:“Show me the code”,于是就有了代码评审。 “Talk is cheap. Show me the code.” ——Linus Torvalds, founder …

代码安全无忧—云效Codeup代码加密技术发展之路

简介: 从代码服务及代码安全角度出发,看看云效代码加密技术如何解决这一问题 代码数据存在云端,如何保障它的安全? 部分企业管理者对于云端代码托管存在一丝担心:我的代码存在云端服务器,会不会被泄露&…

杀死 Oculus ,Facebook 改名 Meta ,是押注元宇宙还是“金蝉脱壳”?

整理 | 祝涛出品 | CSDN(ID:CSDNnews)美东时间10月28日周四,在名为Facebook Connect的年度大会上,Facebook宣布,Facebook将公司名称更改为“Meta”,这个新名字反映了该公司在社交媒体之外的雄心…

java sdp_[java,SDP] java 7 SDP 技术/Socket Direct Protocol 2

With Java 7 and Sockets Direct Protocol , Java Now does RDMA ( Remote Direct Memory Access)有了 SDP 技术支持之后的 Java 7 已经开始逐步实现 RDMA 技术 (远程内存直接访问)RDMA is Remote Dynamic Memory Accesss -- which is a way of moving application buffers bet…

百信银行基于 Apache Hudi 实时数据湖演进方案

简介: 本文介绍了百信银行实时计算平台的建设情况,实时数据湖构建在 Hudi 上的方案和实践方法,以及实时计算平台集成 Hudi 和使用 Hudi 的方式。 本文介绍了百信银行实时计算平台的建设情况,实时数据湖构建在 Hudi 上的方案和实践…

如何做一场高质量的分享

简介: 每个人在分享前都应该先问自己这么一个问题,我为什么要分享?我觉得分享就一个最纯粹的原因,就是“我有一些知识,是别人不知道的,但对他人会有所帮助,所以我想分享给大家”。 作者 | 阿相 …

RTE2021,实时互动技术的进化与蝶变

10 月 22—23 日,由声网 Agora 主办的 RTE2021 实时互联网大会在北京圆满落幕。大会以“万象频道”为主题,带来了 20 余场实时互联网全生态线下论坛及活动、近百场的精彩演讲分享,覆盖技术开发、行业观察、创业投资、趋势洞察等多维度话题。同…

Java编程技巧之单元测试用例编写流程

简介: 立足于“如何来编写单元测试用例”,让大家“有章可循”,快速编写出单元测试用例。 作者 | 常意 来源 | 阿里技术公众号 温馨提示:本文较长,同学们可收藏后再看 :)前言 清代杰出思想家章学诚有一句名言&#xff…

KubeVela + KEDA:为应用带来“与生俱来”的弹性伸缩能力

简介: 在这篇博文中,我们将简要解释需要考虑的领域,KEDA 如何使应用自动伸缩变得简单,以及为什么阿里云企业分布式应用服务(EDAS)在 KEDA 上完全标准化。 联合作者 | Yan Xun,阿里云 EDAS 团队…

mysql行转列函数_一个小知识点-Hive行转列实现Pivot

前言传统关系型数据库中,无论是Oracle(11g之后)还是SQLserver(2005之后),都自带了Pivot函数实现行转列功能,本文主要讲述在Hive中实现行转列的两种方式。传统数据库方式这种方式是借鉴在Oracle或者SQLserver在支持Pivot函数之前实现行转列的方…

安全之心:一文读懂可信计算

简介: 信 or 不信,这是个问题 可信计算 TC (Trusted Computing) 业界新宠,越来越被高频提到 本质是创造可信执行环境的芯片级安全防护方案 然而,江湖流传 TA 的传说 却鲜少有人见过真身 阿里云作为亚太区最…

国内顶级AI赛事再启程,第三届“中国人工智能大赛”聚焦算法治理、深度伪造与网络安全

本届大赛赛题分为算法治理、深度伪造和网络安全三大方向的七大赛题,分别是:过滤算法鲁棒性、深度伪造视频检测、深度伪造视频生成方法识别、基于人工智能的音视频合成比赛、说话人无关的音频深度伪造检测识别、说话人相关的音频深度伪造检测识别、Webshe…

看阿里云如何用云上技术创新,帮助哈啰单车实现智能数据收治

简介: 客户通过把日志数据迁移到SLS,替代原有的kafka、ES、ClickHouse,累积节省成本达到30%,同时满足了稳定性、扩展性需求,以及对日志查询分析的需求。 更多存储标杆案例 欢迎点击下方链接查看 阿里云存储标杆案例样…

快进键启动,一文带你了解云原生时代容器安全

简介: 分享阿里云容器安全的治理能力与经验,致力保护生产环境安全。 都说国内需求离容器化还远,更谈不上关注安全,喊的热闹而落地困难。但总得有些声音面向未来向前看。 在2020年Forrester IaaS安全评测中,阿里云容器…

Serverless:这真的是未来吗?(一)

简介: 希望这些博客文章能帮助您在所有相关人员中展开讨论,就最佳业务方案达成一致。该课程可能涉及无服务器,也可能不涉及。在这第一篇文章中,我们将考虑在讨论无服务器时最常见的几个问题。在第二篇文章中,我们将研究…

无限级分类限定层级_王者荣耀:s20战令该不该买?战令限定星元皮肤实测真香...

王者荣耀:s20战令该不该买?战令限定星元皮肤实测真香Hello大家好,我是游戏鲪,很高兴见到大家。如今这个赛季的战令系统早已结束,新赛季也即将到来。许多小伙伴都在憧憬下个赛季的战令。关于s20赛季的战令奖励&#xff…

光进铜退下的“更高”与“更低”,锐捷发布企业极简以太全光网解决方案

全新一代企业网络建设中,以太全光网将满足高带宽、简运维、降成本的要求。 头图 | 付费下载于视觉中国 出品 | CSDN云计算 近日,锐捷网络正式对外发布企业极简以太全光网解决方案。方案针对仓储物流、电子信息、工业制造、地产酒店等在行业客户在园区网…

物联网海量时序数据存储有哪些挑战?

简介: 随着 IoT 技术的快速发展,物联网设备产生的数据呈爆炸式增长,数据的总量(Volume)、数据类型越来越多(Variety)、访问速度要求越来越快(Velocity)、对数据价值&…