應(yīng)用編程基礎(chǔ)課第四講:Go編程實(shí)踐

今天我給大家介紹下我使用Go語言做過的一些編程實(shí)踐

golog

代碼在:https://github.com/goinbox/golog

無論我們做什么開發(fā),log都是個強(qiáng)需求,所以先給大家介紹下我開發(fā)的golog

首先看下里面最重要的幾個數(shù)據(jù)結(jié)構(gòu)間的關(guān)系:

golog.png
  • writer

對底層寫操作的封裝,寫的對象可以是文件、隊(duì)列、ES等,當(dāng)前提供如下writer實(shí)現(xiàn):

  1. FileWriter寫文件
  2. FileWithSplitWriter寫文件,可自動按照天、小時為單位分文件寫入
  3. ConsoleWriter寫終端
  • buffer

對寫操作加buffer提升寫性能,實(shí)現(xiàn)時有如下要點(diǎn):

  1. 實(shí)現(xiàn)為writer的裝飾者
  2. 提供單獨(dú)的goroutine做autoflush
  • formater

formater是將要記錄的log內(nèi)容發(fā)往writer之前做一次格式化,例如添加統(tǒng)一的log日期、終端輸出添加顏色等,當(dāng)前有如下實(shí)現(xiàn):

  1. simpleFormater在消息前面加上loglevel和時間
  2. webFormater在simpleFormater的基礎(chǔ)上添加clientIp和logId
  3. consoleFormater為終端輸出添加顏色
  • logger

這個是程序中記錄log要使用到的對象,當(dāng)前提供了simpleLogger這個實(shí)現(xiàn),是一種同步的方式(寫操作阻塞程序執(zhí)行)

  • async

將寫入操作放到單獨(dú)的goroutine中從而提升程序性能,實(shí)現(xiàn)要點(diǎn)如下:

  1. asyncLogger實(shí)現(xiàn)為對logger的裝飾者
  2. 提供單獨(dú)的goroutine做寫操作

更詳細(xì)的使用,可以參考:http://www.itdecent.cn/p/20d0f74c3c08

shardmap

代碼在:https://github.com/goinbox/shardmap

go中的原生map在多個goroutine同時讀寫時是需要加鎖的,為了提升性能,核心思想是減少鎖粒度,shardmap就是這樣開發(fā)的:

shardmap.png

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ī)制:

  1. 懶加載機(jī)制,即只有真正和redis做交互時才創(chuàng)建網(wǎng)絡(luò)連接
  2. 操作失敗自動重連機(jī)制
  3. 提供連接池以提高性能
  4. pipeling封裝
  5. 事物封裝

更詳細(xì)的使用,可以參考:http://www.itdecent.cn/p/fb498f30dff2

goconsumer

代碼在:https://github.com/goinbox/goconsumer

對異步隊(duì)列的使用目前在開發(fā)中也是必不可少的,這里提供了一個消費(fèi)處理框架,目前支持:

  1. 消息非順序消費(fèi)
  2. 消息順序消費(fèi)

整體處理框架如圖:

goconsumer.png

里面的對象關(guān)系如下:

  • consumer

從各種隊(duì)列中做消費(fèi)的對象,例如kafka、nsq等

  • dispatcher

分配消息到worker中處理,可以在這里實(shí)現(xiàn)自己的分配算法達(dá)到順序消費(fèi)的目的,當(dāng)前提供下面兩種實(shí)現(xiàn):

  1. simpleDispatcher,這個做消息的隨機(jī)分發(fā),無需順序的消費(fèi)均可以使用
  2. specifyDispatcher,自己指定消息的分發(fā)方法,需要順序消費(fèi)等特殊消費(fèi)需求可以使用
  • worker

消息處理對象,干實(shí)際業(yè)務(wù)工作的。

  • task

啟動一個消費(fèi)任務(wù)框架,執(zhí)行的入口,我在task_test.go中有個demo實(shí)現(xiàn),可供大家參考。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容