今天我給大家介紹下我使用Go語言做過的一些編程實(shí)踐
golog
代碼在:https://github.com/goinbox/golog
無論我們做什么開發(fā)匪蟀,log都是個(gè)強(qiáng)需求,所以先給大家介紹下我開發(fā)的golog
首先看下里面最重要的幾個(gè)數(shù)據(jù)結(jié)構(gòu)間的關(guān)系:
- writer
對底層寫操作的封裝宰僧,寫的對象可以是文件材彪、隊(duì)列、ES等,當(dāng)前提供如下writer實(shí)現(xiàn):
- FileWriter寫文件
- FileWithSplitWriter寫文件段化,可自動(dòng)按照天嘁捷、小時(shí)為單位分文件寫入
- ConsoleWriter寫終端
- buffer
對寫操作加buffer提升寫性能,實(shí)現(xiàn)時(shí)有如下要點(diǎn):
- 實(shí)現(xiàn)為writer的裝飾者
- 提供單獨(dú)的goroutine做autoflush
- formater
formater是將要記錄的log內(nèi)容發(fā)往writer之前做一次格式化显熏,例如添加統(tǒng)一的log日期雄嚣、終端輸出添加顏色等,當(dāng)前有如下實(shí)現(xiàn):
- simpleFormater在消息前面加上loglevel和時(shí)間
- webFormater在simpleFormater的基礎(chǔ)上添加clientIp和logId
- consoleFormater為終端輸出添加顏色
- logger
這個(gè)是程序中記錄log要使用到的對象喘蟆,當(dāng)前提供了simpleLogger這個(gè)實(shí)現(xiàn)缓升,是一種同步的方式(寫操作阻塞程序執(zhí)行)
- async
將寫入操作放到單獨(dú)的goroutine中從而提升程序性能,實(shí)現(xiàn)要點(diǎn)如下:
- asyncLogger實(shí)現(xiàn)為對logger的裝飾者
- 提供單獨(dú)的goroutine做寫操作
更詳細(xì)的使用履肃,可以參考:http://www.reibang.com/p/20d0f74c3c08
shardmap
代碼在:https://github.com/goinbox/shardmap
go中的原生map在多個(gè)goroutine同時(shí)讀寫時(shí)是需要加鎖的仔沿,為了提升性能,核心思想是減少鎖粒度尺棋,shardmap就是這樣開發(fā)的:
go1.8之后的官方包中提供了sync.Map用于解決map的并發(fā)讀寫問題封锉,但我自己測試沒有shardmap性能好,讀者有興趣可以自己試下膘螟。
更詳細(xì)的使用成福,可以參考:http://www.reibang.com/p/090e00f12b3e
redis
代碼在:https://github.com/goinbox/redis
redis可用的包很多,我自己實(shí)現(xiàn)的這個(gè)包荆残,底層driver部分使用了redigo奴艾,考慮到實(shí)際的生產(chǎn)環(huán)境使用,我自行實(shí)現(xiàn)了如下機(jī)制:
- 懶加載機(jī)制内斯,即只有真正和redis做交互時(shí)才創(chuàng)建網(wǎng)絡(luò)連接
- 操作失敗自動(dòng)重連機(jī)制
- 提供連接池以提高性能
- pipeling封裝
- 事物封裝
更詳細(xì)的使用蕴潦,可以參考:http://www.reibang.com/p/fb498f30dff2
goconsumer
代碼在:https://github.com/goinbox/goconsumer
對異步隊(duì)列的使用目前在開發(fā)中也是必不可少的,這里提供了一個(gè)消費(fèi)處理框架俘闯,目前支持:
- 消息非順序消費(fèi)
- 消息順序消費(fèi)
整體處理框架如圖:
里面的對象關(guān)系如下:
- consumer
從各種隊(duì)列中做消費(fèi)的對象潭苞,例如kafka、nsq等
- dispatcher
分配消息到worker中處理真朗,可以在這里實(shí)現(xiàn)自己的分配算法達(dá)到順序消費(fèi)的目的此疹,當(dāng)前提供下面兩種實(shí)現(xiàn):
- simpleDispatcher,這個(gè)做消息的隨機(jī)分發(fā)遮婶,無需順序的消費(fèi)均可以使用
- specifyDispatcher蝗碎,自己指定消息的分發(fā)方法,需要順序消費(fèi)等特殊消費(fèi)需求可以使用
- worker
消息處理對象旗扑,干實(shí)際業(yè)務(wù)工作的蹦骑。
- task
啟動(dòng)一個(gè)消費(fèi)任務(wù)框架,執(zhí)行的入口肩豁,我在task_test.go中有個(gè)demo實(shí)現(xiàn)脊串,可供大家參考辫呻。