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