記錄bug導致測試部署出錯,但是本地環境啟動正常。雪花算法使用中報錯。并帶有源碼分析。

bug出現背景

集群產生的日志要求traceId不重復,使用雪花算法生成traceId

報錯形式如下

在這里插入圖片描述

為什么本地無法復現測試環境的bug

因為bug的出現本身就是概率性的事件

代碼如下
    public static Long workId = Long.parseLong(String.valueOf(NetUtil.getLocalhostStr().hashCode() + new Random().nextInt(99999))) % 31;

這里取hashCode后的數字加上99999數字,可能會越界變成負數,因為這里的workId需要在0到31之間就不被滿足

測試復現

  public static void main(String[] args) {for (int i = 0; i < 100000; i++) {Long workId = Long.parseLong(String.valueOf(new Random().nextInt(Integer.MAX_VALUE) + new Random().nextInt(99999))) % 31;if (workId < 0) {System.out.println(workId);}}}

如果有人想到用abs做解決方案的話,會有一種極端情況如下
在這里插入圖片描述

雪花算法的用法

第一種
每次都用工具創建實例,再去生成

        return IdUtil.getSnowflake(workId, centerId).nextIdStr();

第二種
用工具創建snowflake單例,id每次用單例中生成

// 靜態變量public static Snowflake snowflake = IdUtil.getSnowflake(workId, centerId);return snowflake.nextIdStr();

第一反應,第一種創建的方式是錯誤的。兩個實例對于雪花id的創建是不會有加鎖限制的。

源碼分析
這里是使用Singleton創建public static Snowflake getSnowflake(long workerId, long datacenterId) {return (Snowflake)Singleton.get(Snowflake.class, new Object[]{workerId, datacenterId});}
使用到這里先去get,如果get到直接返回,沒有get到,就反射創建對象public static <T> T get(Class<T> clazz, Object... params) {Assert.notNull(clazz, "Class must be not null !", new Object[0]);String key = buildKey(clazz.getName(), params);return get(key, () -> {return ReflectUtil.newInstance(clazz, params);});}// 存儲實例的地方private static final SafeConcurrentHashMap<String, Object> POOL = new SafeConcurrentHashMap();public static <T> T get(String key, Func0<T> supplier) {return POOL.computeIfAbsent(key, (k) -> {return supplier.callWithRuntimeException();});}

也就是說,hutool工具snowflake開發的時候已經考慮到有 水平不怎么高的程序員使用,而進行了代碼上的兜底。上面的單例對象也可以借鑒學習
在這里插入圖片描述
性能上也沒有實質性的差距

上面hutool如何保證兩個線程都初始創建對象的時候的絕對單例
SafeConcurrentHashMap 這個map是自己封裝的
重寫了 computeIfAbsent為啥封裝一個靜態的mapUtilpublic V computeIfAbsent(K key, Function<? super K, ? extends V> mappingFunction) {return MapUtil.computeIfAbsent(this, key, mappingFunction);}

沒有找到類似雙重檢查鎖的代碼。。。。到這里結束吧

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/35332.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/35332.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/35332.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

故障診斷 | HO-VMD-TCN河馬優化算法優化變分模態分解時間卷積神經網絡故障診斷模型

效果一覽 文章概述 故障診斷 | HO-VMD-TCN河馬優化算法優化變分模態分解時間卷積神經網絡故障診斷模型&#xff01;河馬優化算法&#xff08;Hippopotamus optimization algorithm&#xff0c;HO&#xff09;由Amiri等人于2024年提出&#xff0c;該算法模擬了河馬在河流或池塘中…

“華為杯”第十四屆中國研究生 數學建模競賽-A題:無人機在搶險救災中的優化運用

目錄 摘 要: 1 問題重述 2 問題分析 3 問題假設 4 變量說明 5 模型的建立與求解 5.1 問題 1 的建立與求解 5.1.1 模型分析 5.1.2 問題 1 的建立 5.1.3.1 貪心算法 5.2 問題 2 的建立與求解 5.2.1 問題 2 的建立 5.2.2 問題 2 的求解 5.3 問題 3 的建立與求解 5.3.1 問題 3 的建…

21 Shell編程之正則表達式與文本處理器

目錄 21.1 正則表達式 21.1.1 正則表達式概述 21.1.2 基礎正則表達式 21.1.3 擴展正則表達式 21.2 文本處理器 21.2.1 sed工具 21.2.2 awk工具 21.2.3 sort工具 21.2.4 uniq工具 21.1 正則表達式 21.1.1 正則表達式概述 1.正則表達式概述 正則表達式又稱正規表達式、常規表達…

離線部署OpenIM

目錄 1.提取相關安裝包和鏡像 2.安裝docker和docker-compose 3.依次導入鏡像 4.解壓安裝包 5.執行安裝命令 6.PC Web 驗證 7.開放端口 7.1IM 端口 7.2Chat 端口 7.3 PC Web 及管理后臺前端資源端口 “如果您在解決類似問題時也遇到了困難&#xff0c;希望我的經驗分享…

HTML+CSS 彩色浮雕按鈕

效果演示 實現了一個彩色按鈕特效&#xff0c;包括一個按鈕&#xff08;button&#xff09;和一個前景色&#xff08;::before&#xff09;。按鈕具有四種不同的顏色&#xff0c;當鼠標懸停在按鈕上時&#xff0c;前景色會出現漸變效果&#xff0c;并且按鈕的顏色、文本陰影和邊…

Windows 獲取打印機及端口號方法 (C#)

1. 打開注冊表編輯器 regedit 2.選擇如下配置 計算機\HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Device 3. 代碼 C# using System; using Microsoft.Win32;class Program {static void Main(){string registryPath "SOFTWARE\Microsoft\Windows …

優選算法2

五、位運算 常見位運算總結 &&#xff1a;有0就是0&#xff1b; |&#xff1a;有1就是1 ^&#xff1a;相同為0&#xff0c;相異就是1/無進位相加 給定一個數n,確定它的二進制表示中的第x位是0還是1&#xff1a;二進制中權值最小的是第0位&#xff0c;所以int整型是從第0位到…

堅持100天學習打卡Day1

1.大小端 2.引用的本質 及 深拷貝與淺拷貝 3.初始化列表方式 4.類對象作為類成員 5.靜態成員 static

vue3使用v-html實現文本關鍵詞變色

首先看應用場景 這有一段文本內容&#xff0c;是項目的簡介&#xff0c;想要實現將文本中的關鍵詞進行變色處理 有如下關鍵詞 實現思路 遍歷文本內容&#xff0c;找到關鍵詞&#xff0c;并使用某種方法更改其字體樣式。經過搜尋資料決定采用v-html實現&#xff0c;但是v-h…

解決pycharm安裝dlib失敗的問題

今天使用pycharm來學習opencv人臉識別庫face-recognition的時候出現了一點小問題&#xff0c;在pycharm中直接安裝face-recognition會失敗&#xff0c;說是因為缺少依賴庫dlib&#xff0c;但是直接使用pycharm安裝dlib庫也有問題&#xff0c;不知道大家遇到沒有 錯誤提示 note…

【深度學習】菜品目標檢測軟件系統

深度學習類文章回顧 【YOLO深度學習系列】圖像分類、物體檢測、實例分割、物體追蹤、姿態估計、定向邊框檢測演示系統【含源碼】 【深度學習】物體檢測/實例分割/物體追蹤/姿態估計/定向邊框/圖像分類檢測演示系統【含源碼】 【深度學習】YOLOV8數據標注及模型訓練方法整體流程…

AI智能寫作工具,AI寫作助手大全

隨著人工智能技術的快速發展&#xff0c;AI智能寫作工具助手已成為學術研究、內容創作和商業文案等領域的重要輔助工具。它們不僅能夠提高寫作效率&#xff0c;還能激發創意靈感&#xff0c;為各行各業的專業人士提供了強大的支持。下面小編將為大家全面介紹目前市場上備受矚目…

[C#][opencvsharp]C#使用opencvsharp進行年齡和性別預測支持視頻圖片檢測

使用 OpenCVSharp 來調用 age_net.caffemodel 和 gender_net.caffemodel 來進行性別和年齡預測涉及幾個步驟。以下是一個簡化的流程和示例文案&#xff1a; 1. 準備工作 確保你已經安裝了 OpenCVSharp 和相關的依賴項。確保你有 age_net.prototxt、age_net.caffemodel、gende…

大數據面試必問的數據治理面試題大全及參考答案

什么是數據治理?它與數據管理的區別是什么? 數據治理是組織內數據的系統性管理策略,它確保數據在整個生命周期中的可用性、準確性、安全性和合規性。數據治理不僅關乎技術實施,更是關于組織結構、政策、流程和標準的建立,以指導數據的收集、存儲、處理、保護和利用。它關…

代碼隨想錄算法跟練 | Day10 | 棧與隊列 Part01

個人博客主頁&#xff1a;http://myblog.nxx.nx.cn 代碼GitHub地址&#xff1a;https://github.com/nx-xn2002/Data_Structure.git Day10 232. 用棧實現隊列 題目鏈接&#xff1a; https://leetcode.cn/problems/implement-queue-using-stacks/ 題目描述&#xff1a; 請你僅…

在 Debian 服務器上安裝和配置 Apache Tomcat 的方法

前些天發現了一個巨牛的人工智能學習網站&#xff0c;通俗易懂&#xff0c;風趣幽默&#xff0c;忍不住分享一下給大家。點擊跳轉到網站。 介紹 Apache Tomcat 是一個應用服務器&#xff0c;可用于向 web 用戶提供 Java 應用程序。它是由 Sun Microsystems 開發的 Java Servle…

詳解SpringSecurity中的Filter Chain

在Spring Security中&#xff0c;Filter Chain&#xff08;過濾器鏈&#xff09;是實現請求安全控制的核心。Spring Security的安全框架是建立在Servlet過濾器的基礎上的&#xff0c;通過一系列過濾器來實現不同的安全特性&#xff0c;如認證、授權等。 什么是Filter Chain F…

正版軟件 | 『閃點清單』— 您的智能懸浮任務管理專家

在繁忙的日常中&#xff0c;我們經常需要一個既能隨時提醒&#xff0c;又不會打擾我們的待辦事項管理工具。『閃點清單』&#xff0c;一款簡約而不簡單的懸浮清單軟件&#xff0c;為您帶來全新的任務管理體驗。 設計簡約&#xff0c;功能強大 『閃點清單』以其簡約的設計和強大…

CVPR講座總結(二)-探索圖像生成基礎模型的最新進展探索多模態代理的最新進展:從視頻理解到可操作代理

引言 在CVPR24上的教程中&#xff0c;微軟高級研究員Linjie Li為我們帶來了多模態代理的深入探索。這些代理通過整合多模態專家和大語言模型&#xff08;LLM&#xff09;來增強感知、理解和生成能力。本文總結了Linjie Li的講座內容&#xff0c;重點介紹了多模態記憶、可操作代…

供應鏈攻擊是什么?

隨著企業對技術和連接性的依賴日益增加&#xff0c;以及對第三方的普遍依賴&#xff0c;供應鏈攻擊變得越來越普遍。這些攻擊旨在通過供應商和商業伙伴損害企業。 供應鏈攻擊可能對企業和組織構成重大威脅&#xff0c;因為它們可能危及它們的安全以及向客戶提供的產品和服務的…