原创 golang利用redis實現消息隊列Push和Pop

可以利用redis的list結構來實現消息隊列功能,使用lpush、rpush來實現入隊,lpop、rpop來實現出隊列。 我們統一從左邊push、從右邊pop,即用lpush和rpop組合。 當list中沒有元素時,rpop會返回nil

原创 golang實現expiredMap,key帶過期時間,超時自動刪除

github地址:https://github.com/hackssssss/ExpiredMap 偶然間看到一篇關於超期刪除key的map的文章,感覺很有意思,於是自己去實現了一下。 瞭解了一下redis中key的過期策略,發現主要有三

原创 grpc負載均衡RoundRobin源碼解讀

grpc client端創建連接時可以用WithBalancer來指定負載均衡組件,這裏研究下grpc自帶的RoundRobin(輪詢調度)的實現。源碼在google.golang.org/grpc/balancer.go中。 r

原创 grpc複用client連接

以前在調用grpc接口時,總要調用Dial函數來創建一個grpc的ClientConn,如果每次都要創建,那麼開銷代價是很大的。 grpc的ClientConn對象可以幫我們實現自動重連的機制,並且是併發安全的,因此可以定義一個全局的Cl

原创 線上golang grpc服務資源泄露問題排查

前幾天告警羣裏報出一個go服務grpc接口出現很多超時現象,排查發現是服務有內存泄露與cpu佔用高的問題,在這裏將排查的過程記錄一下,給大家提供排查問題的方向與思路,同時借鑑教訓,優化自己服務代碼。 發現超時現象後,登錄機器看了下

原创 漏桶算法

近期在研究Jaeger,Jaeger中有一種採集策略是速率限制類型,內部使用的是漏桶算法,在這裏研究了下Jaeger漏桶算法的實現原理,自己仿照其實現了一個rateLimiter,並進行了相關測試,下面是主要實現。 lck:lck是互斥鎖

原创 istio內置資源和sidecar注入初探

目錄 Gateway(gw) VirtualService(vs) DestinationRule(dr) ServiceEntry(se) sidecar注入以及流量劫持 sidecar注入過程 sidecar注入原理 sidecar注

原创 Kubernetes Controller Manager原理淺析

controller manager是什麼? Controller Manager 是集羣內部的管理控制中心,負責統一管理與運行不同的 Controller ,實現對集羣內的 Node、Pod 等所有資源的管理。 比如當通過 Deplo

原创 golang sync.Mutex鎖如何實現goroutine的阻塞與喚醒初探

var mu = new(sync.Mutex) func test() { mu.Lock() defer mu.Unlock() ... } 這是一段mutex的加鎖解鎖代碼,當多線程同時執行這段代碼時,能保證我們臨界

原创 golang echo web框架中間件的實現

使用echo框架可以方便的定義自己的中間件,這裏研究下echo中間件的實現以及是如何實現鏈式調用的。 比如我們有下面的中間件: func CalHandleTime(next echo.HandlerFunc) echo.Hand

原创 golang實現簡單的goroutine worker池

實現了簡單的worker池,可以執行一些後臺常駐類的任務,並且可以實現worker數量的實時控制。 利用兩個worker數組,alive和idle,分別保存活躍的worker和空閒的worker,並且空閒的worker可以從暫停狀態快速轉

原创 golang利用redis實現簡單延時隊列

redis的zset是一種能自動排序的數據結構,我們可以用這個特性來實現簡單的延時隊列。 利用zadd將數據添加到zset中,每個數據的score值設置爲數據的延時時間+當前時間戳,後臺goroutine不斷zrange輪詢zset,取出

原创 golang利用redis實現限速器

利用redis的String數據結構可以實現計數器的功能,利用incr或者incrby來實現計數器的增加或者減少。 同時redis對可以對key實現過期功能,這樣我們就可以利用計數器和過期功能來實現限速器。 例如很多時候我們需要對單個用戶

原创 golang使用redis實現分佈式鎖

redis可以使用string數據結構來實現分佈式鎖。這裏記錄一些注意點: setnx:利用setnx的特性,當key不存在時,可以設置成功;當key存在時,setnx返回nil。 設置expire:爲了防止客戶端獲取到鎖後忘記解鎖,這裏

原创 redis基礎數據結構以及其應用

最近在看redis相關的書籍,這裏將一些知識點做下總結,以免以後遺忘。 主要包含redis基礎數據結構、redis的一些策略以及redis的一些應用等內容。 String 實現 redis的字符串是簡單動態字符串,可以對其進行動態修改。