原创 NSQ系列(一):概述和架構

關於NSQ NSQ是Go開發的,比較輕量的一款MQ。公司很多項目使用了NSQ作爲消息隊列,也藉此瞭解下NSQ。 先說下NSQ的幾個特性, 分佈式部署,沒有單點問題 支持水平擴容 消息優先存儲在內存(超過限制後可以保持在磁盤) C

原创 NSQ系列(三):nsqlookupd原理和實現

nsqlookupd的角色類似於註冊中心,管理着nsqd -> Topic -> Channel的拓撲信息,提供Client查詢Topic和Channel的信息。nsqlookupd主要提供兩種接口:TCP接口,用於nsqd廣播信

原创 緩存 Cache-Aside Pattern

緩存模式,把數據從源數據加載到緩存中,可以改善服務的性能,同時儘量確保緩存與源數據的一致性。 背景 爲了提高服務性能,我們通常用緩存來保存一些熱點數據。但是,數據一致性是個挑戰,要保證緩存與源數據完全一致是不現實的,因此服務需要一

原创 Redis系列(一):Redis架構演進

Redis的架構是逐步演進的,從最初的單實例,到目前集羣模式,我們可以看下整個演進過程, 主從複製 單個Redis實例的能力有限,在Redis的大多數使用場景下,都是讀請求多於寫請求,因此通過增加實例作爲只讀的從節點,不僅可以擴展

原创 NSQ系列(二):nsqd原理和實現

在前一篇文章,我們大概瞭解了NSQ的集羣架構和交互流程,這裏我們將結合代碼詳細瞭解下nsqd的一些特性是如何實現,主要有, nsqd與Producer的交互。nsqd如何處理Producer投遞的消息,如果消息是延遲發送怎麼處理

原创 Go可變參數遇到的坑

可變參數 Go語言支持可變參數,給函數傳參帶來了很大的便利,簡化了slice類型參數傳入。代碼示例, func main(){ printFunc("name", "age") printFunc([]string{"name

原创 熔斷 Circuit Breaker Pattern

在實際環境中,當下遊服務或者存儲出現錯誤,而且需要大量時間來恢復時,服務如何正確處理這些錯誤決定了服務本身的健壯性和穩定性,而熔斷模式則是解決方法之一。 背景 在分佈式系統中,一個服務會與多個下游服務打交道,當它訪問下游時,很可能

原创 MySQL timestamp只能有一列被設爲CURRENT_TIMESTAMP

    創建數據庫表時,遇到問題: 錯誤代碼: 1293 Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP

原创 Golang佔位符大全

golang 的fmt 包實現了格式化I/O函數,類似於C的 printf 和 scanf。 # 定義示例類型和變量 type Human struct { Name string } var people = Human{N

原创 go Map實戰

map是最常見的數據結構之一。不同哈希表的實現也提供了不同特性,但是總體來說它們都提供快速查詢、添加和刪除等功能。Go 提供了一個內置的map,基於哈希表來實現。 聲明和初始化 go裏面的map定義如下, map[KeyType]Val

原创 Effective Go

Switch type switch 通過type switch可以來動態發現interface的類型。下面的type switch使用類型斷言,關於switch以及類型判斷,可以借鑑下下面的代碼。 var t interface{}

原创 通過rand把數組順序隨機打亂

這周需求涉及到要把一個數組的內部順序打亂,參考了下網上的資料,其實很簡單,就是把數組元素隨機交換下就OK了,下面附上go實現的代碼, func Random(arr []string) { if len(arr) <= 0 { r

原创 golang中Defer、Panic、Recover的用法

因爲golang沒有try……catch的用法,但是可以通過defer + recover來實現,但是要先明確defer與return之間的執行順序。 defer 先看defer的定義(參考tour go)。 defer關鍵字可以推遲它所

原创 Python通過MySQLdb特殊字符轉義

    最近維護代碼發現存在部分數據存儲失敗的情況,項目是通過拼裝sql語句,利用MySQLdb execute來進行數據的插入。增加日誌後發現存在插入失敗的情況多爲value中存在單引號時,到時候整個sql語法存在問題,需要對單引號進行

原创 sql連接時的on和where注意事項

    我們經常會通過連接來對組合多個表的信息進行查詢,常用的left join,right join, inner join,full join等等。剛剛在使用連接查詢數據時,踩了個坑,這裏進行總結下。    先說下踩的坑這個case吧