首先我們來看看怎樣通過邏輯設(shè)計達到節(jié)約號碼的目的,這涉及到話務(wù)平臺兩種綁定關(guān)系模式:固定關(guān)系模式和會話關(guān)系模式。
1、固定關(guān)系模式
話務(wù)平臺最先支持的是固定關(guān)系模式。一個虛擬號,只分配給一個被叫真實號使用,不能同時分配給其他被叫真實號,這種綁定關(guān)系是獨占式的。綁定之后,理論上任意主叫號碼均能通過撥打這個虛擬號聯(lián)系到背后的真實號。號碼綁定關(guān)系可以被業(yè)務(wù)主動解綁,解綁后虛擬號回到號池,狀態(tài)標記為“可用”狀態(tài),下一次分配號碼時可以重復分配出去。號碼綁定關(guān)系也可以由業(yè)務(wù)方指定有效期,例如可以指定為1天有效期,1天過后此關(guān)系自動過期解綁,業(yè)務(wù)方需要取虛擬號時再重新綁定。
2、會話關(guān)系模式
另一種會話關(guān)系就有很大不同了。會話關(guān)系是相對于獨占的固定關(guān)系而言的,首先我們設(shè)計了一個共享號池,號池中儲備有多個虛擬號。對于主叫A1,當其需要聯(lián)系客戶B1時,話務(wù)平臺從共享號池中取出V分配給B1,A1通過撥打V聯(lián)系到B1,A1-V-B1就是一個會話關(guān)系。此時另外一個主叫A2,他需要聯(lián)系客戶B2,話務(wù)平臺從共享號池中分配號碼給B2,分配的號碼可以仍舊是V,A2通過撥打V可以聯(lián)系到B2,關(guān)系為A2-V-B2。為什么A1和A2,都撥打虛號V,能聯(lián)系到各自的客戶B1和B2呢?因為主叫號碼不同,話務(wù)平臺根據(jù)主叫號碼定位到不同的會話關(guān)系,并轉(zhuǎn)接到不同的被叫真實號碼!話關(guān)系比固定關(guān)系要節(jié)省號碼,讓我們更進一步,假設(shè)A1要聯(lián)系10名被叫,那么需要10個虛擬號,每名被叫對應一個虛擬號。這個時候,如果A2要聯(lián)系另外10名被叫,A2可以復用這10個虛擬號,不會出現(xiàn)撥虛擬號不能定位到被叫的問題,因為他們的主叫號碼是不同的。
是不是很神奇?!會話關(guān)系也可以更復雜,除了給被叫分配虛號,也可以給主叫分配虛號,主叫的虛號就是被叫接到來電時的來電號顯,這樣兩個真實號+兩個虛擬號形成一組會話關(guān)系,當被叫回撥時,話務(wù)平臺可以根據(jù)這個會話關(guān)系找到原始主叫真實號。
號池調(diào)度
通常,各個供應商、各個城市的接通率是不一樣的,接通率是指撥通的次數(shù)占總呼叫次數(shù)的比例。為了優(yōu)化接通率,在號碼分配時有一些特別的設(shè)計。每家供應商都提供多批虛擬號,話務(wù)平臺根據(jù)號碼類型、適用地區(qū)、業(yè)務(wù)需求量等維度對其進行分片,劃分成多個號碼池。業(yè)務(wù)方一般配置為可以使用多個號池,以防某個號池號碼耗盡,或者遇到供應商側(cè)的故障,可以有備用號池保障號碼分配能正常提供服務(wù)。當業(yè)務(wù)方申請分配虛擬號碼時,會根據(jù)預先配置好的分配策略,確定使用哪些號池。分配策略規(guī)定了業(yè)務(wù)、城市、渠道與號池ID的對應關(guān)系。如果沒有找到合適的號池,會選用默認的號池。為了優(yōu)化號碼分配,設(shè)計了一個號池評分模塊。評分模塊根據(jù)號池剩余號量、通話質(zhì)量優(yōu)劣(接通率)、以及人工干預等因素評分,確定優(yōu)先級,優(yōu)先級最高的號池被選中。號池選中之后,就可以從號池中取一個可用號碼分配給業(yè)務(wù)使用,當號碼關(guān)系解綁或者自然過期時,將號碼回收到號碼池,成為“可用”狀態(tài),如此號碼可以循環(huán)利用。號池的設(shè)計,也是一種風險控制手段,如果號池消耗過快,來不及補充便耗盡,號池評分模塊會根據(jù)剩余量自動降低這個號池的優(yōu)先級;當某個供應商出現(xiàn)故障時,也可以通過接通率下降或者人工干預手段降低這個供應商的所有號池的優(yōu)先級,從而讓其他可用的號池來提供正常服務(wù)。
號碼回收與復用,號碼資源是有限的,在有限的資源和無限的需求之間如何平衡呢?我們設(shè)計了一些回收與復用的機制。在綁定號碼時,明確指定了有效期屬性,當有效期結(jié)束時,該號碼會被回收至號池,下次分配可以重新使用。過期類型支持:不過期、綁定后指定時長后過期、首次通話后指定時長后過期、最后通話后指定時長后過期、定時過期。有些號碼分配出去,可能并不會被撥打。話務(wù)平臺設(shè)計了GC,會定期檢查號碼使用率情況,如果某個沒有設(shè)置過期時間的虛擬號碼,3天內(nèi)沒有被撥打,則可以認為是無效關(guān)系,GC會將其回收到號池?;厥諢o人撥打的號碼是安全的,因為使用方不緩存虛擬號碼,而是展示時總是從話務(wù)平臺實時獲取,如果之前分配出去的號碼已被回收,則會重新分配一個虛擬號給使用方。號碼的復用,第一是體現(xiàn)在號碼回收后可以重新分配給其他用戶;第二是體現(xiàn)在會話關(guān)系中,一個虛擬號能復用給多個關(guān)系,能復用的關(guān)系數(shù),取決于主叫能聯(lián)系的被叫數(shù)量。
安全與認證,下面我們來探討一下安全層面的考慮,安全是一個不容忽視的考慮因素。首先我們做了內(nèi)外網(wǎng)隔離,面向業(yè)務(wù)的接口只能內(nèi)網(wǎng)訪問,面向供應商的接口能從內(nèi)網(wǎng)和公網(wǎng)訪問。其次,話務(wù)平臺的接口采用https加密傳輸,防止中間人竊取、篡改數(shù)據(jù)。話務(wù)平臺設(shè)計了業(yè)務(wù)方和供應商的身份標識體系,為每一個供應商和業(yè)務(wù)方都分配一個身份id,以及一個保密的隨機字符串作為secret_key。每一次調(diào)用都需要調(diào)用者傳遞身份id用以聲明自身身份。如何驗證調(diào)用者是所聲稱的身份,不是冒充者?規(guī)定調(diào)用者需要傳遞參數(shù)簽名,將所有HTTP的參數(shù)按照約定的順序排序,拼接上secret_key,并做哈希計算,哈希值作為簽名參數(shù)傳過來。話務(wù)平臺服務(wù)器收到http請求時,按照同樣的規(guī)則重新計算簽名,如果與傳過來的簽名值一致,則說明調(diào)用者是所聲明的用戶,驗證通過;否則拒絕該次請求。參數(shù)簽名能校驗參數(shù)完整性,如果中間人篡改了參數(shù)值,會導致簽名驗證不通過。參數(shù)中還加入了時間戳,服務(wù)端驗證時間戳是否有效,這可以一定程度上防止中間人截取到URL后重復調(diào)用,從而防止重放攻擊。鎖,并發(fā)分配號碼,以上措施解決了一些冒充、攔截、篡改、重放等安全威脅,但是還有另一種數(shù)據(jù)安全問題,那就是并發(fā)安全。業(yè)務(wù)方請求分配虛擬號,存在共享資源的競爭,號池里的號碼就是共享資源。這一過程,是先從號池里取出一個可用的號碼,再創(chuàng)建綁定關(guān)系。對于兩個并發(fā)請求,怎樣防止取出同一個虛擬號分配出去呢。這種數(shù)據(jù)一致性的問題,可以用分布式鎖來解決。鎖是一個很大的話題,這里就不深入展開了。
總結(jié)下來,話務(wù)平臺在設(shè)計時,重點考慮了以下平臺化思路:提出供應商能力規(guī)范,統(tǒng)一了供應商提供的服務(wù),以建立供應商能力抽象層,方便動態(tài)調(diào)度和切換。抽象出兩種通用的通話模式,即固定關(guān)系模式和會話關(guān)系模式,提供抽象、收斂的接口,滿足不同場景、靈活多變的業(yè)務(wù)需求。號池的設(shè)計,允許快速切換供應商,同時業(yè)務(wù)無感知,并且降低了單個供應商服務(wù)不可用的風險。號碼的回收與復用,節(jié)省號碼資源,節(jié)約成本。