自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

好代碼實(shí)踐:基于Redis的輕量級(jí)分布式均衡消費(fèi)隊(duì)列

開(kāi)發(fā) 開(kāi)發(fā)工具 存儲(chǔ)軟件 分布式 Redis
回到根源,我們寫(xiě)代碼的目的是干嘛?為的是把我們的所思所想通過(guò)計(jì)算機(jī)認(rèn)識(shí)的指令告訴它,讓它來(lái)替我們做我們想做的事情。好代碼,不僅可以簡(jiǎn)單地完成我們的所思所想,更能夠快速、高效、完備地執(zhí)行。讓我們的code一起在計(jì)算機(jī)上起舞吧。

 [[393103]]

一、我對(duì)好代碼的看法

1.什么是好代碼

如果你讀過(guò)《設(shè)計(jì)模式之美》,你可能會(huì)覺(jué)得玩轉(zhuǎn)各種設(shè)計(jì)模式,符合設(shè)計(jì)模式的6大基本原則的代碼就是好代碼;如果讀過(guò)《clean code》,你可能會(huì)覺(jué)得好代碼的一個(gè)標(biāo)準(zhǔn)是——整潔;如果你經(jīng)常研讀Spring源碼,你可能會(huì)覺(jué)得精妙的設(shè)計(jì)、高度的抽象、靈活的配置才是好代碼,就像是一本書(shū),一千個(gè)讀者眼中有一千個(gè)哈姆雷特,每個(gè)人按照自己的認(rèn)知都會(huì)有自己的判斷。

2.我認(rèn)為的好代碼

如前文所述,不同的人對(duì)好代碼的認(rèn)知標(biāo)準(zhǔn)是不同的,我認(rèn)為的好代碼,也局限于我的認(rèn)知水平,也許今天我覺(jué)得是好代碼,隨著認(rèn)知的提升,改天也會(huì)有不同的想法;就目前的認(rèn)知而言,我認(rèn)為的好代碼的一些特點(diǎn):

可用性

對(duì),你沒(méi)看錯(cuò),好代碼,一定是可用的,可以work的,如果一段代碼只是看著好看,用了各種花里胡哨的編碼技巧、手法,但是不能work,那就失去了它存在的意義了。所以,好代碼,最最最重要的一個(gè)特點(diǎn)就是可用性。

可讀性

我認(rèn)為好代碼的第二個(gè)特點(diǎn)就是可讀性,我們的寫(xiě)代碼的目標(biāo)用戶有兩類(lèi),第一類(lèi)是給編譯器看的;第二類(lèi)是給維護(hù)它的程序員看的。針對(duì)第一類(lèi)用戶,只要你符合它的語(yǔ)法規(guī)范,它就認(rèn)識(shí),它就可以執(zhí)行;而第二類(lèi)用戶,就是后期不斷的維護(hù)它、升級(jí)它的程序員同學(xué),如果這段代碼,維護(hù)它的人都讀不懂,那他的長(zhǎng)期存在的意義也就不大了。

其他優(yōu)秀的特點(diǎn)

可維護(hù)性、可擴(kuò)展性、可復(fù)用性、強(qiáng)魯棒性、可測(cè)試性等。

好代碼的其他優(yōu)秀特點(diǎn)太多了,不一一列舉了。

3.讓code在計(jì)算機(jī)上起舞

回到根源,我們寫(xiě)代碼的目的是干嘛?為的是把我們的所思所想通過(guò)計(jì)算機(jī)認(rèn)識(shí)的指令告訴它,讓它來(lái)替我們做我們想做的事情。好代碼,不僅可以簡(jiǎn)單地完成我們的所思所想,更能夠快速、高效、完備地執(zhí)行。讓我們的code一起在計(jì)算機(jī)上起舞吧。

二、我們?yōu)槭裁匆?/h2>

2020年五一期間,當(dāng)大家都在享受五一假期的快樂(lè)時(shí)光時(shí),我們突然收到hbase報(bào)警,整個(gè)hbase的IO壓力已經(jīng)接近瓶頸,直接影響數(shù)據(jù)讀寫(xiě),臨時(shí)擴(kuò)容hbase才勉強(qiáng)支撐過(guò)去。按照這個(gè)發(fā)展趨勢(shì),一旦遇到業(yè)務(wù)高峰時(shí),hbase的讀寫(xiě)直接會(huì)給整個(gè)業(yè)務(wù)鏈路帶來(lái)瓶頸問(wèn)題。為了能夠解決海量巴槍數(shù)據(jù)實(shí)時(shí)寫(xiě)入hbase+solr時(shí)產(chǎn)生的高IO壓力,我們?cè)O(shè)計(jì)出一款基于redis實(shí)現(xiàn)的輕量級(jí)分布式均衡消費(fèi)隊(duì)列,實(shí)現(xiàn)巴槍數(shù)據(jù)按照一定規(guī)則進(jìn)行sharding到不同的隊(duì)列中,實(shí)現(xiàn)批量數(shù)據(jù)攢批去重,然后按批寫(xiě)入hbase+solr,從而降低hbase+solr的IO壓力。

三、我們?cè)趺醋龅?/h2>

組件整體設(shè)計(jì)思路:

整個(gè)組件主要分為三大核心模塊,master(主節(jié)點(diǎn))、writer(數(shù)據(jù)寫(xiě)入節(jié)點(diǎn))、worker(工作節(jié)點(diǎn))。

設(shè)計(jì)機(jī)制:弱中心機(jī)制,任何一個(gè)配置好的節(jié)點(diǎn)都可能成為master(主節(jié)點(diǎn))、writer(數(shù)據(jù)寫(xiě)入節(jié)點(diǎn))、worker(工作節(jié)點(diǎn)),具備高可用能力,不存在單機(jī)單點(diǎn)瓶頸問(wèn)題。

master(主節(jié)點(diǎn))職責(zé):

  • 負(fù)責(zé)實(shí)時(shí)探活worker(工作節(jié)點(diǎn))是否有變化,掉線情況;
  • 負(fù)責(zé)分配任務(wù)隊(duì)列到存活的worker(工作節(jié)點(diǎn));
  • 負(fù)責(zé)實(shí)時(shí)檢測(cè)整個(gè)redis隊(duì)列的負(fù)載情況。

writer(數(shù)據(jù)寫(xiě)入節(jié)點(diǎn))職責(zé):

  • 負(fù)責(zé)分配實(shí)時(shí)寫(xiě)入任務(wù)sharding到不同的隊(duì)列;
  • 負(fù)責(zé)檢測(cè)當(dāng)前寫(xiě)入隊(duì)列的負(fù)載情況。

worker(工作節(jié)點(diǎn))職責(zé):

  • 負(fù)責(zé)實(shí)時(shí)匯報(bào)當(dāng)前worker(工作節(jié)點(diǎn))的狀態(tài),保持心跳;
  • 負(fù)責(zé)定時(shí)消費(fèi)該worker(工作節(jié)點(diǎn))負(fù)責(zé)的數(shù)據(jù)。

偉大的linux大神曾說(shuō)過(guò),"Talk is cheap,讓我看看代碼"。

四、我們做了什么

1.整個(gè)組件的包結(jié)構(gòu)圖

2.簡(jiǎn)潔的代碼結(jié)構(gòu)

  • 清晰的注釋?zhuān)榻B類(lèi)的作用和職責(zé)
  • 啟動(dòng)項(xiàng)配置,靈活的配置,控制模塊是否啟動(dòng)。
  • lambda-logger/lambda表達(dá)式,通過(guò)簡(jiǎn)潔語(yǔ)法結(jié)構(gòu),輕量化代碼冗余,提高代碼簡(jiǎn)潔度。
  • 斷言判斷,替換傳統(tǒng)的if-else判斷,提高代碼的可讀性。

整個(gè)工程一共60個(gè)類(lèi),核心代碼共1623行, 平均每個(gè)類(lèi)的代碼行數(shù)為27.05行,最大的一個(gè)類(lèi)代碼行數(shù)不超過(guò)200行。

3.強(qiáng)大的擴(kuò)展性

通過(guò)鉤子回調(diào)方式的設(shè)計(jì),方便接入的用戶能夠快速的注入自己的回調(diào)實(shí)現(xiàn)方法,進(jìn)行快速擴(kuò)展業(yè)務(wù)能力。

4.線上日志展示截圖

日志文件

master隊(duì)列分配日志

worker數(shù)據(jù)消費(fèi)日志

writer隊(duì)列負(fù)載檢測(cè)日志

redis消費(fèi)隊(duì)列監(jiān)控大盤(pán)

五、我們的收益

組件部署上線之時(shí),hbase服務(wù)端監(jiān)控指標(biāo)變化,實(shí)現(xiàn)hbase整體使用水位接近50%的優(yōu)化。

hbase IOPS使用監(jiān)控

hbase CPU使用監(jiān)控

六、我們的展望

  • 獨(dú)立抽象組件,基于Redis的輕量級(jí)分布式均衡消費(fèi)隊(duì)列,是一個(gè)全自主創(chuàng)新研發(fā)出來(lái)的,高可用,可擴(kuò)展的基礎(chǔ)組件,目前已經(jīng)封裝成為一個(gè)獨(dú)立的spring-boot-starter,具備高復(fù)用性和高擴(kuò)展性能力。
  • 廣闊的使用場(chǎng)景,基于組件靈活的配置,在涉及的分布式任務(wù)隊(duì)列場(chǎng)景時(shí),都可以使用到它,例如任務(wù)中心分發(fā)等可以做到天然的均衡負(fù)載。
  • 擁抱開(kāi)源,未來(lái)希望將組件開(kāi)源出去。

七、我的一些理解

好代碼,給人第一個(gè)印象的感覺(jué),就像一篇好文章一樣,讀起來(lái)朗朗上口。不同的文章有不同的風(fēng)格體裁,不同的代碼也有不同的編程風(fēng)格要求。Python有嚴(yán)格的縮進(jìn),像詩(shī)歌一樣工整對(duì)仗;C語(yǔ)言面向過(guò)程像散文一樣形散神聚,意境深邃;Java語(yǔ)言面向?qū)ο笥窒袷菍?xiě)小說(shuō)一樣,能勾勒出一個(gè)一個(gè)人物形象。但是無(wú)論哪一種文章體裁,他的可讀性和可理解性都非常重要,只有文章是可讀的可理解的,才會(huì)吸引更多的讀者去讀它,讓他流傳下去,代碼也一樣,它的可維護(hù)性和可讀性也非常重要,保證代碼可用性,提高代碼的簡(jiǎn)潔程度和可維護(hù)程度,才能讓我們的代碼在計(jì)算機(jī)上跑的更遠(yuǎn),更久。

 

責(zé)任編輯:武曉燕 來(lái)源: 阿里技術(shù)
相關(guān)推薦

2015-06-17 14:10:34

Redis分布式系統(tǒng)協(xié)調(diào)

2017-10-11 16:12:19

內(nèi)存

2021-10-30 19:30:23

分布式Celery隊(duì)列

2024-04-29 08:42:23

2014-05-23 10:30:25

負(fù)載均衡分布式架構(gòu)

2014-06-11 09:17:39

負(fù)載均衡

2022-03-08 15:24:23

BitMapRedis數(shù)據(jù)

2023-12-18 10:24:59

2019-06-19 15:40:06

分布式鎖RedisJava

2019-07-17 22:23:01

分布式系統(tǒng)負(fù)載均衡架構(gòu)

2015-07-28 10:14:33

HBasehadoop

2024-06-11 13:50:43

2022-03-01 16:26:09

鏈路監(jiān)控日志監(jiān)控分布式系統(tǒng)

2021-06-03 00:02:43

RedisRedlock算法

2022-03-08 07:22:48

Redis腳本分布式鎖

2021-07-30 00:09:21

Redlock算法Redis

2024-07-16 08:09:32

載均衡技術(shù)Pulsar分布式系統(tǒng)

2015-04-21 09:39:03

javajava分布式爬蟲(chóng)

2017-10-24 11:28:23

Zookeeper分布式鎖架構(gòu)

2018-07-19 11:18:45

餓了么時(shí)序數(shù)據(jù)庫(kù)監(jiān)控系統(tǒng)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)