在實際生產中,我們或多或少的需要對接第三方的同步介面,那我們如何實現高併發下go的同步請求方法呢,下面我就講一下我最近在生產中運用的一種方法。
我們最近遇到的需求是對接第三方的介面,需要實時的獲取到對方的相應資料,超過三秒沒有拿到則判斷請求失敗,返回對應的錯誤資訊。
我的做法是,首先定義乙個全域性的channel
var reqchannel = make(chan *packet, 20)
然後在請求的業務裡,定義乙個請求唯一的id並往這個channel裡塞值,同時起乙個協程迴圈的讀取這個channel
for
logger.debugf("send packet to pubwin, id:%d, type:%#x, body:%s", req.id, req.type, string(req.data))
err := ptr.sendpacket2pubwin(packet)
if err != nil
}
讀取完以後,再定義乙個全域性的map,key是剛讀取的請求的唯一id,value定義成需要返回型別的channel
// 我的請求是返回乙個byte陣列
var resmapchannel map[uint32]chan byte
請求返回後,將請求的id和返回的值塞到定義的map裡,同是在請求的地方迴圈的讀取key為請求id的channel,
並設定對應的超時時間,記得處理結束移除對應map裡的key,防止迴圈處理
// 初始化channel
var respchannel byte
// 設定超時時間
ticker := time.newticker(3 * time.second)
// 阻塞讀取channel
for
// 處理結束移除map
delete(model.resmapchannel, id)
return checkoutinfo, nil
} case <-ticker.c:
logger.errorf("response timeout, id %d", id)
// 處理結束移除map
delete(model.resmapchannel, id)
return nil, nil
}}
redis實現高併發下的搶購 秒殺功能
常規寫法 查詢出對應商品的庫存,看是否大於0,然後執行生成訂單等操作,但是在判斷庫存是否大於0處,如果在高併發下就會有問題,導致庫存量出現負數 redis的解決方案 1,inlcude oncea include db.php redis new redis resid connect 127.0....
高併發下實現執行緒安全的i 操作
這個比較簡單,就是在進行i 操作時,直接使用synchronized加鎖,也可以使用lock加鎖,本質都是一樣的 鎖原理不同 最終都是通過加鎖來保證多執行緒安全的。public class synchronized add public static void main string args th...
高併發下的redis加鎖的幾種實現方式
redis加鎖分類 redis能用的的加鎖命令分表是incr setnx set 第一種鎖命令incr 這種加鎖的思路是,key 不存在,那麼 key 的值會先被初始化為 0 然後再執行 incr 操作進行加一。然後其它使用者在執行 incr 操作進行加一時,如果返回的數大於 1 說明這個鎖正在被使...