網站首頁 編程語言 正文
go語言在網絡服務模塊有著得天獨厚的優勢;傳送門詳細介紹了涉及到的分布式相關技術。
分布式id生成器
Snowflake(雪花算法),由Twitter提出并開源,可在分布式環境下用于生成唯一ID的算法。
生成的Id是64位(int64)數值類型,包含4部分:
- 41bit的時間戳(毫秒):一般是相對系統上線時間的毫秒數(可用69年);
- 5bit的數據中心id+5bit的機器id:表示工作的計算機;實際使用時可根據情況調整兩者間的比例;
- 12bit序列號:區分同一個計算機在相同毫秒時間內的生產的ID(支持1毫秒4096條);
github.com/bwmarrin/snowflake
提供了一個輕量級的實現:
package main import ( "fmt" "github.com/bwmarrin/snowflake" "time" ) func main() { n, err := snowflake.NewNode(time.Now().UnixMilli() % 1024) if err != nil { fmt.println(err) os.Exit(1) } for i := 0; i < 10; i++ { id := n.Generate() fmt.Println("id", id.Int64()) fmt.Println( "node: ", id.Node(), "step: ", id.Step(), "time: ", id.Time(), ) } }
分布式鎖
可通過redis的setnx
來模擬分布式鎖:
- 設定成功時,為上鎖;
- 釋放鎖時,刪除對應的鍵;
import ( "fmt" "sync" "time" "github.com/go-redis/redis" ) func incr() { client := redis.NewClient(&redis.Options{ Addr: "localhost:6379", Password: "", // no password set DB: 0, // use default DB }) var lockKey = "counter_lock" var counterKey = "counter" // lock resp := client.SetNX(lockKey, 1, time.Second*5) lockSuccess, err := resp.Result() if err != nil || !lockSuccess { fmt.Println(err, "lock result: ", lockSuccess) return } // counter ++ getResp := client.Get(counterKey) cntValue, err := getResp.Int64() if err == nil { cntValue++ resp := client.Set(counterKey, cntValue, 0) _, err := resp.Result() if err != nil { // log err println("set value error!") } } println("current counter is ", cntValue) // unlock delResp := client.Del(lockKey) unlockSuccess, err := delResp.Result() if err == nil && unlockSuccess > 0 { println("unlock success!") } else { println("unlock failed", err) } }
也可通過zookeeper或etcd來模擬;
負載均衡
從n個服務節點中,挑選一個的思路了:
- 按順序挑
- 隨機挑一個
- 根據某種權重,對節點進行排序,選擇權重最大/小的那一個
原文鏈接:https://blog.csdn.net/alwaysrun/article/details/128355642
相關推薦
- 2022-06-27 詳解Python中while無限迭代循環方法_python
- 2022-05-20 Springboot讀取application配置文件中的自定義配置的幾種方式
- 2022-10-20 Android開發使用RecyclerView添加點擊事件實例詳解_Android
- 2023-07-18 SpringBoot Cache 整合 Redis 緩存框架
- 2022-10-23 Android?Activity?View加載與繪制流程深入刨析源碼_Android
- 2022-07-28 Android?EventBus粘性事件實現機制探究_Android
- 2021-12-15 go語言處理TCP拆包/粘包的具體實現_Golang
- 2022-03-03 Failed to execute ‘drawImage‘ on ‘CanvasRenderingC
- 最近更新
-
- window11 系統安裝 yarn
- 超詳細win安裝深度學習環境2025年最新版(
- Linux 中運行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎操作-- 運算符,流程控制 Flo
- 1. Int 和Integer 的區別,Jav
- spring @retryable不生效的一種
- Spring Security之認證信息的處理
- Spring Security之認證過濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權
- redisson分布式鎖中waittime的設
- maven:解決release錯誤:Artif
- restTemplate使用總結
- Spring Security之安全異常處理
- MybatisPlus優雅實現加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務發現-Nac
- Spring Security之基于HttpR
- Redis 底層數據結構-簡單動態字符串(SD
- arthas操作spring被代理目標對象命令
- Spring中的單例模式應用詳解
- 聊聊消息隊列,發送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠程分支