今天我給大家介紹下我使用Go語言做過的一些編程實(shí)踐
golog
代碼在:https://github.com/goinbox/golog
無論我們做什么開發(fā),log都是個強(qiáng)需求,所以先給大家介紹下我開發(fā)的golog
首先看下里面最重要的幾個數(shù)據(jù)結(jié)構(gòu)間的關(guān)系:

- writer
對底層寫操作的封裝,寫的對象可以是文件、隊(duì)列、ES等,當(dāng)前提供如下writer實(shí)現(xiàn):
- FileWriter寫文件
- FileWithSplitWriter寫文件,可自動按照天、小時為單位分文件寫入
- ConsoleWriter寫終端
- buffer
對寫操作加buffer提升寫性能,實(shí)現(xiàn)時有如下要點(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和時間
- webFormater在simpleFormater的基礎(chǔ)上添加clientIp和logId
- consoleFormater為終端輸出添加顏色
- logger
這個是程序中記錄log要使用到的對象,當(dāng)前提供了simpleLogger這個實(shí)現(xiàn),是一種同步的方式(寫操作阻塞程序執(zhí)行)
- async
將寫入操作放到單獨(dú)的goroutine中從而提升程序性能,實(shí)現(xiàn)要點(diǎn)如下:
- asyncLogger實(shí)現(xiàn)為對logger的裝飾者
- 提供單獨(dú)的goroutine做寫操作
更詳細(xì)的使用,可以參考:http://www.itdecent.cn/p/20d0f74c3c08
shardmap
代碼在:https://github.com/goinbox/shardmap
go中的原生map在多個goroutine同時讀寫時是需要加鎖的,為了提升性能,核心思想是減少鎖粒度,shardmap就是這樣開發(fā)的:

go1.8之后的官方包中提供了sync.Map用于解決map的并發(fā)讀寫問題,但我自己測試沒有shardmap性能好,讀者有興趣可以自己試下。
更詳細(xì)的使用,可以參考:http://www.itdecent.cn/p/090e00f12b3e
redis
代碼在:https://github.com/goinbox/redis
redis可用的包很多,我自己實(shí)現(xiàn)的這個包,底層driver部分使用了redigo,考慮到實(shí)際的生產(chǎn)環(huán)境使用,我自行實(shí)現(xiàn)了如下機(jī)制:
- 懶加載機(jī)制,即只有真正和redis做交互時才創(chuàng)建網(wǎng)絡(luò)連接
- 操作失敗自動重連機(jī)制
- 提供連接池以提高性能
- pipeling封裝
- 事物封裝
更詳細(xì)的使用,可以參考:http://www.itdecent.cn/p/fb498f30dff2
goconsumer
代碼在:https://github.com/goinbox/goconsumer
對異步隊(duì)列的使用目前在開發(fā)中也是必不可少的,這里提供了一個消費(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,這個做消息的隨機(jī)分發(fā),無需順序的消費(fèi)均可以使用
- specifyDispatcher,自己指定消息的分發(fā)方法,需要順序消費(fèi)等特殊消費(fèi)需求可以使用
- worker
消息處理對象,干實(shí)際業(yè)務(wù)工作的。
- task
啟動一個消費(fèi)任務(wù)框架,執(zhí)行的入口,我在task_test.go中有個demo實(shí)現(xiàn),可供大家參考。