流水號在銀行業(yè)最為常見继榆。相信很多人接觸到流水號都是從銀行相關的憑條或銀行系統(tǒng)查詢獲知令哟。
自從進入金融相關的公司或業(yè)務開發(fā)之后渐排,對流水號的應用開發(fā)就有了更深刻的認知。
那么孔祸,今天我們通過流水號來應用到實際開發(fā)中隆敢。解決我們開發(fā)中的問題。
一崔慧、流水號的特點:唯一性
流水號筑公,對于整個系統(tǒng)而言是全局唯一。這算是流水號最基礎最重要的特點尊浪。這個特點匣屡,能解決最根本實際開發(fā)中最實際的問題。
二拇涤、實際案例:卡券發(fā)放
A 系統(tǒng)屬于核心系統(tǒng)捣作。提供了各種各樣的核心功能,以及暴露一些 API 接口鹅士。這些接口可以給圍繞 A 系統(tǒng)做運營功能的系統(tǒng)使用券躁。
假如,現在有一個 B 系統(tǒng)有一個需求:
制作一個導流的活動頁面掉盅,在該頁面輸入手機號并接收驗證碼之后實現快捷注冊也拜,然后給這個手機號對應的賬戶贈送一張減免 10 元的卡券。
為什么不直接在導流的注冊流程里面直接贈送呢趾痘?
因為慢哈,有以下幾個原因:
- (1)導流頁面是調用 A 系統(tǒng)的注冊接口。A 系統(tǒng)屬于核心業(yè)務系統(tǒng)永票,不會經常為了這些活動而定制改動系統(tǒng)代碼卵贱,影響系統(tǒng)穩(wěn)定性。
- (2)B 系統(tǒng)只有 A 系統(tǒng)的可讀權限或可讀權限都沒有侣集。所以键俱,無法直接干涉核心業(yè)務數據庫的功能。
- (3)B 系統(tǒng)引流注冊世分,如果用戶此時只是注冊编振,并不會去下載 App 登錄的話。那么臭埋,這時贈送卡券將變得毫無意義踪央。只會產生更多的垃圾數據。
那么斋泄,該如何做杯瞻?
- (1)A 系統(tǒng)提供快捷注冊接口、短信發(fā)送接口炫掐、卡券發(fā)送接口魁莉。
- (2)B 系統(tǒng)制作一個注冊導流 H5 頁面。用戶填寫手機號,獲取驗證碼旗唁,輸入驗證碼點擊畦浓,點擊提交調用 A 系統(tǒng)快捷注冊接口實現注冊用戶。
- (3)B 系統(tǒng)調用 A 系統(tǒng)的注冊接口成功之后检疫,在自己的系統(tǒng)存儲手機號讶请、用戶ID、注冊時間屎媳、導流 H5 的頁面唯一標識(自己定一個)夺溢。
- (4)A 系統(tǒng)在系統(tǒng)當中實現一系列事件(登錄、注冊烛谊、下單风响、充值、提現)丹禀。并且寫入隊列状勤。然后,把這些事件實時推送給 B 系統(tǒng)双泪。
- (5)B 系統(tǒng)收到這些事件之后持搜,根據自己是否有建立在這些事件上的后續(xù)功能。比如焙矛,我們這個導流功能葫盼,就需要導流注冊成功之后,用戶首次登錄的時候贈送 10 元卡券薄扁。
上面的 (1)剪返、(2)、(3)邓梅、(4)都很好實現。其中邑滨,第(4)步主要是為了實現系統(tǒng)解耦日缨。并且這也是目前比較常用的方案。我們今天要講的是怎樣通過流水號來解決第(5)步的問題掖看。
那么第(5)步會有什么問題匣距?
比如,現在 B 系統(tǒng)收到了導流的用戶成功首次登錄的事件推送了哎壳。結果毅待,去調用 A 系統(tǒng)提供的發(fā)送卡券功能贈送 10 元卡券。結果归榕,調用卡券發(fā)送失敗了尸红。于是,準備在程序里面實現一個功能:失敗之后重發(fā)。最后成功了外里。但是怎爵,真的成功了嗎?
我們來分析一下盅蝗”盍矗卡券發(fā)送失敗的可能原因:
- 請求被 A 系統(tǒng)正確接收。但是墩莫,由于網絡原因 B 系統(tǒng)中斷了芙委。
- 請求沒有被 A 系統(tǒng)接收。
- 請求被 A 系統(tǒng)正確接收狂秦,也正確發(fā)送了卡券灌侣。但是, A 系統(tǒng)故障了故痊。
- 請求被 A 系統(tǒng)正確接收顶瞳,也正確發(fā)送了卡券。B 系統(tǒng)自己故障了愕秫。
當然慨菱,情況不止上面這幾種,還有其他原因戴甩。不管何種原因符喝,當我們要重發(fā)的時候,問題就來了:會導致卡券發(fā)送多次甜孤。
這時候我們可以利用流水號的特性协饲。每次導流注冊成功之后,給每條入庫的記錄一個唯一的流水號缴川。流水號一定要保證它的唯一性茉稠。該流水號在 A 系統(tǒng)當中的發(fā)送卡券接口也要實現防重發(fā)的功能。
怎樣在 A 系統(tǒng)當中的發(fā)送卡券接口防重復呢把夸?
很簡單而线。我們正確接收到 B 系統(tǒng)的請求之后,以此流水號寫入緩存恋日。然后膀篮,接著處理卡券發(fā)送的業(yè)務。當第二次同樣的請求發(fā)送過來的時候岂膳,檢查這個流水號是否在我們的緩存當中誓竿,如果存在立即查詢發(fā)送的狀態(tài)。并返回發(fā)送的結果谈截。
這樣 A 系統(tǒng)不管因為何種原因導致發(fā)送失敗筷屡,重發(fā)的時候都不會導致福利卡券發(fā)送失敗涧偷。
當然,A 系統(tǒng)也有可能會發(fā)送失敗速蕊。這時我們可以找到發(fā)送失敗的原因修復代碼嫂丙。然后, B 系統(tǒng)重新處理就好了规哲。
以上只是一個理論分析跟啤。沒有給出具體的 PHP代碼示例。在我司的金融產品當中唉锌,我們就用該思想理論隅肥,實現了諸如此類的重發(fā)問題。