接上篇焊傅,時(shí)間長了剂陡,思路都斷了。本來這章要寫流水號(hào)的使用場景狐胎,一看內(nèi)容第三章已經(jīng)寫得差不多了鸭栖,直接跳過。
4握巢、流水號(hào)的技術(shù)實(shí)現(xiàn)
-
流水號(hào)的生成
根據(jù)上面的分析晕鹊,全局流水號(hào)是代表一個(gè)服務(wù)場景的,是用戶向應(yīng)用系統(tǒng)發(fā)起的一次服務(wù)請求镜粤,如果把全企業(yè)所有的應(yīng)用系統(tǒng)看做一個(gè)整體的話捏题,那么第一次向這個(gè)有機(jī)整體發(fā)起訪問請求的系統(tǒng)就是生成全局流水號(hào)的時(shí)間。一般情況下肉渴,業(yè)務(wù)發(fā)起方都是渠道公荧,也就是我們所說的人機(jī)交互界面,再通俗點(diǎn)是有前端頁面的系統(tǒng)同规。特別的循狰,也存在直接對外提供的服務(wù)接口窟社,比如銀企直連、支付接口以及其他的金融開放服務(wù)绪钥,此時(shí)灿里,負(fù)責(zé)生成全局流水號(hào)的就是提供服務(wù)開放接口的系統(tǒng);另外還存在系統(tǒng)后臺(tái)自動(dòng)執(zhí)行的定時(shí)或批量任務(wù)程腹,其全局流水應(yīng)是批量觸發(fā)系統(tǒng)匣吊,如果是全行作業(yè)統(tǒng)一管理,則統(tǒng)一作業(yè)管理系統(tǒng)生成寸潦,如果各自獨(dú)立色鸳,則業(yè)務(wù)觸發(fā)系統(tǒng)生成。
請求流水號(hào)是上游向下游系統(tǒng)發(fā)起請求的時(shí)機(jī)由上游系統(tǒng)生成的见转,代表的是一次請求的實(shí)例命雀。
-
有意義還是無意義?
現(xiàn)在的技術(shù)傾向是流水號(hào)無意義化斩箫,一是從性能角度考慮可以更快的生成流水號(hào)吏砂,二是將流水號(hào)和業(yè)務(wù)解耦,流水號(hào)只充當(dāng)純粹的技術(shù)主鍵乘客,業(yè)務(wù)屬性由具體的業(yè)務(wù)字段去承載狐血。但是很多企業(yè)和系統(tǒng)并沒有這種勇氣直接拋棄流水號(hào)的中的業(yè)務(wù)屬性,這也有他們的理由寨典,一是習(xí)慣使然氛雪,通過流水號(hào)的解析可以直接獲取很多信息,在很多只有流水號(hào)的場景可以簡化數(shù)據(jù)庫的訪問耸成;二是如果這個(gè)流水號(hào)是對外開放的报亩,比如業(yè)務(wù)員,他們會(huì)更希望看到有規(guī)律的一組數(shù)字井氢;三是使用有意義的流水號(hào)對于問題定位弦追,在沒有統(tǒng)一的日志分析運(yùn)維平臺(tái)的情況下,的確可以節(jié)約時(shí)間花竞。說了這么多劲件,流水號(hào)中到底應(yīng)不應(yīng)該用有意義的屬性?你自己去判斷约急。
-
流水號(hào)的編碼規(guī)則
既然說是編碼規(guī)則零远,前提就是說選擇了有意義的流水號(hào)的情況。一般情況下編碼要跟使用目的相結(jié)合厌蔽,比如對于全局流水號(hào)牵辣,你希望知道是哪個(gè)系統(tǒng)發(fā)起的、什么時(shí)間發(fā)起的奴饮、什么機(jī)構(gòu)發(fā)起的等等纬向,那么流水號(hào)中就可以把這些要素編進(jìn)去择浊。有些銀行希望知道柜面的業(yè)務(wù)是哪個(gè)柜員發(fā)起的,那么也可以把柜員編進(jìn)去逾条。分布式環(huán)境下琢岩,為了快速定位實(shí)例,也可以把實(shí)例編進(jìn)去师脂,一句話担孔,需要什么就把什么編進(jìn)去。以下是一些可供參考的維度:
系統(tǒng)編碼
日期
機(jī)構(gòu)
用戶
實(shí)例碼
業(yè)務(wù)類型
校驗(yàn)碼
順序碼
-
高并發(fā)下的流水號(hào)生成
流水號(hào)的記錄有很多種方式危彩,常見的還是數(shù)據(jù)庫表記錄和sequence的方式攒磨,使用可持久化緩存也是一種方式。高并發(fā)下的處理方案無非是將于數(shù)據(jù)庫的IO操作轉(zhuǎn)化為對內(nèi)存的操作汤徽,具體實(shí)現(xiàn)上是從數(shù)據(jù)庫中一次性取出多個(gè)seq,例如一次性取出1000個(gè)放到緩存中灸撰,如果是數(shù)據(jù)庫記錄谒府,則數(shù)據(jù)庫序列號(hào)一次性+1000,如果是sequence浮毯,則sequence步長調(diào)整為1000完疫,使用的時(shí)候再從緩存中獲取。
如果是分布式债蓝,有兩種方式避免分布式流水號(hào)重復(fù)壳鹤,一是在流水號(hào)中增加實(shí)例號(hào)來區(qū)分;二是使用數(shù)據(jù)庫的排它鎖饰迹,避免多個(gè)應(yīng)用同時(shí)從數(shù)據(jù)庫中獲取流水號(hào)芳誓。
-
流水號(hào)的記錄與檢索
流水的記錄常見也是兩種方式,文件和數(shù)據(jù)庫啊鸭,對于關(guān)鍵的交易流水锹淌,一般都會(huì)登記的數(shù)據(jù)庫中,對于一般性的服務(wù)訪問流水很多系統(tǒng)只記錄到日志文件中赠制。交易流水由于存在后續(xù)交易的可能性赂摆,如上篇中所說的基于原交易的查詢、沖正钟些、補(bǔ)錄等操作烟号,對流水的查詢能力要求比較高,需要應(yīng)用系統(tǒng)能根據(jù)全局流水號(hào)政恍、請求流水號(hào)汪拥、后臺(tái)系統(tǒng)流水號(hào)等多種維度查詢,這種實(shí)時(shí)查詢服務(wù)關(guān)系型數(shù)據(jù)庫系統(tǒng)最有優(yōu)勢抚垃,所以存數(shù)據(jù)庫還是不二選擇喷楣。
而對于一般服務(wù)訪問流水趟大,可能沒有業(yè)務(wù)含義,只是單純的代表一次服務(wù)請求铣焊,大多數(shù)查詢服務(wù)都是這種類型逊朽,這種流水只記錄服務(wù)流水日志即可,也可以將這種流水通過大字段結(jié)構(gòu)化文本的方式記錄到數(shù)據(jù)庫中曲伊;這種類型的數(shù)據(jù)如果沒有專用的分析工具在使用和檢索的時(shí)候比較費(fèi)時(shí)費(fèi)力叽讳,通過人肉運(yùn)維的方式顯然比較原始,現(xiàn)在的大數(shù)據(jù)分析平臺(tái)對于這種類型的數(shù)據(jù)處理起來得心應(yīng)手坟募,聯(lián)創(chuàng)智融也開發(fā)了一個(gè)專門的日志分析平臺(tái)岛蚤,iLog專門用于處理這種大文本交易流水,并且具有還原跨系統(tǒng)交易鏈路的能力懈糯,是系統(tǒng)運(yùn)維的好幫手哦涤妒。
結(jié)語
結(jié)束的有點(diǎn)倉促,都怪這個(gè)咖啡館空調(diào)給的太低了赚哗,太想逃離了她紫,快點(diǎn)打完了事。
The End.