摘要:如何為每一個請求分配一個在全集群范圍內(nèi)都唯一的,卻又不想去實現(xiàn)一個復雜的集中式序列生成器呢這或許是個辦法,但不覺得不太甘心么下面的這個方式可能可以幫到你自增,用于的生成過程啟動加載時的時間戳,用于的生成過程本機地址,用于的生成過程規(guī)則將
如何為每一個web請求分配一個在全集群范圍內(nèi)都唯一的request id,卻又不想去實現(xiàn)一個復雜的集中式id序列生成器呢?
UUID? 這或許是個辦法,但不覺得不太甘心么?
下面的這個方式可能可以幫到你:
package test; import java.util.concurrent.atomic.AtomicLong; import test.LocalIpAddressUtil; public class UniqRequestIdGen { private static AtomicLong lastId = new AtomicLong(); // 自增id,用于requestId的生成過程 private static final long startTimeStamp = System.currentTimeMillis(); // 啟動加載時的時間戳,用于requestId的生成過程 private static final String ip = LocalIpAddressUtil.resolveLocalAddress().getHostAddress(); // 本機ip地址,用于requestId的生成過程 public static void main(String[] args) { System.out.println(resolveReqId()); } private static String resolveReqId() { // 規(guī)則: hexIp(ip)base36(timestamp)-seq return hexIp(ip) + Long.toString(startTimeStamp, Character.MAX_RADIX) + "-" + lastId.incrementAndGet(); } // 將ip轉(zhuǎn)換為定長8個字符的16進制表示形式:255.255.255.255 -> FFFFFFFF private static String hexIp(String ip) { StringBuilder sb = new StringBuilder(); for (String seg : ip.split(".")) { String h = Integer.toHexString(Integer.parseInt(seg)); if (h.length() == 1) sb.append("0"); sb.append(h); } return sb.toString(); } }
其思路在注釋里已經(jīng)解釋清楚了:這個id包含了本機ip、本應用啟動時的時間戳、本應用內(nèi)部自增id這三個要素,并且以合適的轉(zhuǎn)碼方式組合而成,可以簡單地做到全局唯一性
生成的唯一性requestId形如:0a11d448iaxk1z35-112
利用它不僅能唯一標識一個請求,還能通過它反查到具體的機器ip
(注:其中引用到的LocalIpAddressUtil參見文章:http://segmentfault.com/a/1190000002637818 )
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://www.ezyhdfw.cn/yun/64378.html
摘要:關(guān)于我為什么寫這篇文章是因為今天在做訂單模塊的時候看到之前的上描述的年月日用戶位企業(yè)位四位自增長數(shù)。背景對于其定訂單的生成。個人的看法是主要是唯一,其他關(guān)于業(yè)務方面的不是太太重要。自增實現(xiàn)了用于將的值遞增,并返回結(jié)果。 關(guān)于我為什么寫這篇文章是因為今天在做訂單模塊的時候,看到之前的PRD上描述的年月日+用戶id2位+企業(yè)id位+四位自增長數(shù)。然后竟被我反駁的突然改成了精確時間+4位自增...
摘要:原文地址唯一的生成并不是一件小事想說愛它也并不是像簡單來一個這樣一件容易的事為什么要唯一數(shù)據(jù)庫的自增在分庫的時候會是一場災難假設分兩個庫因為每個庫都會開始從開始自增屆時系統(tǒng)中將會出現(xiàn)兩個為的用戶自增會暴露用戶量或者其他業(yè)務量自增會讓有心者 [原文地址:https://blog.ti-node.com/blog...] 唯一ID的生成并不是一件小事 , 想說愛它 , 也并不是像簡單來一個...
摘要:為什么需要發(fā)號器在分布式系統(tǒng)中,經(jīng)常需要對大量的數(shù)據(jù)消息請求等進行唯一標識,例如對于分布式系統(tǒng),服務間相互調(diào)用需要唯一標識,調(diào)用鏈路分析,日志追蹤的時候需要使用這個唯一標識。 原文鏈接:何曉東 博客 文章起源于 康神交流群的 panda大佬和boss li關(guān)于發(fā)號器的一些交流,特此感謝讓我們學到了新知識。 為什么需要發(fā)號器 在分布式系統(tǒng)中,經(jīng)常需要對大量的數(shù)據(jù)、消息、http 請求等進...
摘要:幾乎所有的系統(tǒng)都存在生成唯一的需求,如用戶賬單等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式生成方案。優(yōu)勢和數(shù)據(jù)庫自增方案類似缺點同樣仍然有性能上限,依賴數(shù)據(jù)庫的可用性。使用時,可以使用具體的場景選擇合適的方案。幾乎所有的系統(tǒng)都存在生成唯一ID的需求,如用戶ID、賬單ID等,由于系統(tǒng)通常是分布式架構(gòu),因而需要有合適的分布式ID生成方案。常見的分布式唯一ID方法有(歡迎補充):時間戳數(shù)據(jù)...
閱讀 1818·2021-10-29 13:11
閱讀 1054·2021-09-22 10:02
閱讀 1832·2021-08-20 09:35
閱讀 1708·2019-08-30 15:54
閱讀 2650·2019-08-30 15:44
閱讀 1531·2019-08-29 16:52
閱讀 1248·2019-08-23 12:56
閱讀 898·2019-08-22 15:16