天天看點

超級快遞——如何用系統來保證快遞準時送達

去年,一部《超級快遞》給大家帶來了不少歡樂,除了歡笑,我們也看到了準時送達作為一種增值服務或者高端服務在快遞物流行業中可能性和市場。而每天上億的快遞數量靠人肉來保證已經幾無可能,在這裡,我們從系統的角度來看看如何搭建一個保證快遞能夠準時到達的系統。

要保證快遞能準時到達收件人手裡,就需要能夠主動及時的發現那些可能會遲到的快遞,并在第一時間進行檢視和處理,比如聯系到快遞小哥确認狀态等等。

在這裡,我們将快遞在整個流轉的過程進行拆分,當快遞達到一個狀态之後,确定下一個狀态以及達到時間,在規定的時間内沒有到達則需要通知相關的負責人進行處理,我們将快遞的每一次狀态的更新都寫入資料庫中,然後采取下面兩種方案進行簡單的處理:

方案一

每次更新快遞的狀态時與前一次狀态進行比較,中間的時間差超出期望時間則報警。

超級快遞——如何用系統來保證快遞準時送達

方案二

定時對所有的快遞狀态進行檢查,最近一次狀态更新的時間距目前時間超出期望則報警。

超級快遞——如何用系統來保證快遞準時送達

__方案一__隻在快遞更新時做處理,對系統的壓力最小,但是需要依賴快遞的到達時間觸發,時效性太差,快遞到的越晚就越晚才發現快遞遲到,往往是發現快遞不能準時送達的時候快遞就已經遲到了。

__方案二__發現可能遲到的快遞的時效性取決去檢查的周期,最壞情況下就是快遞在檢查之後馬上就逾時了,等到下次檢查才能發現,而且對日均千萬甚至億級别的快遞狀态進行存儲本來就是一個非常頭疼的問題,再掃全庫進行查詢又會大大增加資料庫的負擔,很有可能查詢的時間就會超過快遞的逾時時間。

首先,我們将快遞的每一個狀态都存儲在表格存儲中。

表格存儲很好的解決了資料規模與讀寫并發上的問題,單表能夠支撐到萬億級資料規模,自動負載均衡能夠讓使用者不需要做任何動作就可以将資料表的讀寫并發擴充到百萬級别,按量付費又可以避免資源的浪費。同時,讀寫性能不受資料規模的影響,也不用擔心資料積累之後的性能問題。

超級快遞——如何用系統來保證快遞準時送達

在每一個快遞狀态更新時,一方面将該快遞狀态寫入到表格存儲中,以提供實時線上查詢。同時,根據快遞狀态的逾時時間建立一條消息,包括快遞單号、逾時時間等資訊,将該消息發送到對應的隊列中,比如處于攬件的某個快遞需要在2小時内到達中轉站,則将該快遞的資訊push進 __2小時攬件隊列__。

逾時檢查系統從上述隊列中取消息進行檢查,根據消息中的 快遞單号 在表格存儲中查詢該快遞的最近一次狀态資訊,如果查到的最新狀态時間大于消息中的時間,則說明該快遞在逾時時間内達到了下一個狀态,否則該快遞則有不能按時到達的風險,迅速進行報警處理。

架構優勢

表格存儲的高并發優勢可以在幾十萬的qps下依然提供毫秒級的讀寫延時,從容應對逾時檢查系統以及來自真實使用者的快遞查詢需求。

快遞到達逾時時間之後能夠立刻被消費者也就是逾時檢查系統看到,大大提高了處理的實時性。

一個隊列可以對應多個消費者,每個消息隻會被一個消費者取到,是以檢視隊列裡面的消息堆積情況,包括未到喚醒時間的消息和已經喚醒等待處理的消息數量,當等待處理的消息數量過多則說明系統處理的慢了,這個時候就可以動态增加處理節點了,節點間沒有狀态引入,直接去擷取消息時間處理即可,部署架構又大大簡化。