背景技術(shù):
::常規(guī)的通信系統(tǒng)允許諸如個(gè)人計(jì)算機(jī)或移動(dòng)設(shè)備之類(lèi)的客戶端設(shè)備(端點(diǎn))的用戶通過(guò)諸如互聯(lián)網(wǎng)之類(lèi)的基于分組的計(jì)算機(jī)網(wǎng)絡(luò)與一個(gè)或多個(gè)其他的端點(diǎn)進(jìn)行語(yǔ)音或視頻通話。時(shí)常地,由端點(diǎn)進(jìn)行的通話數(shù)據(jù)的通信是由堅(jiān)持經(jīng)同意的通信協(xié)議的端點(diǎn)來(lái)實(shí)現(xiàn)的。其一個(gè)示例是會(huì)話發(fā)起協(xié)議(sip)。廣義上講,sip指示通話根據(jù)基于端點(diǎn)對(duì)端點(diǎn)請(qǐng)求響應(yīng)的事務(wù)范式來(lái)進(jìn)行協(xié)商,其中(除了其他的以外),通話從初始的未連接的狀態(tài)發(fā)展到實(shí)時(shí)媒體可以通過(guò)以下方式在端點(diǎn)之間流動(dòng),sip用戶代理向其他端點(diǎn)的其他用戶代理發(fā)送一系列請(qǐng)求消息并且作為回應(yīng)而接收相應(yīng)的響應(yīng)消息,其中可以類(lèi)似地實(shí)現(xiàn)對(duì)通話的維持和最終的終止。每個(gè)用戶代理可以在通話持續(xù)期間維持狀態(tài)機(jī),其用于追蹤當(dāng)前的通話狀態(tài)。根據(jù)對(duì)突出請(qǐng)求的發(fā)送和對(duì)突出的響應(yīng)的接收來(lái)適當(dāng)?shù)馗聽(tīng)顟B(tài)機(jī)。技術(shù)實(shí)現(xiàn)要素:提供了該
發(fā)明內(nèi)容以用簡(jiǎn)化的形式介紹了進(jìn)一步在下文的具體實(shí)施方式中所描述的概念的選擇。該
發(fā)明內(nèi)容不旨在標(biāo)識(shí)所要求保護(hù)的主題的關(guān)鍵特征或本質(zhì)特征,也不旨在用于限制所要求保護(hù)的主題的范圍。所公開(kāi)的是一種用于經(jīng)由通信網(wǎng)絡(luò)在客戶端設(shè)備的用戶與另一客戶端設(shè)備的另一用戶之間建立實(shí)時(shí)通信事件的方法。所述方法包括在客戶端設(shè)備上運(yùn)行的客戶端通過(guò)經(jīng)由網(wǎng)絡(luò)向另一個(gè)客戶端設(shè)備或者向連接至網(wǎng)絡(luò)的服務(wù)器發(fā)送消息來(lái)執(zhí)行通信事件建立過(guò)程的第一階段。該消息包括與尚未執(zhí)行的通信事件建立過(guò)程的第二階段相關(guān)的多個(gè)選項(xiàng)。針對(duì)多個(gè)選項(xiàng)中的每個(gè)選項(xiàng),該消息包括對(duì)該選項(xiàng)唯一的不同的網(wǎng)絡(luò)地址,其可以被以選擇該選項(xiàng)。所述方法還包括:檢測(cè)對(duì)多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的網(wǎng)絡(luò)地址已經(jīng)被訪問(wèn);并且,作為響應(yīng),根據(jù)多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)而發(fā)起通信事件建立過(guò)程的第二階段。還公開(kāi)的是一種用于經(jīng)由通信網(wǎng)絡(luò)在客戶端設(shè)備的用戶與另一客戶端設(shè)備的另一用戶之間實(shí)現(xiàn)實(shí)時(shí)通信事件的服務(wù)器。所述服務(wù)器包括:計(jì)算機(jī)存儲(chǔ);網(wǎng)絡(luò)接口,其被配置為從網(wǎng)絡(luò)接收消息;以及處理器。所述處理器被配置為接收消息。所述消息包括與通信事件相關(guān)的多個(gè)選項(xiàng),并且針對(duì)多個(gè)選項(xiàng)中的每個(gè)選項(xiàng),可以訪問(wèn)對(duì)該選項(xiàng)唯一的不同的網(wǎng)絡(luò)地址以選擇該選項(xiàng)。所述處理器還被配置為,針對(duì)多個(gè)網(wǎng)絡(luò)地址中的每個(gè)網(wǎng)絡(luò)地址,將該網(wǎng)絡(luò)地址和對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址之間的映射存儲(chǔ)在計(jì)算機(jī)存儲(chǔ)中,將服務(wù)器網(wǎng)絡(luò)地址發(fā)送至另一客戶端設(shè)備或者連接至網(wǎng)絡(luò)的另外的服務(wù)器。所述處理器還被配置為檢測(cè)與對(duì)多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的網(wǎng)絡(luò)地址相對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址已經(jīng)被訪問(wèn),并且響應(yīng)于訪問(wèn)對(duì)該選項(xiàng)唯一的網(wǎng)絡(luò)地址以選擇該選項(xiàng)。附圖說(shuō)明圖1是云平臺(tái)的示意概述;圖2是對(duì)通信系統(tǒng)的示意圖;圖3是對(duì)用戶設(shè)備的示意圖;圖4a是對(duì)數(shù)據(jù)中心的示意圖;圖4b是對(duì)數(shù)據(jù)中心的服務(wù)器的示意圖;圖5a和5b示意性地示出了分層通信系統(tǒng)架構(gòu)的原理;圖6示出了特定配置中的通信系統(tǒng);圖7是通話建立過(guò)程的示意概述;圖8a是針對(duì)通話建立過(guò)程的信令圖;圖8b是示出了可以如何終止通話的信令圖;圖8c是示出了可以如何引導(dǎo)通話的信令圖;圖8d是示出了呼叫者可以如何取消通話的信令圖;圖9是對(duì)由通話控制器部署所存儲(chǔ)的一組uri映射的示意圖;圖10是一系列通話控制器部署的示意圖,所述每個(gè)通話控制器部署實(shí)現(xiàn)一個(gè)uri重寫(xiě)過(guò)程;圖11a是形成對(duì)象圖(例如,通話狀態(tài))的服務(wù)對(duì)象的示意圖,而圖11b是可以如何在存儲(chǔ)器中實(shí)現(xiàn)該圖的示例;圖12a是形成對(duì)象圖(例如,通話狀態(tài))的持續(xù)的和參考對(duì)象的示意圖,而圖12b是可以如何在存儲(chǔ)器中實(shí)現(xiàn)該圖的示例;圖13是針對(duì)序列化過(guò)程的流程圖;圖14是針對(duì)反序列化過(guò)程的流程圖;圖15是針對(duì)實(shí)現(xiàn)通話中服務(wù)請(qǐng)求的方法的流程圖;圖16示意性地示出了示例性活動(dòng)通話狀態(tài)。具體實(shí)施方式當(dāng)在網(wǎng)絡(luò)的端點(diǎn)之間建立諸如通話(例如,音頻通話、音頻和視頻(av)通話等)之類(lèi)的實(shí)時(shí)媒體通信事件時(shí),必須進(jìn)行將包括是否允許雙方彼此進(jìn)行通話、使用什么音頻和視頻編碼解碼器、如何將媒體分組從一方端點(diǎn)路由至另一方等之類(lèi)的多個(gè)因素和變量考慮在內(nèi)的多個(gè)決策。在下文中所描述的實(shí)施例對(duì)來(lái)自“分布式平臺(tái)”(另外被稱(chēng)為“云平臺(tái)”或簡(jiǎn)單地稱(chēng)為“云”)內(nèi)的實(shí)時(shí)媒體通信事件提供了集中式(相對(duì)于基于端點(diǎn)的)控制。即,通話是由在云上運(yùn)行的各種中央控制器來(lái)控制的。云意指經(jīng)由網(wǎng)絡(luò)(例如,互聯(lián)網(wǎng))可訪問(wèn)的計(jì)算平臺(tái),其包括由多個(gè)聯(lián)網(wǎng)的計(jì)算機(jī)設(shè)備和在其上運(yùn)行的系統(tǒng)軟件所組成的分布式計(jì)算機(jī)系統(tǒng),所述計(jì)算機(jī)系統(tǒng)提供了(潛在地非常大的)物理計(jì)算資源池——例如物理處理資源和物理存儲(chǔ)器/存儲(chǔ)資源、易失性的和/或非易失性的——并且系統(tǒng)軟件被配置為通過(guò)實(shí)現(xiàn)多個(gè)獨(dú)立的虛擬機(jī)(vm)(即對(duì)計(jì)算機(jī)系統(tǒng)的軟件仿真)來(lái)劃分該底層物理資源池。云提供者的示例包括windowsazure(tm)、amazonwebservices(tm)等。對(duì)物理計(jì)算機(jī)資源的該池化以及通過(guò)虛擬化劃分該池用于將硬件和軟件考慮去耦合,這是由于(由平臺(tái)的系統(tǒng)軟件所實(shí)現(xiàn)的)虛擬化層提供將物理計(jì)算機(jī)資源(例如,可用的物理處理器時(shí)鐘循環(huán)和存儲(chǔ)器的物理位)與“虛擬的”資源(即,實(shí)際上在每個(gè)虛擬計(jì)算機(jī)系統(tǒng)中被看見(jiàn)的資源)分離所導(dǎo)致的。底層硬件的物理資源可以通過(guò)添加新的物理網(wǎng)絡(luò)計(jì)算機(jī)設(shè)備或者升級(jí)現(xiàn)有的物理聯(lián)網(wǎng)計(jì)算機(jī)來(lái)增加,并且僅僅在傳統(tǒng)兼容性方面需要進(jìn)行的考慮能夠確保經(jīng)升級(jí)的物理計(jì)算機(jī)系統(tǒng)仍然可以運(yùn)行相同的通用虛擬機(jī)(即,不用對(duì)要在這些虛擬機(jī)上運(yùn)行什么操作系統(tǒng)或應(yīng)用代碼進(jìn)行任何考慮)。類(lèi)似地,系統(tǒng)設(shè)計(jì)者可以設(shè)計(jì)系統(tǒng)(可能是具有許多組件的極度復(fù)雜的系統(tǒng)),并且開(kāi)發(fā)與其相關(guān)的代碼,以用于在云平臺(tái)上實(shí)現(xiàn)而免于物理硬件考慮(例如,排序、部署、和容納物理服務(wù)器等)——系統(tǒng)設(shè)計(jì)者只需要在虛擬計(jì)算機(jī)系統(tǒng)的資源限制(不是底層硬件的資源限制)方面考慮計(jì)算機(jī)資源的消耗,對(duì)這些虛擬系統(tǒng)的資源限制是明確定義的并且是已知的。因此,從系統(tǒng)設(shè)計(jì)者的角度來(lái)看,計(jì)算機(jī)資源考慮被降低為對(duì)例如應(yīng)該部署云平臺(tái)中的多少虛擬計(jì)算機(jī)系統(tǒng)的考慮;從平臺(tái)的操作者自身(其可以與系統(tǒng)設(shè)計(jì)者不同)的角度來(lái)看,計(jì)算機(jī)資源被降低為對(duì)例如需要多少物理計(jì)算機(jī)系統(tǒng)來(lái)實(shí)現(xiàn)具有預(yù)先定義的資源分配的、所需數(shù)量的虛擬機(jī)的考慮。在圖1中示出了示例性分布式平臺(tái)100的高級(jí)概述。示例性平臺(tái)包括分布式計(jì)算機(jī)系統(tǒng)114。圖1的計(jì)算機(jī)系統(tǒng)114由非常大數(shù)量的(例如,數(shù)萬(wàn)個(gè))聯(lián)網(wǎng)的計(jì)算機(jī)設(shè)備組成——在一些上下文中,數(shù)量大得足以使得物理計(jì)算資源能夠被認(rèn)為是足夠豐富以至于是有效地?zé)o限的。這些計(jì)算機(jī)設(shè)備被配置以用于與網(wǎng)絡(luò)201(其是基于分組的網(wǎng)絡(luò),例如互聯(lián)網(wǎng))進(jìn)行通信,并且是全球地分布的(例如,跨多個(gè)國(guó)家和/或洲分布)。通常地,這樣的計(jì)算機(jī)系統(tǒng)的分組(例如,數(shù)千個(gè)服務(wù)器)被安置在位于不同地理位置處(例如,在國(guó)家的不同地區(qū)、不同的國(guó)家、不同的洲等中)的相應(yīng)的數(shù)據(jù)中心(數(shù)據(jù)中心)中。系統(tǒng)軟件112在分布式計(jì)算機(jī)系統(tǒng)114頂層運(yùn)行。系統(tǒng)軟件112被配置為實(shí)現(xiàn)獨(dú)立的虛擬機(jī)106、110的兩個(gè)集合104(運(yùn)行時(shí)集合)和108(存儲(chǔ)集合)。運(yùn)行時(shí)集合104包括多個(gè)vm106,其提供用于執(zhí)行應(yīng)用代碼134的運(yùn)行時(shí)環(huán)境,應(yīng)用代碼134是在該虛擬計(jì)算機(jī)系統(tǒng)106上執(zhí)行的。系統(tǒng)軟件112被配置為使得期望利用平臺(tái)100的軟件開(kāi)發(fā)者能夠經(jīng)由網(wǎng)絡(luò)201而將他們的定制代碼134上傳至平臺(tái)100以在其上執(zhí)行。作為響應(yīng),系統(tǒng)軟件812創(chuàng)建這樣的運(yùn)行時(shí)環(huán)境并且將代碼134供應(yīng)給新近創(chuàng)建的運(yùn)行時(shí)環(huán)境以供執(zhí)行。通過(guò)系統(tǒng)軟件調(diào)解對(duì)分配給該環(huán)境的底層的物理處理資源和(主要由物理易失性存儲(chǔ)器在物理等級(jí)實(shí)現(xiàn)的)物理存儲(chǔ)器資源的訪問(wèn)使得在虛擬系統(tǒng)106上執(zhí)行該代碼134成為可能。存儲(chǔ)集合108包括被配置為提供數(shù)據(jù)存儲(chǔ)的多個(gè)虛擬機(jī)110。每個(gè)虛擬機(jī)具有對(duì)應(yīng)的應(yīng)用程序接口(api)111,api111可以用于例如通過(guò)代碼134進(jìn)行對(duì)其的合適的函數(shù)調(diào)用而往來(lái)于分配給計(jì)算機(jī)系統(tǒng)110的(主要由物理非易失性存儲(chǔ)器在物理等級(jí)實(shí)現(xiàn)的)物理存儲(chǔ)器資源實(shí)現(xiàn)對(duì)數(shù)據(jù)的傳輸?shù)臄?shù)據(jù)。再一次,該傳輸是由系統(tǒng)軟件112調(diào)解的。實(shí)施例提供了一種系統(tǒng),其包括保存被配置為實(shí)現(xiàn)各種類(lèi)型的控制器的代碼的計(jì)算機(jī)存儲(chǔ)。這些包括:1.通話控制器,其處理高等級(jí)信令功能,例如用于建立通信事件,例如兩個(gè)或多個(gè)用戶之間的通話,以及針對(duì)對(duì)所建立的通信事件的高等級(jí)管理,例如,通話中管理,例如添加/移除參與者、添加/移除媒體模態(tài)等,以及終止所建立的通信事件;2.一個(gè)或多個(gè)媒體(模態(tài))控制器,每個(gè)用于管理所建立的通信事件的媒體模態(tài);媒體模態(tài)控制器在通話控制器的控制下控制實(shí)際的媒體內(nèi)容的流動(dòng),例如,通過(guò)控制在參與的端點(diǎn)之間建立覆蓋網(wǎng)絡(luò)連接(例如,對(duì)等和/或中繼連接)的方式;媒體模態(tài)包括音頻、視頻、屏幕共享、共享的白板等。在一些實(shí)施例中,媒體模態(tài)服務(wù)僅僅是針對(duì)群通話(三個(gè)或更多用戶之間的)而傳遞的??刂破鞯膶?shí)例是由在云平臺(tái)的一個(gè)或多個(gè)vm上執(zhí)行的應(yīng)用代碼來(lái)實(shí)現(xiàn)的。即,通話控制器(cc)是負(fù)責(zé)兩方通話的通話建立&管理的服務(wù)器實(shí)體,并且其也幫助多方通話建立&管理。通話代理(ca)是用于指代與通話控制器進(jìn)行交互的客戶端實(shí)體的術(shù)語(yǔ)。0.概述:0.1底層系統(tǒng)組件:圖2示出了通信系統(tǒng)200。通信系統(tǒng)200包括網(wǎng)絡(luò)201。連接至網(wǎng)絡(luò)200的是與第一用戶302a(“alice”)相關(guān)聯(lián)的用戶設(shè)備(也稱(chēng)為用戶設(shè)備或客戶端設(shè)備)204a以及與第二用戶202b(“bob”)相關(guān)聯(lián)的另外的用戶設(shè)備204b。用戶設(shè)備204a、204b是網(wǎng)絡(luò)201的端點(diǎn)。用戶設(shè)備204a、204b被布置成從相關(guān)用戶接收信息并且將信息輸出給相關(guān)用戶。盡管在圖2中僅僅示出了兩個(gè)用戶設(shè)備,但是在通信系統(tǒng)200中可以包括更多的用戶設(shè)備。每個(gè)用戶設(shè)備是這樣的計(jì)算機(jī)設(shè)備,其可以采取各種形式,例如臺(tái)式計(jì)算機(jī)或膝上型計(jì)算機(jī)、移動(dòng)通話(例如,智能電話)、平板計(jì)算設(shè)備、可穿戴計(jì)算設(shè)備、電視機(jī)(例如,智能tv)、機(jī)頂盒、游戲控制臺(tái)等。同樣連接至網(wǎng)絡(luò)301的是多個(gè)數(shù)據(jù)中心(dc)220a、220b、…、220c和業(yè)務(wù)管理系統(tǒng)230。業(yè)務(wù)管理系統(tǒng)230包括一個(gè)或多個(gè)存儲(chǔ)器設(shè)備234以及一個(gè)或多個(gè)處理器,所述一個(gè)或多個(gè)處理器被配置為執(zhí)行用于管理如在下文中更加詳細(xì)地描述的數(shù)據(jù)中心業(yè)務(wù)的業(yè)務(wù)管理代碼232(業(yè)務(wù)管理器/業(yè)務(wù)管理邏輯)。業(yè)務(wù)管理系統(tǒng)230和數(shù)據(jù)中心220形成了分布式平臺(tái)800的一部分。作為代理服務(wù)器的服務(wù)器602也連接至網(wǎng)絡(luò)201,將以正當(dāng)行為來(lái)描述其功能。圖4示出了用戶設(shè)備204(例如,用戶設(shè)備204a和204b)的詳細(xì)視圖。用戶設(shè)備204包括中央處理單元(“cpu”)302,向其連接有:輸出設(shè)備,例如可以被實(shí)現(xiàn)為觸摸屏的顯示器304,以及用于輸出音頻信號(hào)的揚(yáng)聲器(或“擴(kuò)音器”)310;輸入設(shè)備,例如用于接收音頻信號(hào)的麥克風(fēng)326、用于接收?qǐng)D像數(shù)據(jù)的相機(jī)308、以及鍵盤(pán)306;用于存儲(chǔ)數(shù)據(jù)的存儲(chǔ)器326;以及網(wǎng)絡(luò)接口324,例如用于與網(wǎng)絡(luò)201進(jìn)行通信的調(diào)制解調(diào)器。用戶設(shè)備204可以包括除了在圖4中所示出的那些的其他元件。顯示器304、揚(yáng)聲器310、麥克風(fēng)312、存儲(chǔ)器326、相機(jī)308、鍵盤(pán)306、和網(wǎng)絡(luò)接口324將被集成到用戶設(shè)備204中??商娲兀@示器304、揚(yáng)聲器310、麥克風(fēng)312、存儲(chǔ)器326、相機(jī)308、鍵盤(pán)306、和網(wǎng)絡(luò)接口324中的一個(gè)或多個(gè)可以不被集成到用戶設(shè)備中,并且可以經(jīng)由相應(yīng)的接口而連接至cpu302。這樣的接口的一個(gè)示例是usb接口。如果用戶設(shè)備204經(jīng)由網(wǎng)絡(luò)接口324至網(wǎng)絡(luò)201的連接是無(wú)線連接,則網(wǎng)絡(luò)接口324可以包括用于將信號(hào)無(wú)線地發(fā)送至網(wǎng)絡(luò)201并且從網(wǎng)絡(luò)201無(wú)線地接收信號(hào)的天線。圖4還示出了在cpu302上執(zhí)行的操作系統(tǒng)(“os”)314。在os314的頂層運(yùn)行的是通信系統(tǒng)200的通信客戶端應(yīng)用(客戶端)的實(shí)例316的軟件堆棧??蛻舳?16與操作系統(tǒng)314進(jìn)行通信并且通過(guò)通信系統(tǒng)200來(lái)管理連接,包括與其他用戶設(shè)備以及與數(shù)據(jù)中心220的連接。客戶端316具有客戶端用戶接口(“ui”),其用于向設(shè)備的用戶呈現(xiàn)信息并且從設(shè)備的用戶接收信息。軟件堆棧示出了客戶端協(xié)議層418、客戶端引擎層420、和客戶端用戶接口層422。每一層負(fù)責(zé)特定的功能。因?yàn)槊恳粚油ǔEc其他兩個(gè)層進(jìn)行通信,所以它們被認(rèn)為布置在堆棧中,如在圖3中所示出的那樣。操作系統(tǒng)314管理設(shè)備204的硬件資源并且處理經(jīng)由網(wǎng)絡(luò)接口324往來(lái)于網(wǎng)絡(luò)201所發(fā)送的數(shù)據(jù)??蛻舳塑浖目蛻舳藚f(xié)議層318與操作系統(tǒng)314進(jìn)行通信并且通過(guò)通信系統(tǒng)200來(lái)管理所述連接。需要較高等級(jí)的處理的過(guò)程被傳遞至客戶端引擎層320??蛻舳艘?20也與客戶端用戶接口層322進(jìn)行通信??蛻舳艘?20被布置為控制客戶端用戶接口層322以經(jīng)由客戶端的用戶接口向用戶呈現(xiàn)信息,并且經(jīng)由所述用戶接口從用戶接收信息。以該方式,客戶端216執(zhí)行所需的處理以允許用戶(例如,alice、bob)通過(guò)通信系統(tǒng)200進(jìn)行通信。用戶接口可以包括,例如,經(jīng)由顯示器24輸出信息的圖形用戶界面(gui)和/或使得用戶能夠以“自然的”方式與設(shè)備進(jìn)行交互而脫離了由諸如鼠標(biāo)、鍵盤(pán)、遠(yuǎn)程控制等之類(lèi)的某些輸入設(shè)備所施加的人為的約束的自然用戶界面(nui)。nui方法的示例包括利用以下項(xiàng)的那些方法:觸摸感應(yīng)顯示器、語(yǔ)音和話音識(shí)別、意圖和目標(biāo)理解、使用深度相機(jī)(例如,立體或飛行時(shí)間相機(jī)系統(tǒng)、紅外相機(jī)系統(tǒng)、rgb相機(jī)系統(tǒng)、以及這些的組合)的運(yùn)動(dòng)姿勢(shì)檢測(cè)、使用加速度計(jì)/陀螺儀的運(yùn)動(dòng)姿勢(shì)檢測(cè)、面部識(shí)別、3d顯示器、頭部、眼睛和視線追蹤、浸入式增強(qiáng)現(xiàn)實(shí)和虛擬現(xiàn)實(shí)系統(tǒng)等??蛻舳艘鎸影ǘ鄠€(gè)服務(wù)代理512。每個(gè)服務(wù)代理處理實(shí)時(shí)媒體通信事件(例如,通話)的不同方面。代理意指定義了端點(diǎn)如何與具體的云服務(wù)進(jìn)行交互的端點(diǎn)/客戶端邏輯實(shí)現(xiàn),例如,針對(duì)通話代理的通話控制器;針對(duì)媒體模態(tài)代理的媒體模態(tài)控制器等。所述代理可以在客戶端的軟件庫(kù)中被實(shí)施。圖4a是對(duì)數(shù)據(jù)中心220(例如,數(shù)據(jù)中心220a、220b、220c…)的示意圖。數(shù)據(jù)中心包括多個(gè)服務(wù)器444、404a、404b、404c;網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)480,其連接至網(wǎng)絡(luò)210,以用于在數(shù)據(jù)中心220內(nèi)的聯(lián)網(wǎng)設(shè)備之間交換數(shù)據(jù)分組,并且經(jīng)由網(wǎng)絡(luò)201與在數(shù)據(jù)中心外部的設(shè)備交換數(shù)據(jù)分組;以及電力基礎(chǔ)結(jié)構(gòu)490,其用于向數(shù)據(jù)中心的設(shè)備提供電力。服務(wù)器404a、404b、和服務(wù)器402c由電源492供電,并且電源492其自身分別地從電力基礎(chǔ)結(jié)構(gòu)490供電。數(shù)據(jù)中心還包括連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)480的數(shù)據(jù)中心業(yè)務(wù)管理系統(tǒng)488,其用于接收來(lái)自網(wǎng)絡(luò)201去往數(shù)據(jù)中心220的入站業(yè)務(wù)并跨服務(wù)器404a、404b、404c來(lái)分配所述業(yè)務(wù),并且用于跨數(shù)據(jù)中心220的其他服務(wù)器(例如,404b、404c)來(lái)分配來(lái)自數(shù)據(jù)中心220的一個(gè)服務(wù)器(例如,404a)的內(nèi)部業(yè)務(wù)。dc業(yè)務(wù)管理系統(tǒng)可以包括諸如硬件負(fù)載平衡器之類(lèi)的組件、在合適的計(jì)算機(jī)系統(tǒng)上執(zhí)行的軟件、或其組合。服務(wù)器404a、404b、404c中的每個(gè)服務(wù)器包括至相應(yīng)的網(wǎng)絡(luò)接口484a、484b、484c的相應(yīng)的處理器406a、406b、406c,以用于與其他聯(lián)網(wǎng)設(shè)備交換數(shù)據(jù)。每個(gè)處理器能夠直接訪問(wèn)相應(yīng)的存儲(chǔ)器414a、414b、414c;以給處理器提供對(duì)保存在計(jì)算機(jī)存儲(chǔ)中的數(shù)據(jù)的訪問(wèn)。網(wǎng)絡(luò)接口484a和484b連接至網(wǎng)絡(luò)交換機(jī)482,其使得服務(wù)器404a和404b能夠彼此發(fā)送和接收數(shù)據(jù),并且經(jīng)由該交換機(jī)482往來(lái)于直接連接至該交換機(jī)482的任何其他服務(wù)器(未示出)而發(fā)送和接收數(shù)據(jù)。網(wǎng)絡(luò)接口484c連接至網(wǎng)絡(luò)交換機(jī)482’,其使得服務(wù)器404c能夠經(jīng)由該交換機(jī)482’往來(lái)于直接連接至該交換機(jī)482’的任何其他服務(wù)器(未示出)而發(fā)送和接收數(shù)據(jù)。交換機(jī)482連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)480,其也使得服務(wù)器404a、404b以及連接至交換機(jī)482的任何其他服務(wù)器(未示出)能夠往來(lái)于連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)(例如,經(jīng)由諸如交換機(jī)482’之類(lèi)的其他交換機(jī)這樣連接的設(shè)備)的其他設(shè)備以及連接至網(wǎng)絡(luò)201的另外的設(shè)備而發(fā)送和接收數(shù)據(jù)。交換機(jī)482’類(lèi)似地連接以提供等同的功能。服務(wù)器444是針對(duì)數(shù)據(jù)中心220的控制服務(wù)器:其負(fù)責(zé)對(duì)數(shù)據(jù)中心中的其他服務(wù)器的控制和監(jiān)測(cè)。控制服務(wù)器444從電源495供電,電源495本身從電力基礎(chǔ)結(jié)構(gòu)490供電??刂品?wù)器444包括處理器446,其連接至存儲(chǔ)器454和網(wǎng)絡(luò)接口486,以用于與其他聯(lián)網(wǎng)設(shè)備交換數(shù)據(jù)。網(wǎng)絡(luò)接口486連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)480,其使得控制服務(wù)器444能夠與連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)的其他設(shè)備(包括服務(wù)器404a、404b、404c)以及連接至網(wǎng)絡(luò)201的另外的設(shè)備(例如,圖3中的204a、204b)交換數(shù)據(jù)。服務(wù)器404a、404b、404c被分組為相應(yīng)的故障域402、402’,故障域是共享公共的故障點(diǎn)的一組服務(wù)器(即,依賴(lài)于用于操作的相同的物理電子組件的服務(wù)器,其故障因此禁止了所有這些服務(wù)器的操作)。例如,服務(wù)器404a和404b經(jīng)由對(duì)于服務(wù)器408a、408b是公共的網(wǎng)絡(luò)交換機(jī)482而連接至網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)580;該交換機(jī)482的故障引起了服務(wù)器404a、404b中的每個(gè)以及連接至該交換機(jī)的任何其他服務(wù)器的故障,這是因?yàn)樗羞@樣的服務(wù)器變得與網(wǎng)絡(luò)基礎(chǔ)結(jié)構(gòu)480斷開(kāi),并且因此在該事件中與網(wǎng)絡(luò)201斷開(kāi)。因此,可以說(shuō)網(wǎng)絡(luò)交換機(jī)482將故障域定義為連接至該交換機(jī)482的所有服務(wù)器中的一組服務(wù)器。類(lèi)似地,服務(wù)器404a和404b兩者都從自身由是電力基礎(chǔ)結(jié)構(gòu)409供電的電源492供電;該電源492的故障引起了服務(wù)器404a、404b中的每個(gè)以及由該電源492供電的任何其他服務(wù)器的故障。因此,電源492定義了故障域,其是由該電源492供電的所有服務(wù)器中的一組服務(wù)器。在圖4a中,被示出連接至交換機(jī)482的每個(gè)服務(wù)器也被示出由電源492供電,因此圖4a中的交換機(jī)482和電源492定義了公共的故障域402;通常而言,由同一電源供電的服務(wù)器可以連接至不同的網(wǎng)絡(luò)交換機(jī),并且反之亦然。類(lèi)似地,圖4a示出了特征在于網(wǎng)絡(luò)交換機(jī)482以及電源492’的第二故障域402’。故障域402’的服務(wù)器404c被示出為連接至交換機(jī)482’和電源492’。數(shù)據(jù)中心220在故障域202、202’中以及在特征為額外的網(wǎng)絡(luò)交換機(jī)、電源、和其他物理組件(未示出)的其他故障域兩者中包括額外的服務(wù)器(有可能數(shù)千個(gè))。圖4b示出了服務(wù)器303(例如,404a、404b、404c)的另外的細(xì)節(jié)。處理器406(例如,406a、406b、406c)運(yùn)行管理程序。管理程序是創(chuàng)建、運(yùn)行、和管理虛擬機(jī)410i、410ii的一段計(jì)算機(jī)軟件。相應(yīng)的操作系統(tǒng)420i、420ii(例如,windowsserver(tm))在每一個(gè)vm410i、410ii上運(yùn)行,并且進(jìn)而,相應(yīng)的應(yīng)用代碼410i、410ii在每一個(gè)操作系統(tǒng)420i、420ii上運(yùn)行。所述應(yīng)用代碼可以實(shí)現(xiàn)控制器,例如通話控制器、媒體模態(tài)控制器。處理器406具有存儲(chǔ)器414(例如,414a、414b、414c),其可以由處理器406直接訪問(wèn)。為了在處理器上運(yùn)行應(yīng)用的實(shí)例,將應(yīng)用代碼410i/410ii從外部計(jì)算機(jī)存儲(chǔ)(即,外部的且對(duì)于處理器而言可間接存取)加載到存儲(chǔ)器414a、414b、414c中,以使得處理器406a、406b、406c能夠直接訪問(wèn)存儲(chǔ)器414中的應(yīng)用代碼。對(duì)應(yīng)的運(yùn)行時(shí)狀態(tài)數(shù)據(jù)也被保存在存儲(chǔ)器414中,其當(dāng)實(shí)例進(jìn)展時(shí)被更新,例如當(dāng)從網(wǎng)絡(luò)301接收實(shí)例過(guò)程消息時(shí)。同一控制器的兩個(gè)實(shí)例(例如,通話控制器、媒體模態(tài)控制器)能夠傳遞相同的服務(wù)(例如,通話控制、媒體模態(tài)控制),并且在某一程度上可互換,以使得特定控制的不同實(shí)例可以以在不同的時(shí)間點(diǎn)處控制相同的通信事件的相關(guān)方面而結(jié)束。通信系統(tǒng)300對(duì)例如由客戶端316的對(duì)應(yīng)的代理512(例如,通話代理、媒體代理)向特定的控制器(例如,通話控制器、媒體模態(tài)控制器)發(fā)起的消息進(jìn)行響應(yīng)。具體而言,作為響應(yīng),通信系統(tǒng)300分配該控制器的實(shí)例以處理所述消息。在一定程度上,實(shí)例是通過(guò)直截了當(dāng)?shù)呢?fù)載平衡的方式來(lái)分配的,但是,如下文中所解釋的,不總是該情況。在下文中,術(shù)語(yǔ)“服務(wù)邏輯”(等同為“部署”)用于指代可以傳遞相同服務(wù)(例如,通話控制、媒體模態(tài)控制)的一組特定的實(shí)例。這些實(shí)例中的任何兩個(gè)可以在不同的處理器上運(yùn)行,或者它們可以剛好在同一處理器上運(yùn)行。每個(gè)服務(wù)邏輯具有分層結(jié)構(gòu),現(xiàn)在將參考圖6a和6b來(lái)對(duì)其進(jìn)行描述。通常而言,控制器將利用在各種通話間共享的其資源來(lái)同時(shí)地處理多個(gè),并且可能是很多個(gè)通話等。如在圖5a中所示出的,云100適用于在具有第一類(lèi)型的第一服務(wù)器邏輯523[1](即,能夠傳遞第一服務(wù))的至少第一分組502[1]處和具有第二類(lèi)型的第二服務(wù)邏輯523[2](即,能夠傳遞第二服務(wù))的分組502[2]處運(yùn)行。用戶設(shè)備204的客戶端216包括針對(duì)每種類(lèi)型的服務(wù)的服務(wù)代理512[2](第一類(lèi)型)、512[2](第二類(lèi)型)。服務(wù)代理512[1]可以經(jīng)由網(wǎng)絡(luò)201與第一類(lèi)型的服務(wù)邏輯523[1]中的每個(gè)服務(wù)邏輯進(jìn)行通信,而服務(wù)代理523[2]可以經(jīng)由網(wǎng)絡(luò)201與第二類(lèi)型的服務(wù)邏輯523[2]中的每個(gè)服務(wù)邏輯進(jìn)行通信。每個(gè)服務(wù)代理512和每個(gè)服務(wù)邏輯523可以與業(yè)務(wù)管理器230進(jìn)行通信。服務(wù)邏輯以及他們相應(yīng)的代理之間的通信在某種程度上是由業(yè)務(wù)管理器330調(diào)解的。例如,當(dāng)通話代理或媒體代理首先請(qǐng)求通話控制或媒體模態(tài)控制服務(wù)時(shí),該代理將請(qǐng)求引導(dǎo)至業(yè)務(wù)管理器,所述業(yè)務(wù)管理器基于諸如在相應(yīng)的數(shù)據(jù)中心、地理位置等處的資源可用性之類(lèi)的合適的標(biāo)準(zhǔn)來(lái)選擇特定的通話控制或媒體模態(tài)控制邏輯。此后,通話/媒體模態(tài)代理可以將針對(duì)特定的通信事件的相關(guān)消息引導(dǎo)至所選擇的通話/媒體模態(tài)服務(wù)邏輯。如在圖5b中所示出的,用于傳遞特定的服務(wù)的服務(wù)邏輯包括協(xié)作以傳遞該服務(wù)的一個(gè)或多個(gè)聚類(lèi)542、552。聚類(lèi)的示例包括在windowsazure(tm)云平臺(tái)上實(shí)現(xiàn)的網(wǎng)絡(luò)和工作者角色。在該實(shí)施例中,每個(gè)服務(wù)邏輯是在相應(yīng)的單個(gè)數(shù)據(jù)中心(例如,220a、220b、220c中的一個(gè))上實(shí)現(xiàn)的。服務(wù)邏輯的每個(gè)聚類(lèi)包括負(fù)載平衡器548、558以及執(zhí)行應(yīng)用代碼434的相應(yīng)的實(shí)例的一個(gè)或多個(gè)虛擬機(jī)410。聚類(lèi)的負(fù)載平衡器可以從網(wǎng)絡(luò)201接收消息,并且將這些請(qǐng)求引導(dǎo)至所述聚類(lèi)的vm中的任何一個(gè)vm,例如以輪循的方式或者基于所述vm的所監(jiān)測(cè)的資源可用性(例如,將到來(lái)的請(qǐng)求引導(dǎo)至當(dāng)前具有最多可用資源的vm)。聚類(lèi)的負(fù)載平衡器假定該聚類(lèi)的每個(gè)vm被等同地配置為能夠處理由該負(fù)載平衡器所接收的任何消息。圖5b示出了服務(wù)邏輯542,其包括具有相應(yīng)的負(fù)載平衡器548、558的至少兩個(gè)聚類(lèi)522和552。聚類(lèi)542包括至少兩個(gè)vm410a、410b。vm510a執(zhí)行第一應(yīng)用代碼的實(shí)例434a,而vm410b執(zhí)行第一應(yīng)用代碼的另一實(shí)例434b。類(lèi)似地,聚類(lèi)452包括至少兩個(gè)vm410a’、410b’。vm410a’執(zhí)行第二應(yīng)用代碼的實(shí)例434a’,而vm510b’執(zhí)行第二應(yīng)用代碼的實(shí)例434b’。服務(wù)邏輯的聚類(lèi)可以被配置為暴露一個(gè)或多個(gè)外部可尋址的接口424和/或一個(gè)或多個(gè)內(nèi)部可尋址的接口556,其可以被調(diào)用以便建立用于與該聚類(lèi)交換數(shù)據(jù)的邏輯連接。內(nèi)部接口556僅僅能夠由同一服務(wù)邏輯的其他聚類(lèi)訪問(wèn),而外部接口能夠例如由對(duì)應(yīng)的客戶端側(cè)服務(wù)代理512從聚類(lèi)外部訪問(wèn)。聚類(lèi)的接口耦合到該聚類(lèi)的負(fù)載平衡器,以使得由該負(fù)載平衡器來(lái)接收使用該接口被引導(dǎo)至該聚類(lèi)的任何請(qǐng)求,以用于轉(zhuǎn)發(fā)至該聚類(lèi)的vm(該轉(zhuǎn)發(fā)對(duì)該聚類(lèi)外部是不可見(jiàn)的)。圖5b示出了暴露外部接口524(其耦合至該聚類(lèi)的負(fù)載平衡器548)的聚類(lèi)552,以及暴露內(nèi)部接口556(耦合至該聚類(lèi)的負(fù)載平衡器558)的聚類(lèi)552??梢杂靡韵路绞街械囊环N或多種方式來(lái)增加(相應(yīng)地,降低)針對(duì)任何類(lèi)型的服務(wù)(例如,通話控制、媒體模態(tài)控制)的資源分配:-通過(guò)部署具有該類(lèi)型的額外的(相應(yīng)地,終止現(xiàn)有的)服務(wù)邏輯,即通過(guò)將物理計(jì)算機(jī)資源分配至具有第一類(lèi)型的新的服務(wù)邏輯(相應(yīng)地,對(duì)現(xiàn)有的該類(lèi)型的服務(wù)邏輯重新分配計(jì)算機(jī)資源)——其一個(gè)示例將是在windowsazuretm云平臺(tái)上部署新的網(wǎng)絡(luò)應(yīng)用;-通過(guò)增加(相應(yīng)地,降低)具有第一類(lèi)型的現(xiàn)有的一個(gè)或多個(gè)服務(wù)邏輯的組件內(nèi)的虛擬機(jī)的數(shù)量,即增加(相應(yīng)地,降低)針對(duì)該組件的計(jì)算機(jī)資源分配——其一個(gè)示例將是改變windowsazuretm云平臺(tái)上的網(wǎng)絡(luò)應(yīng)用的網(wǎng)絡(luò)角色或工作者角色內(nèi)的實(shí)例的數(shù)量;-通過(guò)增加(相應(yīng)地,降低)具有第一類(lèi)型的現(xiàn)有的一個(gè)或多個(gè)服務(wù)邏輯的組件內(nèi)的復(fù)本(duplicate)虛擬機(jī)的“大小”,即增加(相應(yīng)地,降低)分配至特定的組件的每個(gè)這樣的復(fù)本虛擬機(jī)的相應(yīng)的計(jì)算機(jī)資源——其一個(gè)示例將是調(diào)整windowsazuretm云平臺(tái)上的網(wǎng)絡(luò)應(yīng)用的網(wǎng)絡(luò)角色或工作者角色的大小。使用后兩種技術(shù),可以將資源與其他服務(wù)邏輯(相同類(lèi)型或不同類(lèi)型的服務(wù)邏輯)無(wú)關(guān)地分配至一個(gè)服務(wù)邏輯(即,一個(gè)部署)。例如,可以將更多vm添加至具有第一類(lèi)型的第一服務(wù)邏輯的組件,和/或可以調(diào)整這些組件的vm的大小,而不改變具有該類(lèi)型的其他服務(wù)邏輯的組件并且不改變具有不同類(lèi)型的其他服務(wù)邏輯的組件。此外,使用后兩種技術(shù),可以將資源彼此獨(dú)立地分配至同一服務(wù)邏輯的不同組件(例如,在不改變另一個(gè)組件的情況下,將vm添加至一個(gè)組件,或者改變一個(gè)組件的vm的大小)。0.2系統(tǒng)架構(gòu)概述在本文中,術(shù)語(yǔ)“事務(wù)”指的是一系列的低等級(jí)操作,其共同地實(shí)現(xiàn)高等級(jí)控制操作,例如建立通信事件、終止已建立的通信事件、或者執(zhí)行通話中功能,所述通話中功能例如:在已建立的通信事件期間將參與者添加至已建立的通信事件或者將參與者從已建立的通信事件移除、將已建立的通信事件設(shè)置為掛起、在已建立的通信事件期間將媒體模態(tài)(例如,音頻、視頻)添加至已建立的通信事件/將媒體模態(tài)(例如,音頻、視頻)從已建立的通信事件移除等。事務(wù)涉及在被指定在客戶端上實(shí)現(xiàn)事務(wù)和相關(guān)代理512的實(shí)例之間經(jīng)由網(wǎng)絡(luò)201來(lái)發(fā)送和/或接收一個(gè)或多個(gè)消息。在下文描述的實(shí)施例中,由控制器的同一實(shí)例來(lái)執(zhí)行任何一項(xiàng)事務(wù)。這不是必需的;其是通過(guò)重新使用在事務(wù)開(kāi)始時(shí)所創(chuàng)建的資源和上下文來(lái)使得事務(wù)處理時(shí)間更快的一種優(yōu)化。這不顯著地?fù)p害系統(tǒng)的高可用性,是因?yàn)槭聞?wù)的壽命相當(dāng)短,并且當(dāng)處理實(shí)例在處理正在進(jìn)行的事務(wù)時(shí)處理實(shí)例死亡的可能性非常低。然而放棄該優(yōu)化(為了高可用性),并且允許任何實(shí)例來(lái)處理事務(wù)中消息是可能的——為了實(shí)現(xiàn)這一點(diǎn),在處理了每條消息之后,通話控制器實(shí)例將通話狀態(tài)轉(zhuǎn)儲(chǔ)(flush)至外部存儲(chǔ);在處理新消息之前,接收新的消息的處理實(shí)例從外部存儲(chǔ)器提取所述狀態(tài)、重建通話狀態(tài)、并且重新初始化可能需要的任何其他資源(例如,至客戶端的tls/tcp連接)。以下呈現(xiàn)了:1.信令協(xié)議,其使能在客戶端代理和控制器之間進(jìn)行通信(章節(jié)1);2.用于將通信事件的狀態(tài)數(shù)據(jù)串行化以使得控制器的不同實(shí)例可以處理不同的事務(wù)的機(jī)制(章節(jié)2)3.用于確保在可能的情況下,每一單個(gè)事務(wù)由控制器的同一實(shí)例來(lái)處理的機(jī)制(章節(jié)3)。應(yīng)當(dāng)注意的是,上文的機(jī)制“2”在多個(gè)實(shí)例處理相同事務(wù)的實(shí)例中可以用于允許不同的實(shí)例處理與相同事務(wù)相關(guān)的消息。例如,在圖5b中,服務(wù)邏輯523的第一聚類(lèi)522可以實(shí)現(xiàn)主要控制服務(wù)(例如,通話控制、媒體模態(tài)控制)。接著,第二聚類(lèi)552可以實(shí)現(xiàn)用于支持主要控制服務(wù)的輔助服務(wù),例如由在聚類(lèi)中的每個(gè)vm上運(yùn)行的第二代碼所實(shí)現(xiàn)的數(shù)據(jù)存儲(chǔ)服務(wù),其被配置為提供用于訪問(wèn)在聚類(lèi)間共享的計(jì)算機(jī)存儲(chǔ)的接口。接著,通話/媒體模態(tài)控制器實(shí)例434a、434b可以在針對(duì)特定通信事件的事務(wù)結(jié)束時(shí)向第二聚類(lèi)552寫(xiě)入可以由第一聚類(lèi)522的其他實(shí)例訪問(wèn)的經(jīng)序列化的狀態(tài)數(shù)據(jù),以使得它們能夠處理針對(duì)特定通信事件的未來(lái)的事務(wù)。圖6示出了通信系統(tǒng)200的示例性配置??蛻舳?16包括通話代理512c和媒體代理512m。通話代理512c可以將發(fā)起消息經(jīng)由網(wǎng)絡(luò)201引導(dǎo)至通話控制服務(wù)邏輯523c的通話控制器聚類(lèi)522c的外部接口524c。通話控制器聚類(lèi)包括通話控制器的多個(gè)實(shí)例434c1、434c2。通話控制器聚類(lèi)522c的負(fù)載平衡器548c針對(duì)每條消息而選擇通話控制器實(shí)例中的一個(gè)實(shí)例并且將消息引導(dǎo)至所選擇的實(shí)例。所選擇的實(shí)例以在下文中所描述的方式來(lái)處理該消息。通話控制服務(wù)邏輯523c還包括存儲(chǔ)聚類(lèi)552c,其包括數(shù)據(jù)存儲(chǔ)軟件(例如,azuretablestore等)的一個(gè)或多個(gè)實(shí)例434s1、434s2。數(shù)據(jù)存儲(chǔ)軟件實(shí)例434s1、434s2提供對(duì)計(jì)算機(jī)存儲(chǔ)608的訪問(wèn)。存儲(chǔ)聚類(lèi)552c可以由通話控制器聚類(lèi)522c經(jīng)由前者的內(nèi)部接口(在圖6中未示出,但是如在上文中所描述的)來(lái)訪問(wèn)。媒體代理512m可以經(jīng)由網(wǎng)絡(luò)201將消息發(fā)起至媒體模態(tài)控制服務(wù)邏輯523m的媒體模態(tài)控制器聚類(lèi)522m的外部接口524m,其被類(lèi)似地引導(dǎo)至在聚類(lèi)522m中所選擇的媒體模態(tài)實(shí)例434m1、434m2。在客戶端31與代理服務(wù)器604之間建立了開(kāi)放的(即進(jìn)行中的)連接604。該連接是websocket連接,其在代理服務(wù)器602與客戶端設(shè)備204之間提供全雙工通信。websocket連接是本領(lǐng)域公知的。通話控制器434c、434c2和媒體模態(tài)控制器434m1、434m2的實(shí)例可以經(jīng)由代理服務(wù)器602而分別地向通話代理512c和媒體代理512m發(fā)送信號(hào)。這使得控制器實(shí)例能夠?qū)⑾⒁龑?dǎo)至它們對(duì)應(yīng)的代理,即使客戶端設(shè)備204在網(wǎng)絡(luò)地址翻譯器(nat)或防火墻之后。通話控制器可以建立諸如通話之類(lèi)的通信事件(對(duì)話),并且可以管理所建立的對(duì)話;其負(fù)責(zé)發(fā)送信號(hào)以實(shí)現(xiàn)以下各項(xiàng):1.通話建立;2.重新協(xié)商,例如:a.保持/釋放;b.添加/移除視頻或其他媒體模態(tài),例如屏幕共享或者所共享的白板;3.通話拆除;4.通話相關(guān)名單更新。名單意指與參與該通話的各種端點(diǎn)有關(guān)的信息。使用該信息,客戶端可以給ui提供例如通話中的參與者的列表,并且可以允許操作例如移除通話參與者(“移除參與者”),將通話參與者靜音(“將參與者靜音”)等。通話控制器還可以通過(guò)媒體模態(tài)控制器實(shí)例來(lái)引導(dǎo)并控制媒體模態(tài)服務(wù),而在一些實(shí)施例中,媒體模態(tài)控制器僅僅用于群通話。1.信令協(xié)議;在下文中呈現(xiàn)了用于在通話代理與通話控制器實(shí)例之間發(fā)送信號(hào)的機(jī)制。這些是在通話控制器的上下文中描述的,但是底層原理中的一些底層原理可以應(yīng)用于其他類(lèi)型的云服務(wù)(例如,應(yīng)用于媒體模態(tài)控制器)。所述協(xié)議提供了:1.使用回?fù)苕溄幼鳛橛糜诎l(fā)送消息以驅(qū)動(dòng)客戶端和服務(wù)器兩者上的狀態(tài)機(jī)(例如,通話控制器)的機(jī)制;2.使用url重寫(xiě)(由通話控制器)來(lái)創(chuàng)建可以提供安全性的攔截服務(wù)器(通過(guò)將所涉及方的路由細(xì)節(jié)彼此隱藏),并且還確保通話維持在一致的狀態(tài);3.使用url重寫(xiě)來(lái)允許創(chuàng)建可以通過(guò)添加或更新url來(lái)添加新功能的代理(參見(jiàn)下文中的章節(jié)1.4);4.使用url重寫(xiě)來(lái)透明地提供高可用性。不同的回?fù)苕溄涌梢灾赶虿煌瑢?shí)體,其可以當(dāng)客戶端將回?fù)苕溄右暈椴煌该鲿r(shí)獨(dú)立地縮放而不打斷客戶端。類(lèi)似地,提供回?fù)苕溄拥膶?shí)體(如通話控制器)可以使其指回?cái)?shù)據(jù)中心,或者基于其邏輯而指向任何特定的實(shí)例,并且因此在客戶端沒(méi)有任何特殊邏輯的情況下,透明地實(shí)現(xiàn)高可用性。這與如sip的其他技術(shù)不同,sip需要將所有消息發(fā)送至固定實(shí)體,因此損害了可縮放性和可用性。相比于sip,本協(xié)議使用在所有的客戶端平臺(tái)上具有廣泛的支持的http,并且不需要?jiǎng)?chuàng)建定制客戶端側(cè)堆棧以使能開(kāi)發(fā)客戶端。這允許更容易的第三方開(kāi)發(fā),并且對(duì)與其他解決方案的容易的集成開(kāi)辟了道路。該協(xié)議定義了允許以下各項(xiàng)的消息:1.通話建立2.通話拆除3.支路至多個(gè)端點(diǎn)4.通話重新定向5.媒體重新協(xié)商6.通話轉(zhuǎn)移(基本的和咨詢(xún)的兩者)7.添加新的參與者8.參與者撥號(hào)進(jìn)入到正在進(jìn)行的通話9.名單管理所提供的是一種用于經(jīng)由通信網(wǎng)絡(luò)在第一客戶端設(shè)備的第一用戶(呼叫者,例如alice)與第二客戶端設(shè)備的第二用戶(被叫者,例如bob)。該方法是由在第一客戶端設(shè)備上運(yùn)行的第一客戶端實(shí)現(xiàn)的??蛻舳送ㄟ^(guò)經(jīng)由網(wǎng)絡(luò)向另一客戶端設(shè)備發(fā)送消息來(lái)執(zhí)行通信事件(例如,通話)建立過(guò)程的第一階段。所述消息包括與還未執(zhí)行的通信事件建立過(guò)程的第二階段相關(guān)的多個(gè)選項(xiàng)。例如,第一階段可以是初始階段,其響應(yīng)于第一用戶經(jīng)由第一客戶端的用戶接口選擇選項(xiàng)以向第二用戶發(fā)起通話而被發(fā)起。第二階段可以是其中通話例如被建立(如果bob接受該通話)或者其中該過(guò)程被終止(如果bob拒絕該通話)的階段。針對(duì)多個(gè)選項(xiàng)中的每個(gè)選項(xiàng),所述消息包括對(duì)該選項(xiàng)唯一的不同的網(wǎng)絡(luò)地址,所述網(wǎng)絡(luò)地址可以被訪問(wèn)以選擇該選項(xiàng),并且第二階段發(fā)展的方式是由訪問(wèn)不同的網(wǎng)絡(luò)地址中的哪個(gè)網(wǎng)絡(luò)地址確定的。即,所述方法包括第一客戶端檢測(cè)到已經(jīng)訪問(wèn)了對(duì)多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的網(wǎng)絡(luò)地址,并且根據(jù)所述多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)來(lái)發(fā)起通信事件建立過(guò)程的第二階段。在下文中,網(wǎng)絡(luò)地址是uri(統(tǒng)一資源指示符),由此每個(gè)選項(xiàng)與對(duì)該選項(xiàng)唯一的不同的uri相關(guān)聯(lián)。即,alice的客戶端針對(duì)與該過(guò)程的第二階段相關(guān)的每個(gè)選項(xiàng)提供了不同的uri。uri指向alice的客戶端具有與其的全雙工websocket連接的代理服務(wù)器,并且當(dāng)已經(jīng)訪問(wèn)了相關(guān)的網(wǎng)絡(luò)地址時(shí),服務(wù)器向alice的客戶端發(fā)送信號(hào)以使得alice的客戶端知道已經(jīng)選擇了哪些選項(xiàng)。例如當(dāng)alice的客戶端在nat或防火墻之后,并且因此其自身不是直接可尋址的時(shí),使用代理是有用的,而在一些情況下,uri仍然有可能直接指向alice的客戶端設(shè)備。網(wǎng)絡(luò)地址(例如,url)對(duì)選項(xiàng)是唯一的意指url與選項(xiàng)中的一個(gè)選項(xiàng)相關(guān)并且不與其他選項(xiàng)中的任何一個(gè)選項(xiàng)相關(guān)(例如,以使得end_alice_urlurl將永遠(yuǎn)不用于嘗試并接受或重新定向該通話等)。例如,uri可以是url(統(tǒng)一資源定位符),也被稱(chēng)為網(wǎng)絡(luò)地址或鏈接。所述消息不被直接發(fā)送給bob,而是經(jīng)由通話控制器的實(shí)例來(lái)發(fā)送。通話控制器實(shí)例在將消息發(fā)送給bob之前重寫(xiě)消息中的uri。經(jīng)重寫(xiě)的uri指向通話控制器實(shí)例的聚類(lèi)而不是alice的代理服務(wù)器(或設(shè)備),這提供了增加的安全性,這是因?yàn)閍lice的代理(或客戶端)永遠(yuǎn)不會(huì)變得對(duì)bob的客戶端直接可見(jiàn)??梢酝ㄟ^(guò)向uri發(fā)布內(nèi)容或者在uri處刪除內(nèi)容來(lái)訪問(wèn)指向alice的代理(或設(shè)備)或者指向通話控制器聚類(lèi)的uri。所述內(nèi)容是使用所謂的post(發(fā)布)請(qǐng)求方法來(lái)發(fā)布的,以及使用所謂的delete(刪除)請(qǐng)求方法來(lái)刪除的,所述方法是良好建立的http協(xié)議的一部分。post請(qǐng)求請(qǐng)求網(wǎng)絡(luò)服務(wù)器接受在請(qǐng)求消息的主體中包含的數(shù)據(jù)以供存儲(chǔ),并且向url發(fā)起的delete請(qǐng)求請(qǐng)求刪除該url處的內(nèi)容。即,通過(guò)向與選項(xiàng)對(duì)應(yīng)的uri發(fā)起特定的請(qǐng)求(例如,發(fā)布、刪除)來(lái)選擇該選項(xiàng)。在uri已經(jīng)由通話控制器實(shí)例重寫(xiě)的情況下,bob的響應(yīng)將被發(fā)布至經(jīng)重寫(xiě)的uri(指向通話控制器實(shí)例的聚類(lèi)),并且原始的實(shí)例或通話控制器中的另一實(shí)例將重寫(xiě)bob對(duì)由alice的客戶端所提供的原始uri的響應(yīng)。bob的響應(yīng)還可以包括指向代理服務(wù)器的uri,其中bob的客戶端具有至所述代理服務(wù)器的類(lèi)似連接(或者直接連接至bob的設(shè)備)。在該情況下,原始的實(shí)例或另一個(gè)通話控制器實(shí)例重寫(xiě)bob的uri,以替代地以類(lèi)似的方式指向通話控制器聚類(lèi)。通話控制器實(shí)例還可以在其生成的消息中提供url,即,其源自通話控制器實(shí)例。這些可以視情況被發(fā)布至由alice/bob的客戶端所提供的指向alice/bob的代理的uri。alice的客戶端可以首先獲得業(yè)務(wù)管理器的uri,其中,在該uri處發(fā)布來(lái)自業(yè)務(wù)管理器的初始通話邀請(qǐng)請(qǐng)求消息(通話邀請(qǐng)請(qǐng)求),所述業(yè)務(wù)管理器以在上文中所描述的方式來(lái)指定通話控制器聚類(lèi)。此后,消息可以由alice/bob的客戶端發(fā)布至該聚類(lèi)的uri,這將使得該聚類(lèi)的負(fù)載平衡器選擇該聚類(lèi)中的通話控制器實(shí)例,并且將該消息轉(zhuǎn)發(fā)至所選擇的實(shí)例。對(duì)于發(fā)布至通話控制器聚類(lèi)的、與當(dāng)前正在進(jìn)行的事務(wù)相關(guān)的消息,在章節(jié)3中提供了用于確保處理進(jìn)行中的事務(wù)的特定的通話控制器接收該消息,即使其最初著陸在該聚類(lèi)的不同實(shí)例上。相同的機(jī)制用于確保如果針對(duì)同一通話同時(shí)發(fā)生了多個(gè)事務(wù),則由同一實(shí)例處理全部這些事務(wù),即使消息中的一個(gè)消息著陸在不同的實(shí)例上。這確保了僅僅存在一個(gè)修改通話狀態(tài)的實(shí)體,并且因此不可能存在否則由多個(gè)寫(xiě)入者引起的狀態(tài)的不一致或破壞。針對(duì)仍然與現(xiàn)有的(即,已經(jīng)建立的)通信事件(例如,添加參與者、終止通信事件等)相關(guān)的發(fā)布至發(fā)起新的事務(wù)的通話控制器聚類(lèi)的消息,在章節(jié)2中提供了使得聚類(lèi)中的任何通話控制器實(shí)例能夠處理新的事務(wù)的機(jī)制。簡(jiǎn)而言之,當(dāng)處理先前的事務(wù)時(shí),通話控制器實(shí)例向客戶端提供了回?fù)躸rl,其包括“工廠對(duì)象標(biāo)識(shí)符”和“持久對(duì)象標(biāo)識(shí)符”。所述標(biāo)識(shí)符與已經(jīng)被寫(xiě)入到(以序列化格式)在聚類(lèi)間共享的計(jì)算機(jī)存儲(chǔ)的通信事件的通話狀態(tài)相關(guān)?;?fù)躸rl指向該聚類(lèi)。當(dāng)客戶端向回?fù)躸rl發(fā)布消息以發(fā)起新的事務(wù)時(shí),在url中出現(xiàn)的這兩個(gè)標(biāo)識(shí)符使用序列化數(shù)據(jù)為該聚類(lèi)中能夠處理與現(xiàn)有的通信事件相關(guān)的新的事務(wù)的任何實(shí)例提供了足夠的信息。這將在章節(jié)2中詳細(xì)解釋。每個(gè)通話與唯一的通話id相關(guān)聯(lián),所述通話id被包括在指向通話控制器聚類(lèi)的回?fù)躸rl中。這使得處理實(shí)例能夠以如在章節(jié)2中詳細(xì)解釋的其從外部存儲(chǔ)讀取/或向外部存儲(chǔ)寫(xiě)入的方式執(zhí)行一些優(yōu)化。應(yīng)當(dāng)注意的是,url自身的選擇(并不僅僅是發(fā)布至所選擇的url的消息的任何內(nèi)容)向url的原始提供者提供信息。例如,在簡(jiǎn)單的示例中,通話控制器可以向https://proxy.io/alice/callid/accept發(fā)布空消息以指示bob已經(jīng)接受了通話邀請(qǐng),并且向https://proxy.io/alice/callid/reject發(fā)布空消息以指示bob已經(jīng)拒絕了通話邀請(qǐng)。這些url指向alice的代理,并且將已經(jīng)在發(fā)送通話邀請(qǐng)請(qǐng)求消息時(shí)由alice的客戶端提供。然而,在以下的示例中,在消息的內(nèi)容中提供了補(bǔ)充信息。圖7示出了針對(duì)在該示例中由alice302a發(fā)起的、alice(呼叫者)202a與bob(被叫者)202b之間的通話的成功通話建立過(guò)程的概述。在以下的示例中,alice和bob的客戶端具有至同一代理602的連接。實(shí)際上,它們可以使用不同的代理。alice的客戶端320a的通話代理512ca發(fā)起(s1)通話創(chuàng)建請(qǐng)求消息(callinvitationrequest),其向通話控制服務(wù)邏輯523c(在下文中為“cc”)請(qǐng)求通話控制服務(wù),例如,使用業(yè)務(wù)管理器232所發(fā)現(xiàn)的。通話控制器實(shí)例434c被指定為通過(guò)負(fù)載平衡來(lái)處理該請(qǐng)求。該請(qǐng)求識(shí)別bob是期望的通話參與者,并且所指定的通話控制服務(wù)邏輯434c向bob的客戶端320b的bob的通話代理512c發(fā)起通話通知消息。所述通知是經(jīng)由代理602向bob的設(shè)備發(fā)送的。bob是經(jīng)由bob的客戶端ui被通知的,例如,通過(guò)ui輸入響鈴模式,并且響應(yīng)于bob選擇加入該通話,bob的通話代理向cc發(fā)起附接請(qǐng)求(s3),響應(yīng)于該附接請(qǐng)求,bob被附接至該通話。在s4處,經(jīng)由集線器/代理在bob和alice的通話代理512ca、512cb之間發(fā)送和接收通話進(jìn)展請(qǐng)求、媒體回答請(qǐng)求和媒體確認(rèn)響應(yīng)、以及最后的通話接受請(qǐng)求和通話接受確認(rèn)響應(yīng),以協(xié)商針對(duì)該通話的媒體參數(shù)從而使得媒體可以在客戶端的媒體代理512ma、512mb之間流動(dòng)(s5),在該示例中這不涉及媒體模態(tài)控制器。通話媒體不通過(guò)通話控制器流動(dòng),并且根本無(wú)需經(jīng)由云流動(dòng);例如,其可以經(jīng)由對(duì)等連接、媒體中繼連接、或一些其他覆蓋網(wǎng)絡(luò)連接而流動(dòng)。媒體中繼是允許nat和防火墻之后的客戶端與其他實(shí)體交換媒體分組的實(shí)體。其通過(guò)具有公共可訪問(wèn)的ip地址,并經(jīng)由該地址將所有媒體分組中繼到隱藏的客戶端或從隱藏的客戶端中繼來(lái)這樣做。這與代理602允許nat/防火墻之后的客戶端執(zhí)行信號(hào)發(fā)送的方式是類(lèi)似的(媒體中繼是針對(duì)代理602要進(jìn)行信號(hào)發(fā)送的媒體的)。媒體回答和媒體回答確認(rèn)有助于創(chuàng)建被稱(chēng)為臨時(shí)媒體流的東西。臨時(shí)媒體流是在呼叫者端點(diǎn)與所有被叫者端點(diǎn)之間創(chuàng)建的。例如如果被叫者在多個(gè)用戶設(shè)備處登錄,則可以存在多個(gè)被叫者端點(diǎn)。這在被叫者上的“響鈴”ui繪制(輸出)之前發(fā)生,以使得一旦被叫者接聽(tīng)通話,她就可以開(kāi)始談話而無(wú)須等待媒體建立。媒體確認(rèn)確保被叫者端點(diǎn)真的知道其發(fā)送的媒體回答的確已經(jīng)被呼叫者客戶端看見(jiàn)和處理了,并且因此,可以確定媒體流已經(jīng)開(kāi)始。額外地,客戶端使用媒體確認(rèn)作為觸發(fā)以確保媒體回答的確被呼叫者端點(diǎn)看見(jiàn)。如果呼叫者端點(diǎn)在合理的時(shí)間(例如,15秒)內(nèi)沒(méi)有看見(jiàn)媒體確認(rèn),則客戶端可以重新發(fā)送媒體回答。callacceptance(通話接受)被用作用于取消沒(méi)有接聽(tīng)通話的任何端點(diǎn)的響鈴并且用于終止與它們的媒體流的信號(hào)等。callacceptance還充當(dāng)針對(duì)以下情況的機(jī)制:1.被叫者客戶端將其通話中回?fù)躸rl發(fā)送至cc2.通話控制器向呼叫者發(fā)送通話中動(dòng)作urlcallacceptanceacknowledgement(通話接受確認(rèn))被用作:1.呼叫者端點(diǎn)向?qū)⑵渫ㄔ捴谢負(fù)躸rl發(fā)送至cc2.cc向被叫者端點(diǎn)發(fā)送通話中動(dòng)作鏈接額外地,客戶端還使用callacceptanceacknowledgement作為觸發(fā)以確保callacceptance的確已經(jīng)被呼叫者端點(diǎn)看見(jiàn)。如果呼叫者端點(diǎn)在合理的時(shí)間(例如,15秒)內(nèi)沒(méi)有看見(jiàn)callacceptanceacknowledgement,則客戶端可以重新發(fā)送callacceptance。s1-s4繼續(xù)單個(gè)事務(wù),即以建立通信事件。響應(yīng)于初始的通話邀請(qǐng)請(qǐng)求,通話控制器510c的單個(gè)實(shí)例被指定為控制整個(gè)事務(wù)s1-s4。為了確保事務(wù)中消息著陸在通話控制器的同一實(shí)例上,與該事務(wù)相關(guān)的url指回至聚類(lèi)的特定實(shí)例,而不是指向聚類(lèi)負(fù)載平衡器。與不同事務(wù)相關(guān)的url指向負(fù)載平衡器。這涉及創(chuàng)建針對(duì)通信事件的通話狀態(tài),并且在過(guò)程進(jìn)展時(shí)更新所述通話狀態(tài)。一旦已經(jīng)建立了所述通話,則以在上文中所描述的方式將通話狀態(tài)存儲(chǔ)至計(jì)算機(jī)存儲(chǔ)608,其中通話控制器聚類(lèi)中的其他通話控制器實(shí)例能夠訪問(wèn)所述通話狀態(tài)。如在下文中所解釋的(在章節(jié)2中),將通話狀態(tài)序列化以使得其可以在通話建立過(guò)程結(jié)束時(shí)以該方式存儲(chǔ)。接著,通話控制器實(shí)例510c從該指定被釋放,即從對(duì)通信事件進(jìn)行控制被釋放。在這里,“被釋放”意指先前被占用以實(shí)現(xiàn)s1-s4的、實(shí)例434c在其上運(yùn)行的處理器的物理資源(處理資源、存儲(chǔ)器資源)再次變得可用。在以下的示例中,一旦實(shí)例的運(yùn)行時(shí)狀態(tài)已經(jīng)被序列化并且被存儲(chǔ),則這發(fā)生,以使得另一實(shí)例可以重新創(chuàng)建運(yùn)行時(shí)狀態(tài)并且因此恢復(fù)對(duì)相關(guān)服務(wù)的傳遞(參見(jiàn)章節(jié)2)?,F(xiàn)在將描述各種示例性的信號(hào)流以幫助理解本教導(dǎo)下的原理中的一些原理。1a.url:應(yīng)當(dāng)注意的是,以下的符號(hào)用于表示url:-<opertaion>_<pointsto>_url(<操作>_<指向>_url)其中,“操作”表示url與其相關(guān)的操作,而“指向”指示url指向哪個(gè)實(shí)體,即,哪個(gè)實(shí)體最終在訪問(wèn)該url之后檢測(cè)并行動(dòng)。在下文中<pointsto>是-“alice”針對(duì)指向alice的url(即,alice的代理或設(shè)備);-“bob”針對(duì)指向bob的代理的url(即,bob的代理或設(shè)備);-“cc”針對(duì)指向通話控制服務(wù)邏輯的url——指向特定的實(shí)例或指向負(fù)載平衡器。以下的示例涉及兩方通話。在兩方通話的上下文中,<pointsto>針對(duì)指向通話控制服務(wù)邏輯(cc)的url而具有“cc<user>”(“cc<用戶>”)的形式,但是其是由通話控制服務(wù)邏輯映射至指向<user>(例如alice、bob的url)的url的(參見(jiàn)下一部分)。1b.url“重寫(xiě)”:如在上文中所述,cc利用指向自身的url來(lái)重寫(xiě)在消息中指向端點(diǎn)的url。當(dāng)cc用指向自身的新的url(即,<operation>_cc<user>)來(lái)代替指向<user>的原始的url(即,<operation>_<pointsto>_url)時(shí),其以對(duì)客戶端不可見(jiàn)的方式存儲(chǔ)原始的url與新的url之間的映射。因此,每當(dāng)在新的url<operation>_cc<user>上執(zhí)行訪問(wèn)操作(例如,發(fā)布、或刪除)時(shí),這可以由cc檢測(cè),并且作為響應(yīng),cc從存儲(chǔ)取回原始的url<operation>_<user>_url,并且在原始的url<operation>_<user>_url上執(zhí)行合適的操作。因此,例如:-如果從alice到bob的消息:包含第一url<operation>_alice_url,即指向alice,并且被發(fā)布至第二url<operation2>_ccbob_url,即指向cc但是在cc處映射到第四url<operation2>_ccbob_url,即以對(duì)alice不可見(jiàn)的方式指向bob;-則:cc通過(guò)用第三url<operation1>_ccalice_url(其現(xiàn)在指向cc(不是alice))代替第一url來(lái)修改該消息,并且向第四(不是第二)url<operation2>_bob_url(其指向bob)發(fā)布經(jīng)修改的消息。以該方式,可以確保的是,bob從不具有對(duì)指向alice的任何url的直接可見(jiàn)性,并且反之亦然,即重寫(xiě)是確保alice和bob的代理總是將cc用作通信中介所需的全部。該協(xié)議使得在客戶端與通話控制器之間的所有通信能夠以請(qǐng)求-響應(yīng)為基礎(chǔ)進(jìn)行操作——因此,根據(jù)該協(xié)議,不需要客戶端來(lái)維持至通話控制器的任何種類(lèi)的開(kāi)放連接,例如,以它們對(duì)待代理服務(wù)器的方式。在這些特定的示例中,發(fā)布(相應(yīng)地,刪除)意指使用httppost(相應(yīng)地,delete)方法。在本文中公開(kāi)的協(xié)議為客戶端提供了靈活性。客戶端可以自由地選擇其想要在各種消息中使用的無(wú)論何種url——已知每個(gè)url可以由其他相關(guān)的實(shí)體(客戶端、控制器等)訪問(wèn),并且對(duì)url所表示的操作是唯一的,以使得客戶端在訪問(wèn)先前由其自身所提供的任何給定的url時(shí)知道正在請(qǐng)求哪一個(gè)操作(即,已知url將足夠的上下文編碼為不混淆的)。換句話說(shuō),選擇url以便當(dāng)訪問(wèn)url時(shí)不引起后來(lái)的混淆是客戶端自己的責(zé)任。如所提及的,url重寫(xiě)通過(guò)確保呼叫者url從不對(duì)呼叫者直接可見(jiàn)并且反之亦然而在呼叫者和被叫者之間提供安全層。這將客戶端從必須在他們的url上維持安全性的負(fù)擔(dān)中釋放了,這是因?yàn)樗鰑rl僅僅每個(gè)被顯露給受信任的實(shí)體(即,通話控制器)。1.1示例性信號(hào)流:1.2.1通話建立信號(hào)流(其中,通話由被叫者接受):在圖8a中更加詳細(xì)地示出了針對(duì)圖7中的成功的通話建立過(guò)程的信令流。兩個(gè)通話代理之間的成功的通話建立涉及以下步驟。在步驟s802處,alice的通話代理512ca(ca1)向cc發(fā)送通話邀請(qǐng)請(qǐng)求消息(通話邀請(qǐng)請(qǐng)求)。具體地,通話邀請(qǐng)請(qǐng)求被發(fā)布(即,使用諸如httppost之類(lèi)的發(fā)布請(qǐng)求而被發(fā)送)至cc的通話url(call_url),例如其可以使用業(yè)務(wù)管理器232而被發(fā)現(xiàn),并且有可能通過(guò)進(jìn)一步的協(xié)商例如以發(fā)現(xiàn)與alice的客戶端兼容的通話控制器版本。消息已經(jīng)被發(fā)布了特定的url的確切的事實(shí)告訴cc:盡管消息的內(nèi)容的確包含用于建立通話的額外的信息,但期望新的通話而不管消息的內(nèi)容。特別地,通話邀請(qǐng)請(qǐng)求包括被叫者(bob)的標(biāo)識(shí)符(例如,用戶名),并且指示被叫者是期望的參與者。所述消息可以包括群通話的其他期望的參與者的標(biāo)識(shí)符。所述消息還標(biāo)識(shí)了alice的客戶端可以支持那些媒體模態(tài),例如,其可以指示alice的客戶端可以支持音頻和視頻、僅音頻等。通話邀請(qǐng)請(qǐng)求包括以下鏈接(回?fù)苓B接)即url:-progress_alice_url(進(jìn)展_alice_url):針對(duì)alice的通話進(jìn)展url——其用于繼續(xù)建立該通話(參見(jiàn)s814);-mediaanswer_alice_url(mediaanswer_alice_url):針對(duì)alice的媒體回答url,用于繼續(xù)建立通話(參見(jiàn)s818);-acceptance_alice_url(acceptance_alice_url):針對(duì)alice的通話接受url——其用于最終接受該通話,以使得通話媒體可以例如響應(yīng)于bob選擇接受(即“接起”通話)而流動(dòng)、被訪問(wèn)(參見(jiàn)s828);-redirection_alice_url(redirction_alice_url):針對(duì)alice的通話重新定向url——其用于自動(dòng)地或響應(yīng)于bob的選擇而重新定向該通話(參見(jiàn)s842,圖8c);-endnotification_alice_url(結(jié)束通知_alice_url):針對(duì)alice的結(jié)束通話通知url——其用于通知alice的端點(diǎn)關(guān)于通話的結(jié)束,因?yàn)槠錄](méi)有被bob接受,或者因?yàn)閎ob在接受通話之后掛掉(參見(jiàn)s836,圖8d)。這些url彼此全都不同,但是全部都指向alice的代理服務(wù)器。例如,它們可以具有形式https://proxy.io/<alice的用戶名>/<﹡>,其中<﹡>表示標(biāo)識(shí)不同操作的不同的上下文標(biāo)識(shí)符。從ca1的角度來(lái)看,步驟s802構(gòu)成通話建立過(guò)程的第一階段。該消息還可以攜帶媒體協(xié)商(例如,編碼解碼器協(xié)商)所需的任何數(shù)據(jù),例如與alice的客戶端/設(shè)備的媒體能力有關(guān)的信息。該消息還可以包含其他有用的信息,例如參與者更新回?fù)苕溄?update_alice_url)。這是alice的代理的url,如果該信息變化,則cc可以向其發(fā)布通話參與者的經(jīng)更新的列表。在s804處,cc用通話邀請(qǐng)響應(yīng)消息(通話邀請(qǐng)響應(yīng))來(lái)對(duì)ca1的通話邀請(qǐng)請(qǐng)求進(jìn)行響應(yīng),其包括以下回?fù)苕溄右杂蒫a1使用:-call_cc_url(通話_cc_url):表示整個(gè)通話的通話url——其可以用于完全地終止該通話-calllegalice_cc_url(通話支路alice_cc_url):表示alice和cc之間的通話支路的終止支路url——其可以用于將alice作為通話參與者移除;-participantinvitation_cc_url(參與者邀請(qǐng)_cc_url):供ca1添加更多參與者的url。這些url指向cc。該響應(yīng)是http響應(yīng),其中,“201創(chuàng)建的”狀態(tài)碼指示在s802處由ca1進(jìn)行的成功發(fā)布。在步驟s806處,cc將通話通知消息(callnotification)發(fā)送至被叫者的通話代理511cb(ca2)。所述通話通知包括:-ca2可以用于附接至通話的附接url(attachbob_cc_url):在步驟s808處使用。使用在s802的通話邀請(qǐng)請(qǐng)求中包括的標(biāo)識(shí)符來(lái)發(fā)送消息,并且經(jīng)過(guò)bob的代理。在各種移動(dòng)場(chǎng)景中,終端可以沒(méi)有任何注冊(cè)的代理回?fù)苡糜诮邮盏絹?lái)的通話通知。但是,它們可以有其他的方式被通知——例如針對(duì)現(xiàn)代windows/電話的wns、針對(duì)android的google推送通知、針對(duì)ios的apns??梢赃m當(dāng)?shù)刂匦露x通話通知的格式并在bob的端點(diǎn)已經(jīng)注冊(cè)的各種推送信道上發(fā)送。一旦端點(diǎn)接收了推送通知,已知它們可以解譯并且相應(yīng)地行動(dòng)的通知blob,所述端點(diǎn)將由合適的os喚醒,在該情況下其指的是:1.如果至代理的連接尚未存在,則對(duì)其進(jìn)行建立;2.在attach_cc_url上發(fā)送附接請(qǐng)求。作為響應(yīng),在步驟s808處,ca2向在s806的通話通知中所包括的附接bob_cc_url發(fā)布附接請(qǐng)求消息(附接請(qǐng)求)——應(yīng)當(dāng)注意的是,這是自動(dòng)的,并且不依賴(lài)于例如bob選擇接受該通話。附接請(qǐng)求包括:-指向如果alice終止該通話,則cc可以向其發(fā)布通知的bob的代理服務(wù)器的url(callnotification_bob_url)(通話通知_bob_url)——參見(jiàn)s848。在步驟s810,cc用附接響應(yīng)消息(附接響應(yīng))進(jìn)行響應(yīng),該附接響應(yīng)消息包含進(jìn)行進(jìn)一步的通話協(xié)商所需的所有數(shù)據(jù)。附接響應(yīng)消息是具有“200ok”狀態(tài)碼的http響應(yīng)。附接響應(yīng)包含以下url:-progress_ccalice_url-mediaanswer_ccalice_url-acceptance_ccalice_url-redirction_ccalice_url應(yīng)當(dāng)注意的是,在所有以上url中都出現(xiàn)了“cc”——這些url是根據(jù)在章節(jié)1b中所描述的url“重寫(xiě)”過(guò)程而由cc生成的,并且與url相對(duì)應(yīng):-progress_alice_url-mediaanswer_alice_url-acceptance_alice_url-redirction_alice_url它們?cè)趕802處由ca1在通話邀請(qǐng)請(qǐng)求消息中向cc提供,這在上文的章節(jié)1b中詳細(xì)闡述。cc存儲(chǔ)了alice的原始url與由cc相應(yīng)地生成的替代url之間的映射900,其在圖9中被示出。s810的附接響應(yīng)消息構(gòu)成了s802的通話邀請(qǐng)請(qǐng)求消息的經(jīng)修改的版本。如在上文中所提及的,ccurl將僅僅在兩方通話中映射至alice的url。針對(duì)多方通話,cc使用媒體控制器來(lái)處理協(xié)商。其還包含:-call_cc_url——其表示整個(gè)通話(如在s804向alice提供的);-calllegbob_cc_url——其表示cc和ca2之間的通話的支路(等于在s804處向alice提供的calllegalice_cc_url)。在步驟s812處,ca2接著繼續(xù)以經(jīng)由cc向ca1發(fā)送通話進(jìn)展更新消息(通話進(jìn)展)。該消息例如可以指示bob的客戶現(xiàn)在已經(jīng)進(jìn)入了響鈴狀態(tài)。通話進(jìn)展更新已經(jīng)被發(fā)布至progress_ccalice_url,并且因此被cc接收。在該示例中,通話進(jìn)展消息不包括任何url,因此其內(nèi)容不由cc重寫(xiě)。cc訪問(wèn)映射900以取回progress_alice_url,并且將該消息發(fā)布至該未經(jīng)修改的url,以使得其由alice接收(s814)。在步驟s816處,ca2接著發(fā)送其響應(yīng)于在通話通知或附接響應(yīng)中所接收的媒體提議所生成的媒體回答消息(mediaanswer)。媒體回答消息被發(fā)布至mediaanswer_ccalice_url,并且其包括指向bob的以下回?fù)躸rl:-mediaack_bob_url,以下在s822處使用因?yàn)閙ediaanswer_ccalice_url指向cc,所以其是由cc接收的。因?yàn)樵趍ediaanswer中所包括的mediaack_bob_url指向bob,所以cc生成指向cc的新的urlmediaack_ccbob_url,并且修改mediaanswer以用mediaack_ccbob_url來(lái)替換mediaack_bob_url。cc訪問(wèn)相關(guān)的映射900以取回mediaanswer_alice_url(沒(méi)有cc),并且將經(jīng)修改的mediaanswer發(fā)布至mediaanswer_alice_url(s818)。ca1現(xiàn)在具有urlmediaack_ccbob_url。cc創(chuàng)建新的映射902以在s822處使用,其將mediaack_ccbob_url映射至mediaack_bob_url(沒(méi)有cc)。在步驟s820處,在處理了媒體回答之后,ca1向ca2發(fā)送媒體確認(rèn)消息(媒體確認(rèn))(s820)。媒體確認(rèn)被發(fā)布至在s818處所接收的mediaack_ccbob_url,并且因此是由cc接收的。在該示例中,媒體確認(rèn)不包括指向alice的任何url,因此在s822處,cc將未修改的媒體確認(rèn)發(fā)布(s822)至mediaack_bob_url(沒(méi)有cc)——后者是從映射902獲得的。媒體確認(rèn)告訴bob的端點(diǎn)alice接收到mediaanswer,因此媒體建立被認(rèn)為是成功的,并且可以繪制“響鈴”ui以給用戶接聽(tīng)通話的機(jī)會(huì)。其還告訴bob的端點(diǎn)mediaanswer被成功地傳遞到了alice的端點(diǎn),否則bob的端點(diǎn)可以重新發(fā)送mediaanswer(在適當(dāng)?shù)某瑫r(shí)之后,例如15秒)。在該點(diǎn)處,媒體能夠在端點(diǎn)的媒體代理512ma1(ma1)、512mb(ma2)之間流動(dòng),以使得當(dāng)被叫者接起該通話時(shí),沒(méi)有媒體建立延遲。響應(yīng)于被叫者接受(即,接起該通話),最終通話接受消息(callacceptance)經(jīng)由通話控制器而被發(fā)送至ca1,其首先由ca2發(fā)布至acceptance_ccalice_url(s826),并且接著由cc發(fā)布至acceptance_alice_url(s828)。callacceptance包含:-callaccack_bob_url其以相同的方式用callack_ccbob_url來(lái)代替。在處理了通話接受有效載荷之后,ca1將通話接受確認(rèn)發(fā)布至callack_ccbob_url(s830),cc將其重新發(fā)布至callack_bob_url。作為響應(yīng),通話媒體(音頻/視頻)開(kāi)始在ma1和ma2之間流動(dòng)(s823)。callacceptance被用作用于取消未接起通話的任何端點(diǎn)的響鈴的信號(hào),并且終止與其的媒體流。callacceptance還充當(dāng)以下機(jī)制:1.被叫者客戶端向cc發(fā)送其通話中回?fù)躸rl;2.通話控制器向呼叫者發(fā)送通話中動(dòng)作url。callacceptanceacknowledgement由以下項(xiàng)使用:1.呼叫者端點(diǎn)向cc發(fā)送其通話中回?fù)躸rl;2.cc向被叫者端點(diǎn)發(fā)送通話中動(dòng)作鏈接。額外地,客戶端還使用callacceptanceacknowledgement作為觸發(fā)以確保callacceptance確實(shí)被呼叫者端點(diǎn)看見(jiàn)。如果在合理時(shí)間(例如15秒)內(nèi)呼叫者端點(diǎn)沒(méi)有看見(jiàn)callacceptanceacknowledgement,則可以重新發(fā)送callacceptance。1.2.2被叫者離開(kāi)通話:在圖8b中示出了被叫者拒絕撥入的通話的場(chǎng)景。在該場(chǎng)景中,過(guò)程如上文從s802到s810繼續(xù)。然而,在ca2已經(jīng)附接到該通話之后,撥入的通話是由被叫者(在通話建立之前)通過(guò)以下方式拒絕的:使用在s806處所提供的urlcalllegbob_cc_url上的刪除請(qǐng)求來(lái)發(fā)送結(jié)束通話支路消息(s834)。通過(guò)cc將拒絕通知消息發(fā)布至由alice在s802處所提供的endnotification_alice_url來(lái)通知alice該拒絕(s836)。應(yīng)當(dāng)注意的是,這僅僅是示例——被叫者可以將其自身從已經(jīng)接受了其的通話中移除(如在圖8a中),以使得s834可以例如在圖8a中在s832之后或在附接響應(yīng)和通話接受之間的任何時(shí)間發(fā)生。這樣做將結(jié)束2方通話,但不是多方通話。s834可以是響應(yīng)于被叫者經(jīng)由其客戶端ui選擇拒絕選項(xiàng),或者其可以是自動(dòng)的,例如,如果bob已經(jīng)將其客戶端配置為自動(dòng)地拒絕撥入的通話。1.2.3被叫者請(qǐng)求重新定向:圖8c示出了被叫者的客戶端ca2將通話重新定向到不同的目標(biāo)用戶的場(chǎng)景。過(guò)程如上文所述的從步驟s802進(jìn)行到s810。撥入的通話是通過(guò)ca2將重新定向消息發(fā)布至redirection_ccalice_uri來(lái)重新定向的(s838)——該url已經(jīng)由cc在s810處提供。重新定向消息標(biāo)識(shí)不同的目標(biāo)用戶(例如,通過(guò)用戶名)。這是由cc接收的并且被發(fā)布至redirction_alice_uri(s840)——這已經(jīng)在s802處由ca1提供。這樣做引起呼叫者創(chuàng)建與所供應(yīng)的目標(biāo)的新通話(s842)。s842等于s802,但是是針對(duì)新目標(biāo)用戶的,并且此后該過(guò)程以相同的方式繼續(xù)。新的通話邀請(qǐng)消息被示出為被引導(dǎo)至不同的通話控制器523c’,而在其他示例中可能不是這種情況。s838可以是響應(yīng)于被叫者經(jīng)由他們的客戶端ui選擇通話重新定向選項(xiàng)的,或者是自動(dòng)的。以s838開(kāi)始的通話重新定向過(guò)程可以在接收附接響應(yīng)(s810)與發(fā)送通話接受或通話結(jié)束(或接收通話結(jié)束通知)之間的任何時(shí)間完成。1.2.4呼叫者取消通話:圖8d示出了這樣的場(chǎng)景,其中,呼叫者的客戶端ca1結(jié)束了通話,例如響應(yīng)于呼叫者經(jīng)由他們的客戶端ui選擇了結(jié)束通話選項(xiàng)。呼叫者可以在任何時(shí)間結(jié)束撥出的通話——甚至是在通話建立之前(如在該示例中)。在該示例中,該過(guò)程如上文所述的從s802進(jìn)行到s822。結(jié)束該通話是由ca1在表示整個(gè)通話的uricall_cc_url上使用刪除(例如,httpdelete)請(qǐng)求來(lái)發(fā)送結(jié)束通話消息而實(shí)現(xiàn)的,并且在步驟s804處被提供(s846)。ca2通過(guò)cc向由ca2在s808處所提供的urlcallnotification_bob_url發(fā)布通話結(jié)束通知而被通知(s848)。針對(duì)多方通話,cc將更新名單(將alice從其中移除),并向剩余的參與者發(fā)送post參與者更新消息。通話終止(由被叫者進(jìn)行)與通話取消(由呼叫者進(jìn)行)之間的區(qū)別與例如sip不同。在sip中,有兩種方法:1.取消——由呼叫者發(fā)送以結(jié)束尚未被接受的通話2.再見(jiàn)——由任何參與者發(fā)送以結(jié)束已經(jīng)被接受的通話這兩種方法引起了狀態(tài)機(jī)實(shí)現(xiàn)中的混淆,并且使得sip傾向于競(jìng)爭(zhēng)條件(因?yàn)?,可能在正在處理取消時(shí)接受通話,并且在該時(shí)刻,某一實(shí)體不得不將取消轉(zhuǎn)換成再見(jiàn))。本協(xié)議通過(guò)以下方式一起來(lái)避免該問(wèn)題,只有一種不混淆的方式來(lái)結(jié)束通話(deletecallleg_cc_url)以及關(guān)于通話結(jié)束而被通知(postendnotification_<user>_url)。不管通話的狀態(tài)是什么,未連接還是連接的,這些都是有效的。應(yīng)當(dāng)注意的是,上文考慮了雙方通話。針對(duì)多方通話,由alice所執(zhí)行的操作不去到在另一側(cè)的任何特定的用戶,而是由通話控制器直接地處理的。例如,如果alice在多方通話中執(zhí)行媒體重新協(xié)商,則媒體回答是由媒體控制器所生成的,而其他的參與者不會(huì)變得直接感知到任何改變(盡管經(jīng)由名單更新他們可以變得間接感知)。針對(duì)多方通話,指向通話控制器的鏈接不能夠直接映射至另一參與者的url。通話控制器可以與像“媒體控制器”一樣的其他服務(wù)器進(jìn)行交互以對(duì)其在其鏈接上獲得的請(qǐng)求起作用。1.3針對(duì)所建立的通話的新事務(wù):在上文中定義了構(gòu)成單個(gè)事務(wù)的圖8a的信令流。在其中執(zhí)行的所有cc功能都是由相同的通話控制器實(shí)例執(zhí)行的(雖然這不是必須的——參見(jiàn)上文)、在過(guò)程開(kāi)始處被指定的。在于步驟s832處關(guān)聯(lián)了通話接受確認(rèn)之后,將針對(duì)該通話的序列化狀態(tài)數(shù)據(jù)存儲(chǔ)在相關(guān)的通話控制器聚類(lèi)的經(jīng)共享的存儲(chǔ)中(參見(jiàn)章節(jié)2),并且該實(shí)例被釋放。在圖8b(通話終止)的情況下,可以在這已經(jīng)發(fā)生之后(即在已經(jīng)釋放了通話控制器實(shí)例之后)發(fā)起步驟s834以結(jié)束該通話。對(duì)于圖8c中的s838以及圖8d中的s846同樣如此。此外,應(yīng)當(dāng)注意的是,在圖8a的信令過(guò)程中,在步驟s804處,在通話邀請(qǐng)響應(yīng)中給ca1提供urlparticipantinvitation_cc_url。ca1可以例如在通話期間的任何時(shí)間向participantinvitation_cc_url發(fā)布添加參與者消息以添加新的參與者。這將觸發(fā)與s806-s826類(lèi)似的信令流,但是是針對(duì)新邀請(qǐng)的參與者的。在結(jié)束時(shí),cc將向ca1發(fā)布在s802處所提供的urlupdate_alice_url的更新消息,以指示已經(jīng)添加了新的參與者。針對(duì)諸如這些之類(lèi)的通話中的操作(其中處理通話的建立的原始實(shí)例針對(duì)其已經(jīng)被釋放為已經(jīng)將通話狀態(tài)序列化),聚類(lèi)中的任何通話控制器實(shí)例可以被指定為處理通話中的處理。章節(jié)2呈現(xiàn)了使其可行的機(jī)制。1.3透明的/獨(dú)立可縮放代理:由該協(xié)議所提供的靈活性提供了客戶端與代理服務(wù)(例如,如在上文中由代理服務(wù)器602所提供的)的無(wú)縫集成。例如,客戶端可以通過(guò)改變其提供以指向代理的url來(lái)在代理(即,經(jīng)由代理接收消息)和直接消息接收之間進(jìn)行切換——不需要對(duì)消息內(nèi)容的改變,或者底層信令協(xié)議。作為另一示例,客戶端可以在具有類(lèi)似緩和的代理之間切換。協(xié)議提供了獨(dú)立的可縮放性,例如,通過(guò)將代理服務(wù)從通話控制器去耦合。例如,在一個(gè)實(shí)施例中,在代理服務(wù)器602上需要資源以供其能夠維持至客戶端的所需數(shù)量的開(kāi)放(例如,websocket)連接,其中代理服務(wù)器向所述客戶端提供代理服務(wù);然而,當(dāng)協(xié)議允許客戶端與通話控制器之間的通信以請(qǐng)求-響應(yīng)(例如,http)為基礎(chǔ)進(jìn)行操作時(shí),不需要這樣的資源。因此,如果在通信系統(tǒng)200內(nèi)需要額外的代理服務(wù)器資源,例如當(dāng)用戶基數(shù)增長(zhǎng)以使得例如在通信系統(tǒng)內(nèi)需要維持的更大數(shù)量的websocket連接同時(shí)向增長(zhǎng)的用戶基數(shù)提供代理服務(wù)時(shí),代理服務(wù)可以為此獨(dú)立于通話控制器而被縮放。一般而言,在通信系統(tǒng)200內(nèi),物理資源可以被分配至控制器(例如,通話/媒體控制器),其與向這些客戶端所提供的代理服務(wù)無(wú)關(guān)地向客戶端提供服務(wù)。在一個(gè)示例中,代理服務(wù)(例如,代理服務(wù)器602)可以作為應(yīng)用在云平臺(tái)100上實(shí)現(xiàn),并且資源是以相同的方式但是獨(dú)立地向控制器和代理服務(wù)分配的(例如,通過(guò)縮放聚類(lèi)中的vm的數(shù)量,創(chuàng)建新的服務(wù)部署等),以使得對(duì)控制器的物理資源的授權(quán)是獨(dú)立的并且與對(duì)代理服務(wù)器的物理資源許可不同。1.4透明地創(chuàng)建提供不同能力的代理服務(wù)器的鏈;1.4.1通話控制器代理的透明的增加:url重寫(xiě)機(jī)制是在章節(jié)1b中闡述的并且被應(yīng)用至控制器的鏈,其中,當(dāng)消息從一個(gè)端點(diǎn)行進(jìn)到另一個(gè)端點(diǎn)時(shí),連續(xù)的url重寫(xiě)操作發(fā)生,例如,以透明地提供高可用性。圖10示出了這樣的示例,其中ca1與ca2之間的消息遍歷三個(gè)通話控制器部署523c1(cc1)、523c2(cc2)、和523c1(cc3)。ca1將消息引導(dǎo)至cc1,其包含指向alice的回?fù)躸rl<option>_alice_url(url<選項(xiàng)>_alice_url)。cc1將其重寫(xiě)以替代地指向其自身,并且在消息的第一經(jīng)修改版本中向cc2提供經(jīng)重寫(xiě)的url<option>_cc1alice_url。cc1存儲(chǔ)<option>_alice_url與<option>_cc1alice_url之間的映射900.1。cc2重寫(xiě)該url<option>_cc1alice_url以指向其自身,并且在消息的第二經(jīng)修改版本中向cc3提供經(jīng)修改的url<option>_cc2alice_url。cc2存儲(chǔ)url<option>_cc2alice_url與url<option>_cc1alice_url之間的映射900.2。cc3重寫(xiě)該url<option>_cc2alice_url以指向自身,并且在該消息的第三經(jīng)修改版本中向ca2提供經(jīng)修改的url<option>_cc3alice_url。cc3存儲(chǔ)url<option>_cc2alice_url與url<option>_cc1alice_url之間的映射900.3。因此,該消息遍歷三個(gè)通話控制器cc1、cc2、和cc3的鏈,并且當(dāng)其從ca1到ca2遍歷通信系統(tǒng)時(shí),受制于三個(gè)分離的url重寫(xiě)操作。當(dāng)ca2例如通過(guò)將響應(yīng)發(fā)布至<option>_cc3alice_url而響應(yīng)alice的消息時(shí),該響應(yīng)首先行進(jìn)至cc3,并從cc3到cc2(憑借映射900.3),從cc2到cc1(憑借映射900.2),并最后到ca1(憑借映射900.1)。cc2位于該鏈的中間,并且因此對(duì)ca1和ca2完全不可見(jiàn)——ca1和ca2曾看見(jiàn)的全部是分別指向cc1和cc3的url;它們看不見(jiàn)指向cc2的任何url。這意味這通話控制器部署cc2可以是針對(duì)新的通話控制器部署cc4的替代,如在圖10的下半部分中所描繪的。所需的全部是:-cc3修改其映射900.3,以用相等的但是替代地指向cc4的url<option>_cc4alice_url來(lái)替換<option>_cc2alice_url,并且-cc1開(kāi)始將消息重新定向至cc4而不是cc2。利用這些改變,此后被引導(dǎo)至<option>_cc1alice_url(由ca1)或<option>_cc3alice_url(由ca2)的所有消息將經(jīng)由ca4而不是ca2行進(jìn)。因此,部署ca2已經(jīng)以對(duì)端點(diǎn)(即,對(duì)ca1和ca2)完全不可見(jiàn)的方式針對(duì)ca4交換——其完全不需要對(duì)它們的動(dòng)作,并且它們甚至無(wú)需知道這已經(jīng)發(fā)生。1.4.2透明地提供高可用性:回?fù)芸梢灾赶蚓垲?lèi)負(fù)載平衡器或指向一個(gè)特定的實(shí)例或甚至指向橫跨多個(gè)數(shù)據(jù)中心的業(yè)務(wù)管理器而不改變協(xié)議,以允許在適當(dāng)時(shí)通話控制器透明地提供高可用性。貫穿該通話,存在例如在指向單個(gè)實(shí)例、聚類(lèi)負(fù)載平衡器、和業(yè)務(wù)管理器的回?fù)苤g的自由切換。例如,如果在系統(tǒng)高度使用時(shí)通話控制器部署變得負(fù)擔(dān)過(guò)重,則可以創(chuàng)建新的部署并且將這些通話中的一些以對(duì)這些客戶端完全透明的方式切換至所述新的部署。例如,在圖10的示例中,諸如通話建立、通話中事務(wù)的處理等所有主要的通話控制功能都由ca2或ca4-cc1處理的,而cc2僅充當(dāng)透明接口。即,cc1和cc3分別對(duì)alice和bob的客戶端“假裝”它們實(shí)際上是通話控制器(即,實(shí)行核心通話控制功能)。在其他示例中,通話控制功能可以在不同的通話控制器部署之間共享。cc1和cc3被示出為分離的部署以有助于描述,但是實(shí)際上,相同的部署可以執(zhí)行cc1和cc3兩者的功能,即cc2/cc4可以對(duì)單個(gè)部署之后的客戶端隱藏。如將理解的,該連續(xù)的url重寫(xiě)機(jī)制可以應(yīng)用于任何長(zhǎng)度的控制器鏈。應(yīng)當(dāng)注意的是,本文中的“向客戶端發(fā)送消息”(或類(lèi)似的)包括經(jīng)由服務(wù)器發(fā)送消息,其可以修改消息的內(nèi)容。1.4.3代理鏈的額外使用:代理鏈可以用于實(shí)現(xiàn)其他的功能;以下是一些示例。為了創(chuàng)建消息記錄解決方案(其記錄在通話代理與通話控制器之間發(fā)送和接收的所有消息),創(chuàng)建了這樣的代理服務(wù)器,其“假裝”是通話控制器,并且在從客戶端接收了任何消息之后執(zhí)行以下操作:a.記錄消息;b.創(chuàng)建庫(kù),所述庫(kù)將客戶端提供的回?fù)躸rl映射至指向代理服務(wù)器的回?fù)躸rl;c.在消息主體中更新回?fù)躸rl以指向代理服務(wù)器;d.向“實(shí)際的”通話控制器發(fā)送經(jīng)更新的消息。類(lèi)似地,通過(guò)在客戶端與通話控制器之間插入代理可以創(chuàng)建計(jì)費(fèi)解決方案,并且使其追蹤該通話的壽命和更新。通過(guò)在客戶端與通話控制器之間插入代理可以創(chuàng)建授權(quán)解決方案,其驗(yàn)證每個(gè)動(dòng)作。額外地,可以創(chuàng)建新的代理服務(wù)器,其添加僅需要由客戶端理解而不是由“實(shí)際的”通話控制器理解的新能力。這可以通過(guò)使客戶端與代理服務(wù)器討論哪些新功能來(lái)實(shí)現(xiàn),其可以理解并將添加額外的鏈接和消息內(nèi)容(在通話控制器理解的基本集合之外)。2.控制器實(shí)例的高可用性:2.1介紹:在下文呈現(xiàn)了提供云控制器的高可用性的機(jī)制,即使在系統(tǒng)故障的事件中。這些在通話控制器的上下文中描述的,但是所述技術(shù)可以應(yīng)用于其他類(lèi)型的云服務(wù)(例如,應(yīng)用于媒體模態(tài)控制器)。通話控制器是基于云的服務(wù),其需要高可靠性和可用性來(lái)確保用戶即使在面對(duì)機(jī)器故障時(shí)也注意不到明顯的服務(wù)中斷,所述服務(wù)終端在大型數(shù)據(jù)中心中是非常常見(jiàn)的,例如,這是由于網(wǎng)絡(luò)/電力基礎(chǔ)結(jié)構(gòu)中的故障或軟件故障所導(dǎo)致的。在高可用性之后的基本概念中的一個(gè)基本概念是具有向用戶提供服務(wù)的機(jī)器的聚類(lèi)(參見(jiàn)上文),并且確保當(dāng)一些實(shí)例停機(jī)時(shí),來(lái)自用戶的請(qǐng)求是由活動(dòng)的其他實(shí)例來(lái)服務(wù)的。針對(duì)該問(wèn)題存在兩個(gè)方面(從通話控制器的角度來(lái)看):1.聚類(lèi)中的實(shí)例的子集的故障不應(yīng)該引起用戶無(wú)法進(jìn)行新的通話;2.聚類(lèi)中的實(shí)例的子集的故障不應(yīng)該引起正在進(jìn)行的通話發(fā)生故障。第一個(gè)問(wèn)題可以通過(guò)使用云(如,azure)的paas(平臺(tái)即服務(wù))能力并且創(chuàng)建其前面有負(fù)載平衡器(參見(jiàn)上文)的聚類(lèi)來(lái)解決,這確保了新請(qǐng)求去往活動(dòng)的實(shí)例。即,要解決的第一個(gè)問(wèn)題在于確保機(jī)器故障不引起整體中斷。可以使用聚類(lèi)來(lái)解決該問(wèn)題。通話控制器部署包括其前面有負(fù)載平衡器的許多實(shí)例,這確保了業(yè)務(wù)被路由至活動(dòng)的實(shí)例??蛻舳伺c負(fù)載均衡器交談,并且因此或多或少不受個(gè)體的實(shí)例故障的影響。在連通性方面的一些小的波動(dòng)由客戶端重試處理以考慮到瞬時(shí)故障。這足以給予“新通話”高的可用性,因?yàn)橥ㄔ拕?chuàng)建請(qǐng)求會(huì)自動(dòng)著陸在活動(dòng)的實(shí)例上。然而,對(duì)于正在進(jìn)行的通話這是不夠的,因?yàn)槠洳蛔阋源_保通話中的命令(例如將視頻添加至僅音頻通話,或者將通話掛起)著陸在活動(dòng)的實(shí)例上。確保通話的運(yùn)行時(shí)狀態(tài)被正確恢復(fù)是必需的,以使得通話中命令可以被正確地執(zhí)行。解決該問(wèn)題的一種方式是將所有的回?fù)苕溄?例如那些在章節(jié)1中向特定實(shí)例所呈現(xiàn)的)(其與可以針對(duì)進(jìn)行中的通話在通話控制器上調(diào)用的命令相對(duì)應(yīng))綁至特定的實(shí)例,因此確保所有的運(yùn)行時(shí)狀態(tài)已經(jīng)存在(即,活動(dòng)的),以使得通話中的命令可以被正確地執(zhí)行。然而,這有害于高可用性,因?yàn)閷?shí)例的故障將引起通話的故障。另一解決方案將是:1.確保針對(duì)通話中的動(dòng)作的回?fù)躸rl指向聚類(lèi)負(fù)載平衡器,而不是任何特定的實(shí)例2.將服務(wù)的運(yùn)行時(shí)狀態(tài)存儲(chǔ)在諸如azure儲(chǔ)存表之類(lèi)的高度可用的外部存儲(chǔ)中。然而,由于以下原因,靠其自身是不夠的:a.服務(wù)的運(yùn)行時(shí)狀態(tài)是復(fù)雜的,并且在非常復(fù)雜的對(duì)象圖表中分布。由此,不容易簡(jiǎn)單地序列化該圖表以供外部存儲(chǔ),并且不容易基于外部數(shù)據(jù)來(lái)重新構(gòu)建該圖表。b.多個(gè)機(jī)器可以同時(shí)作用于相同的運(yùn)行時(shí)狀態(tài),并且可能不容易能夠達(dá)成對(duì)數(shù)據(jù)的一致觀點(diǎn)。例如,對(duì)于通話服務(wù),添加參與者請(qǐng)求可以著陸在一個(gè)實(shí)例上,而刪除參與者請(qǐng)求可以著陸在另一個(gè)實(shí)例上,這需要兩個(gè)實(shí)例對(duì)最終的結(jié)果達(dá)成一致。盡管通過(guò)使用公知的同步基元可以以傳統(tǒng)的編程來(lái)解決該問(wèn)題,但是這在分布式環(huán)境中不再起作用。以下的部分將覆蓋可以用于確保聚類(lèi)中的任何實(shí)例可以處理通話中命令的方法。首先,將描述圍繞運(yùn)行時(shí)狀態(tài)的概念的一些上下文以幫助說(shuō)明。2.2運(yùn)行時(shí)狀態(tài):在面向?qū)ο缶幊?oop)的上下文中,計(jì)算機(jī)程序(即,代碼)可以定義對(duì)象類(lèi)。類(lèi)是針對(duì)特定類(lèi)型的對(duì)象的模板,并且類(lèi)在處理器上被實(shí)例化以在處理上創(chuàng)建(邏輯)對(duì)象。對(duì)象具有狀態(tài)(即,在處理器存儲(chǔ)器的一些單元處保存的狀態(tài)數(shù)據(jù)),以及行為(即,與可執(zhí)行代碼關(guān)聯(lián)的)。對(duì)象可以被視為類(lèi)的具體實(shí)例??梢詫⒛0鍖?shí)例化多次以創(chuàng)建具有相同類(lèi)型的多個(gè)對(duì)象。運(yùn)行時(shí)對(duì)象曲線作為處理任何操作的結(jié)果而被創(chuàng)建,并且由以許多方式彼此引用的各種邏輯對(duì)象組成。例如,簡(jiǎn)單的示例性計(jì)算機(jī)程序可以將對(duì)象類(lèi)定義如下:在這里,a引用b(因?yàn)槠渚哂蓄?lèi)型b的成員),并且b引用c,而c進(jìn)而引用a。所有這些對(duì)象類(lèi)型在它們的狀態(tài)中還具有一些簡(jiǎn)單的普通老式數(shù)據(jù)類(lèi)型,即針對(duì)類(lèi)a的整型變量x,針對(duì)類(lèi)b的字符串變量y,以及針對(duì)類(lèi)c的布爾型變量z。在下文中,符號(hào)instanceof(<class>)指的是通過(guò)在處理器上將對(duì)象類(lèi)<class>實(shí)例化而創(chuàng)建的活動(dòng)對(duì)象,從在處理器能夠直接訪問(wèn)的處理器的存儲(chǔ)器414中實(shí)現(xiàn)的意義上來(lái)說(shuō)所述對(duì)象是活動(dòng)的。這些類(lèi)的實(shí)例化創(chuàng)建了在圖11a中示意性地表示的對(duì)象圖表g。即,分別是類(lèi)a、b、和c的實(shí)例的對(duì)象oba、obb、obc形成了對(duì)象圖表g。由于類(lèi)彼此引用的方式,所以對(duì)象圖表g可以被視為具有從oba至obb、從obb至obc、以及從obc回到oba的邊緣。完全作為示例,圖11b示出了可以如何在處理器存儲(chǔ)器414中實(shí)現(xiàn)通過(guò)將在上文中所定義的類(lèi)實(shí)例化所創(chuàng)建的對(duì)象圖表g。當(dāng)然,實(shí)現(xiàn)對(duì)象實(shí)例的準(zhǔn)確方式將取決于編譯器和平臺(tái)實(shí)現(xiàn)細(xì)節(jié)。在該示例中:-oba被實(shí)現(xiàn)為在存儲(chǔ)器114中的單元addro處所保存的存儲(chǔ)器指針(引用)p4,以及在addro+4處的變量x的值(在該示例中,每個(gè)存儲(chǔ)器位置保存4個(gè)字節(jié));-obb被實(shí)現(xiàn)為在addrp處保存的存儲(chǔ)器指針p4,以及在addrp+4處的y的值-obc被實(shí)現(xiàn)為addrq處的指針p3,以及addrq+4處的z的值。在addro+4、addrp+4、addrq+4處的值x、y和z分別構(gòu)成了oba、obb、和obc的狀態(tài)數(shù)據(jù)。指針p1、p2、p3是利用其實(shí)現(xiàn)對(duì)象之間的引用的機(jī)制:p1指向addrp,在該處obb在存儲(chǔ)器114中被實(shí)現(xiàn);p2指向addrq,在該處obc在存儲(chǔ)器114中被實(shí)現(xiàn);以及p3回至addro,在該處oba在存儲(chǔ)器114中被實(shí)現(xiàn)??梢钥匆?jiàn)的是,由于類(lèi)定義的復(fù)雜性和所定義的引用其他類(lèi)的更多的類(lèi),因此所得出的對(duì)象圖表傾向于具有長(zhǎng)且可能復(fù)雜的指針鏈,其傾向于隨著更多對(duì)象被創(chuàng)建而增加長(zhǎng)度。引用必須被實(shí)現(xiàn)為存儲(chǔ)器中的指針的事實(shí)使得它們?cè)诒举|(zhì)上難以序列化?!靶蛄谢笔窃谔幚砥鞯拇鎯?chǔ)器中所實(shí)現(xiàn)的將對(duì)象圖表(例如r’)翻譯成可以存儲(chǔ)在外部存儲(chǔ)中的格式的過(guò)程,例如,存儲(chǔ)在文件或存儲(chǔ)器緩沖器中或者跨網(wǎng)絡(luò)連接鏈路而發(fā)送,并且之后在相同的或另一個(gè)計(jì)算機(jī)環(huán)境中重建。當(dāng)根據(jù)序列化格式重新讀取所得出的位的序列時(shí),其可以用于在相同的處理器的或另一處理器的存儲(chǔ)器中創(chuàng)建對(duì)原始對(duì)象在語(yǔ)義上相同的克隆。2.3對(duì)象圖表恢復(fù):該公開(kāi)提供了一種用于創(chuàng)建運(yùn)行時(shí)狀態(tài)的通用框架,其即使針對(duì)非常復(fù)雜的計(jì)算機(jī)程序也保持可序列化。所述框架規(guī)定了在計(jì)算機(jī)程序內(nèi)如何定義對(duì)象類(lèi),并且特別地定義了對(duì)象類(lèi)應(yīng)該如何彼此引用。當(dāng)堅(jiān)持該引用的系統(tǒng)時(shí),被創(chuàng)建為這些類(lèi)的所得出的對(duì)象圖表被實(shí)例化為保持容易可序列化,而不管它們變得如何復(fù)雜。在章節(jié)2中,呈現(xiàn)了以下技術(shù):1.用于以可序列化的方式表示整個(gè)運(yùn)行時(shí)對(duì)象圖表的技術(shù);2.用于在給定序列化狀態(tài)的情況下創(chuàng)建對(duì)象圖表的技術(shù);3.用于創(chuàng)建指向?qū)ο蟮幕負(fù)苕溄?如在章節(jié)1中所使用的)的技術(shù),從該對(duì)象處可以重新創(chuàng)建所需的圖表的部分;4.用于確保該恢復(fù)不引起堆棧溢出的技術(shù)。在章節(jié)3中,公開(kāi)了以下技術(shù):5.用于確保對(duì)象圖表的單個(gè)恢復(fù)以確保一致性的技術(shù)6.用于在整個(gè)聚類(lèi)中保持所有實(shí)例的健康知識(shí)是最新的技術(shù);7.用于通過(guò)創(chuàng)建針對(duì)序列化狀態(tài)數(shù)據(jù)的虛擬存儲(chǔ)來(lái)優(yōu)化序列化狀態(tài)數(shù)據(jù)的讀/寫(xiě)的技術(shù)。一般服務(wù)的運(yùn)行時(shí)狀態(tài)包括彼此引用的多個(gè)對(duì)象。這些對(duì)象一起形成了活動(dòng)的對(duì)象圖表,并且彼此協(xié)調(diào)以執(zhí)行服務(wù)功能——例如,通話控制器功能。當(dāng)通話被建立時(shí),對(duì)象圖表被創(chuàng)建并且隨著通話建立過(guò)程進(jìn)展而被修改。對(duì)象圖表構(gòu)成了通話的通話狀態(tài),這在于其實(shí)施了關(guān)于該通話的當(dāng)前狀態(tài)的所有信息。如在下文中更加詳細(xì)地描述的,一旦該通話已經(jīng)被建立,則對(duì)象圖表被序列化以創(chuàng)建存儲(chǔ)在計(jì)算機(jī)存儲(chǔ)中的狀態(tài)數(shù)據(jù),對(duì)象圖表可以在之后的時(shí)間根據(jù)其在該處理器或另一處理器上被重新構(gòu)造(重新激活)。服務(wù)(例如,通話控制服務(wù)、媒體控制服務(wù))是由多個(gè)協(xié)作的對(duì)象傳遞的,其各自實(shí)現(xiàn)相應(yīng)的服務(wù)功能并且具有某一形式的狀態(tài)數(shù)據(jù)(服務(wù)對(duì)象)。服務(wù)類(lèi)指的是定義了針對(duì)服務(wù)對(duì)象的模板的類(lèi)。服務(wù)類(lèi)提供了(定義了)相應(yīng)的服務(wù)功能和狀態(tài)數(shù)據(jù)的結(jié)構(gòu),例如,通過(guò)定義當(dāng)服務(wù)列表被實(shí)例化時(shí)向其分配值的一個(gè)或多個(gè)變量以創(chuàng)建服務(wù)對(duì)象(所述值構(gòu)成了狀態(tài)數(shù)據(jù))。服務(wù)功能是基于狀態(tài)數(shù)據(jù)實(shí)現(xiàn)的,并且其還可以修改狀態(tài)數(shù)據(jù)。對(duì)于需要較高可用性的分布式系統(tǒng)而言,該對(duì)象圖表需要在需要處理針對(duì)正在進(jìn)行的通話的用戶請(qǐng)求的任何實(shí)例上被恢復(fù)。任何通用對(duì)象包括兩種形式的狀態(tài):1.簡(jiǎn)單的可序列化的狀態(tài),例如字符串、整型、布爾型(或由這些簡(jiǎn)單實(shí)體組成的任何其他復(fù)雜的結(jié)構(gòu))2.對(duì)其他對(duì)象的引用將對(duì)象狀態(tài)的第一部分存儲(chǔ)在任何外部存儲(chǔ)中是非常容易的,但是存儲(chǔ)第二部分(引用)不這么容易。該公開(kāi)的通用恢復(fù)框架是基于以下概念的(類(lèi)的類(lèi)型):1.persistedobject(持續(xù)型對(duì)象)——包含某一簡(jiǎn)單的可序列化狀態(tài),并且“可序列化引用”(參見(jiàn)下文)其他persistedobject(持續(xù)型對(duì)象)的任何對(duì)象:a.每個(gè)持續(xù)型對(duì)象實(shí)現(xiàn)getreference()函數(shù),該函數(shù)將persistedobjectreference(持續(xù)型對(duì)象引用)返回至該對(duì)象;每個(gè)服務(wù)對(duì)象是persistedobject;2.persistedobjectreference——對(duì)persistedobject的可序列化引用。序列化的persistedobjectreference僅僅包括兩段數(shù)據(jù):a.persistedobject的唯一標(biāo)識(shí)符(id);b.persistedobjectfactory(持續(xù)型對(duì)象工廠)(工廠對(duì)象標(biāo)識(shí)符)的唯一id——參見(jiàn)下文;3.每個(gè)persistedobjectreference實(shí)現(xiàn)被稱(chēng)為getobject()的函數(shù),該函數(shù)將指針?lè)祷刂林赶騪ersistedobjectreference對(duì)象所指向的、在本地可激活/恢復(fù)的persistedobject的位置的指針;4.persistedobjectfactory——知道如何基于來(lái)自外部存儲(chǔ)的數(shù)據(jù)來(lái)創(chuàng)建特定類(lèi)型的persistedobject的對(duì)象。每個(gè)工廠實(shí)現(xiàn)createobject()函數(shù),其由persistedobjectreference調(diào)用以實(shí)際上創(chuàng)建(或定位——參見(jiàn)下文的章節(jié)2.2)該對(duì)象;5.persistedobjectfactorylocator(持續(xù)型對(duì)象工廠定位器)——所有的工廠都向其登記以使得任何人都可以訪問(wèn)所需的工廠的對(duì)象;提供了getfactory()函數(shù),該函數(shù)對(duì)工廠標(biāo)識(shí)符實(shí)現(xiàn)以返回經(jīng)標(biāo)識(shí)的工廠;6.persistedobjectstore(持續(xù)型對(duì)象存儲(chǔ))——隱藏外部存儲(chǔ)器的實(shí)現(xiàn)的抽象化,以使得恢復(fù)基礎(chǔ)結(jié)構(gòu)對(duì)任何特定的外部存儲(chǔ)器都沒(méi)有依賴(lài);其被配置為提供getstate()函數(shù),該函數(shù)在對(duì)象id上調(diào)用以從存儲(chǔ)取回經(jīng)標(biāo)識(shí)的對(duì)象的序列化狀態(tài)數(shù)據(jù)(例如,getstate(objectid)返回具有標(biāo)識(shí)符objectid的服務(wù)對(duì)象的狀態(tài)數(shù)據(jù))。每個(gè)persistedobject類(lèi)還被配置為提供initialize()函數(shù),該函數(shù)用于利用由getstate()所取回的狀態(tài)數(shù)據(jù)將新創(chuàng)建的對(duì)象初始化。“class[大寫(xiě)c]對(duì)象”(或類(lèi)似的)指的是通過(guò)將類(lèi)“class”實(shí)例化所創(chuàng)建的對(duì)象。例如,“persistedobejcta對(duì)象”指的是通過(guò)將類(lèi)persistedobejcta實(shí)例化所創(chuàng)建的對(duì)象。換句話說(shuō),persistedobjectreference是可序列化的對(duì)象,其不混淆地指向persistedobejct。此外,我們創(chuàng)建了persistedobjectfactory和persistedobjectfactorylocator的概念,或者在給定persistedobjectreference的情況下創(chuàng)建了對(duì)象。每個(gè)persistedobjectreference對(duì)象(引用對(duì)象)具有以下的狀態(tài)數(shù)據(jù):1.objectid——針對(duì)persistedobject對(duì)象的唯一的id,其可以由persistedobjectfactory使用從任何外部存儲(chǔ)提取任何狀態(tài);2.factoryid——針對(duì)persistedobjectfactory對(duì)象的唯一的id,其可以創(chuàng)建由objectid所表示的persistedobject。該id通過(guò)調(diào)用persistedobjectfactorylocator.get(<factoryid>)來(lái)定位工廠對(duì)象?!皩?duì)<持續(xù)型對(duì)象>的persistedobjectreference”被用作速記以指其狀態(tài)數(shù)據(jù)包括<持續(xù)型對(duì)象>的persistedobject標(biāo)識(shí)符的引用對(duì)象。任何persistedobject對(duì)象(持續(xù)型對(duì)象)具有至少一種方法(函數(shù)):getreference(),該函數(shù)返回針對(duì)該persistedobject對(duì)象的persistedobjectreference。所有persistedobjectreference對(duì)象具有方法:getobeject(),其返回引用對(duì)象所指向的persistedobject的實(shí)例,即在引用對(duì)象中由objectid所標(biāo)識(shí)的persistedobject對(duì)象。所有的persistedobjectfactory對(duì)象(工廠對(duì)象)具有方法:createobject(),其采用將persistedobject標(biāo)識(shí)為輸入的objectid,并且從對(duì)應(yīng)的序列化狀態(tài)數(shù)據(jù)創(chuàng)建經(jīng)標(biāo)識(shí)的persistedobject,或如果經(jīng)識(shí)別的persistedobject已經(jīng)被創(chuàng)建,則對(duì)其進(jìn)行定位。persistedobjectfactorylocator是單件實(shí)例(工廠定位器對(duì)象),其中所有的persistedobjectfactory對(duì)象都在過(guò)程開(kāi)始時(shí)(例如,在啟動(dòng)時(shí)當(dāng)計(jì)算機(jī)程序首先在處理器上實(shí)例化時(shí))向其登記。即,在啟動(dòng)時(shí),所有的持續(xù)型對(duì)象工廠都向persistedobjectfactorylocator的單件實(shí)例登記,以使得已知任何persistedobjectreference可以用于創(chuàng)建實(shí)際的persistedobject實(shí)例。由于persistedobjectreference是可序列化的,因此有可能將每個(gè)對(duì)象的狀態(tài)存儲(chǔ)到外部存儲(chǔ)器中,并且由于存在與每個(gè)對(duì)象引用相對(duì)應(yīng)的不混淆的工廠,因此總是有可能從序列化狀態(tài)創(chuàng)建persistedobject的實(shí)例。所有通話控制器對(duì)象都是persistedobject,其將它們的狀態(tài)序列化并且在它們的壽命中良好定義的點(diǎn)處寫(xiě)入persistedobjectstore。任何其他實(shí)例將能夠僅僅通過(guò)從根對(duì)象開(kāi)始來(lái)恢復(fù)整個(gè)對(duì)象圖表。persistedobjectstore也在啟動(dòng)時(shí)被實(shí)例化以創(chuàng)建存儲(chǔ)對(duì)象。通話控制器通過(guò)使用以下的url方案來(lái)創(chuàng)建通話中回?fù)苕溄樱篽ttps://<callcontrollerfqdn>/<persistedobjectfactoryid>/<persistedobjectid>因此,如果接收到任何通話中命令,則通話控制器可以通過(guò)解析出工廠id和對(duì)象id來(lái)創(chuàng)建persistedobjectreference,并且接著,可以對(duì)參考對(duì)象調(diào)用getobject(),以得到實(shí)際的persistedobject的句柄。一旦其具有了到一個(gè)persistedobject的句柄,則對(duì)象圖表的子圖表(針對(duì)該子圖表,經(jīng)標(biāo)識(shí)的persistedobject是根)可以通過(guò)跟隨引用鏈而被漸進(jìn)地構(gòu)造。即,來(lái)自經(jīng)標(biāo)識(shí)的持續(xù)型對(duì)象向下的一切都被構(gòu)造——這可能不包括圖表中的所有對(duì)象。因此,遵守該框架的計(jì)算機(jī)程序可以:-定義一個(gè)或多個(gè)persistedobject類(lèi),即針對(duì)持續(xù)型對(duì)象的一個(gè)或多個(gè)模板,其每個(gè)被配置為提供:getreference()函數(shù);-針對(duì)一個(gè)或多個(gè)persistedobject類(lèi)中的每個(gè)類(lèi)的persistedobjectfactory類(lèi),其每個(gè)可以被配置為提供:createobject()函數(shù),該函數(shù)從其序列化表示來(lái)創(chuàng)建該類(lèi)型的持續(xù)型對(duì)象;-persistedobjectreference類(lèi),其被配置為提供:持續(xù)型對(duì)象id;能夠創(chuàng)建(或定位)經(jīng)標(biāo)識(shí)的持續(xù)型對(duì)象的工廠id;getobject()函數(shù),其返回經(jīng)標(biāo)識(shí)的持續(xù)型對(duì)象;-persistedobjectfactorlocator類(lèi);以及-persistedobjectstore類(lèi)。因此,在上文中所定義的類(lèi)a、b、和c根據(jù)以下的當(dāng)前框架而被重新定義:應(yīng)當(dāng)注意的是,persistedobjectreferencepersisteda、persistedb、persistedc不直接引用其他persistedobject類(lèi),即沒(méi)有persistedobject類(lèi)具有persistedobject類(lèi)型的成員——persistedobject類(lèi)僅僅具有persistedobjectreference類(lèi)型的成員,并且因此僅僅間接地引用其他persistedobject類(lèi)。對(duì)于每一類(lèi)型的persistedobject,也將存在對(duì)應(yīng)的persistedobjectfactory類(lèi):工廠類(lèi)將在啟動(dòng)時(shí)被實(shí)例化以創(chuàng)建工廠對(duì)象pofa、pofb、和pofc,它們分別用于創(chuàng)建具有類(lèi)型persisteda、persistedb、和persistedc的對(duì)象。pofa、pofb、和pofc可以從序列化的狀態(tài)數(shù)據(jù)分別重新創(chuàng)建具有類(lèi)型persisteda、persistedb、和persistedc的對(duì)象。如在上文中所定義的,類(lèi)persisteda-persistedc將接著在程序的某一階段被實(shí)例化以分別創(chuàng)建持續(xù)型對(duì)象poba、pobb、pobc,如persistedobjectreference類(lèi)將會(huì)創(chuàng)建對(duì)應(yīng)的持續(xù)型對(duì)象引用那樣:-pora:包含poba的持續(xù)型對(duì)象標(biāo)識(shí)符,以及pofa的工廠標(biāo)識(shí)符;-pora:包含pobb的持續(xù)型對(duì)象標(biāo)識(shí)符,以及pofb的工廠標(biāo)識(shí)符;-pora:包含pobc的持續(xù)型對(duì)象標(biāo)識(shí)符,以及pofc的工廠標(biāo)識(shí)符。持續(xù)型對(duì)象poa、pob、和poc以及引用對(duì)象pora、porb、porc被構(gòu)造為對(duì)象圖表pg,在圖12a中示出了其概念性視圖。由于各種類(lèi)彼此引用的方式所致,對(duì)象圖表pg可以被視為具有邊緣(被示出為箭頭)。圖12b示出了可以如何在處理器的存儲(chǔ)器414中實(shí)現(xiàn)對(duì)象和邊緣的一個(gè)示例。再一次,這僅僅是用于幫助示出的示例——在實(shí)踐中,這將取決于對(duì)編譯器/處理器平臺(tái)的實(shí)現(xiàn)細(xì)節(jié)。類(lèi)似于圖11a,每個(gè)服務(wù)poba、pobb、pobc在存儲(chǔ)器中被實(shí)現(xiàn)(在addro至addro+4、addrp至addrp+4、以及addrq至addrq+4處分別地實(shí)現(xiàn))為:-addro處相應(yīng)的存儲(chǔ)器指針p1,addrp處的p2、addrr處的p3;以及-addro+4處的x的值,addrp+4處的y的值,addrq+4處的z的值。然而,相比于圖11a,指針p1、p2、p3不指向其他持續(xù)型對(duì)象的存儲(chǔ)器單元;它們而是指向相關(guān)引用對(duì)象的單元addrr、addrs、addrt。這是因?yàn)閜ersistedobject類(lèi)僅僅具有persistedobjectreference成員類(lèi)型。addrr至addrr+4是實(shí)現(xiàn)porb的地方(并且因?yàn)轭?lèi)persisteda間接地引用persistedb,所以p1指向這里):addrr保存pofb<pofb的id>的工廠對(duì)象標(biāo)識(shí)符,而addrr+4保存pobb<pobb的id>的持續(xù)型對(duì)象標(biāo)識(shí)符。addrs至addrs+4是實(shí)現(xiàn)porc的地方(并且因?yàn)轭?lèi)persistedb間接地引用persistedc,所以p2指向這里):addrs保存pofc<pofc的id>的工廠對(duì)象標(biāo)識(shí)符,并且addrr+4保存pobc<pobc的id>的持續(xù)型對(duì)象標(biāo)識(shí)符。addrt至addrt+4是實(shí)現(xiàn)pora的地方(并且因?yàn)轭?lèi)persistedc間接地引用persisteda,所以p3指向這里):addrs保存pofa<pofa的id>的工廠對(duì)象標(biāo)識(shí)符,并且addrr+4保存poba<poba的id>的持續(xù)型對(duì)象標(biāo)識(shí)符。也保存在存儲(chǔ)器414中的是一組映射m,其針對(duì)每個(gè)活動(dòng)的持續(xù)型對(duì)象,將持續(xù)型對(duì)象的標(biāo)識(shí)符映射至標(biāo)識(shí)在其處實(shí)現(xiàn)經(jīng)標(biāo)識(shí)的持續(xù)型對(duì)象的位置的相應(yīng)的存儲(chǔ)器指針(即,保存其狀態(tài)數(shù)據(jù)的地方)——在該示例中,m包括:-第一映射m1:<poba的id>-﹥<指向addro的指針>-第二映射m2:<pobb的id>-﹥<指向addrp的指針>-第三映射m3:<pobc的id>-﹥<指向addrq的指針>所述映射被保持在本地激活高速緩存中(參見(jiàn)下文的章節(jié)2.2)。也保存在存儲(chǔ)器中的是一組工廠映射fm,其將工廠標(biāo)識(shí)符映射至實(shí)現(xiàn)相關(guān)的工廠對(duì)象pofa、pofb、pofc的存儲(chǔ)器中的單元。當(dāng)對(duì)應(yīng)的工廠對(duì)象向factoryobjectlocator登記時(shí),創(chuàng)建fm中的每個(gè)映射。不管對(duì)象圖表變得變得如何復(fù)雜(即,由于定義了引用其他類(lèi)的更多類(lèi)以及所創(chuàng)建的更多對(duì)象),框架避免產(chǎn)生指針的長(zhǎng)鏈的情形(即,指針指向指針,其指向其他指針,其指向另外的指針,其指向另外的指針等)。換句話說(shuō),persistedobjectreference對(duì)象的出現(xiàn)有效地打破了對(duì)象間引用的鏈,以使得盡管其復(fù)雜性,但是要序列化的結(jié)構(gòu)保持易處理。即,不管對(duì)象圖表多復(fù)雜,將序列化函數(shù)應(yīng)用于持續(xù)型對(duì)象被保證為在相對(duì)較短的時(shí)間內(nèi)生成易處理的輸出,這是因?yàn)閷?duì)個(gè)體的持續(xù)型對(duì)象的序列化保證能以持續(xù)型對(duì)象所指向的參考對(duì)象終止。2a.序列化:已知該結(jié)構(gòu)和序列化函數(shù)(例如,已知的json序列化函數(shù)):1.serialize(instanceof(persisteda))將返回以下內(nèi)容(如果使用json序列化器來(lái)序列化)):2.serialize(instanceof(persistedb))將返回以下內(nèi)容(如果使用json序列化器來(lái)序列化)):3.serialize(instanceof(persistedc))將返回以下內(nèi)容(如果使用json序列化器來(lái)序列化)):在該示例中,經(jīng)序列化的狀態(tài)數(shù)據(jù)是純文本格式的。在計(jì)算機(jī)程序?qū)崿F(xiàn)通話控制器的情況下,可以針對(duì)由通話控制器的實(shí)例所建立的每個(gè)通話而創(chuàng)建相應(yīng)的對(duì)象圖表。當(dāng)通話被建立時(shí),在處理器的存儲(chǔ)器中創(chuàng)建實(shí)現(xiàn)函數(shù)以建立通話的新的服務(wù)對(duì)象——這些形成了對(duì)象圖表,這構(gòu)成了通話的活動(dòng)通話狀態(tài)(參見(jiàn)以下的示例)。接著,一旦通話已經(jīng)被建立(例如),活動(dòng)通話狀態(tài)被序列化、被存儲(chǔ)在外部存儲(chǔ)中、并且活動(dòng)通話狀態(tài)被去激活,由此釋放了處理器上的資源。在通話中之后的時(shí)間,例如,響應(yīng)于諸如將新的參與者添加至通話的請(qǐng)求之類(lèi)的某一通話中請(qǐng)求消息,對(duì)象圖表的至少一部分是(即,至少一些服務(wù)對(duì)象是)可以被執(zhí)行以實(shí)現(xiàn)該請(qǐng)求的事務(wù)。執(zhí)行該事務(wù)可以修改所恢復(fù)的活動(dòng)通話狀態(tài)。當(dāng)完成該事務(wù)時(shí),可以以相同的方式來(lái)序列化經(jīng)修改的活動(dòng)的通話狀態(tài)以更新在外部存儲(chǔ)中所保存的通話狀態(tài)的經(jīng)序列化的版本。圖13是用于序列化持續(xù)型對(duì)象的方法的流程圖。在該示例中,每個(gè)持續(xù)型對(duì)象在每次其狀態(tài)改變時(shí)被序列化——這僅僅是出于說(shuō)明的目的的一個(gè)示例。在流程圖的右手側(cè),提供了插圖以幫助理解在相關(guān)的方法步驟處執(zhí)行的操作。在步驟s1304處,持續(xù)型對(duì)象pob中的第一個(gè)(例如,poba)被序列化以生成針對(duì)pob的個(gè)體的經(jīng)序列化的狀態(tài)1302,例如,使用json序列化函數(shù)。個(gè)體的狀態(tài)數(shù)據(jù)1302包括:-由po所引用的任何持續(xù)型對(duì)象的持續(xù)型對(duì)象標(biāo)識(shí)符1306——例如,針對(duì)poba,因?yàn)閜oba引用了pobb,所以是<pobb的id>——以及;-用于重新創(chuàng)建對(duì)象所引用的持續(xù)型對(duì)象的工廠對(duì)象的工廠對(duì)象標(biāo)識(shí)符1304——例如,針對(duì)poba,是<pofb的id>,因?yàn)閜oba引用了pobb;-針對(duì)pob的狀態(tài)數(shù)據(jù)(例如,針對(duì)poba,x的值)。還可以使用任何其他合適的序列化技術(shù);例如,bond序列化,二進(jìn)制序列化等。在步驟s1306處,在表示整個(gè)對(duì)象圖表pg的序列化狀態(tài)數(shù)據(jù)1300中包括個(gè)體的狀態(tài)數(shù)據(jù)1302。個(gè)體的數(shù)據(jù)1302在序列化數(shù)據(jù)1300中由以下項(xiàng)來(lái)標(biāo)記i)持續(xù)型對(duì)象pob自身的持續(xù)型對(duì)象標(biāo)識(shí)符1308(例如,<poba的id>),以及ii)用于重新創(chuàng)建pob的工廠的工廠對(duì)象標(biāo)識(shí)符1310(例如,<pofa的id>。在步驟s1308處,生成了回?fù)躸rl1312,其包括工廠對(duì)象標(biāo)識(shí)符1308和持續(xù)型對(duì)象標(biāo)識(shí)符1310。由工廠對(duì)象標(biāo)識(shí)符1310所標(biāo)識(shí)的工廠對(duì)象被配置為從經(jīng)序列化的數(shù)據(jù)1300重新創(chuàng)建持續(xù)型對(duì)象pob,當(dāng)pob的持續(xù)型對(duì)象標(biāo)識(shí)符1308被輸入到工廠對(duì)象的createobject()函數(shù)時(shí)。例如,已經(jīng)在s1306處被序列化的持續(xù)型對(duì)象可以實(shí)現(xiàn)某一通話控制服務(wù)功能,例如,用于將參與者添加至通話;在s1308處所生成的回?fù)躸rl被發(fā)送至參與通話的客戶端;為了將參與者添加至通話,客戶端訪問(wèn)該鏈接。當(dāng)該鏈接被訪問(wèn)時(shí):-因?yàn)閡rl包含工廠對(duì)象標(biāo)識(shí)符1308,所以可以從url自身識(shí)別重新創(chuàng)建pob所需要的工廠對(duì)象;并且-在url自身中包含的持續(xù)型對(duì)象標(biāo)識(shí)符1310可以被輸入到經(jīng)標(biāo)識(shí)的工廠對(duì)象以重新創(chuàng)建持續(xù)型對(duì)象pob。接著,客戶端知道如果其請(qǐng)求添加新的通話參與者,則訪問(wèn)該鏈接。針對(duì)任何剩余的persistedobject對(duì)象(例如,pobb、pobc)而重復(fù)過(guò)程s1304-s1308,(s1310)。例如如果創(chuàng)建了新的持續(xù)型對(duì)象,或者現(xiàn)有的持續(xù)型對(duì)象被更新,則可以再次執(zhí)行該過(guò)程,以便保持經(jīng)序列化的狀態(tài)1300是最新的。2b.對(duì)象重新創(chuàng)建(去序列化):現(xiàn)在已知任何經(jīng)序列化的數(shù)據(jù),其可以被去序列化(這意味著從其經(jīng)序列化的表示創(chuàng)建對(duì)象),并且從這里開(kāi)始,可以跟隨其引用鏈來(lái)創(chuàng)建可能需要的任何其他對(duì)象。針對(duì)上文中的示例,可以將針對(duì)instanceof(persistedc)的經(jīng)序列化的數(shù)據(jù)去序列化以恢復(fù)instanceof(persistedc),即pobc。接下來(lái),對(duì)pora的persistedobjectreference可以被恢復(fù),這是因?yàn)閜obc的經(jīng)序列化的狀態(tài)數(shù)據(jù)包含服務(wù)對(duì)象標(biāo)識(shí)符<poba的id>,即和<pofa的id>——這兩個(gè)標(biāo)識(shí)符是重新創(chuàng)建引用對(duì)象pora所需的全部,這是因?yàn)樗鼈儽硎玖艘脤?duì)象pora的狀態(tài)數(shù)據(jù)的總和。接下來(lái),調(diào)用instanceof(persistedc).pora.getobject()。從這里開(kāi)始,可以以相同的方式來(lái)恢復(fù)porb以及因此pobb。persistedobjectreference.getobject()被簡(jiǎn)單地實(shí)現(xiàn)為:1.factory=persistedobjectfactorylocator.getfactory(persistedobjectreference.factoryid)2.object=factory.createobject(persistedobjectreference.objectid)在本文中,“pob.f()”意指調(diào)用(即,進(jìn)行函數(shù)調(diào)用)由服務(wù)對(duì)象pob所實(shí)現(xiàn)的函數(shù)f()。通過(guò)在構(gòu)造具有任何persistedobject類(lèi)型的實(shí)例時(shí)生成合適的factoryid和objectid,并且將所生成的標(biāo)識(shí)符輸入至實(shí)例的構(gòu)造器來(lái)使得實(shí)現(xiàn)persistedobject.getreference()是可行的。例如,persisteda的構(gòu)造器可以將兩個(gè)參數(shù)factoryid和objectid作為輸入。圖14是從經(jīng)序列化的狀態(tài)數(shù)據(jù)重新創(chuàng)建服務(wù)對(duì)象的方法的流程圖。再一次,定位了繪圖表示以示出可以在對(duì)應(yīng)的方法步驟處執(zhí)行的示例性操作。這些僅僅是出于說(shuō)明的目的的示例。在步驟s1402處,接收服務(wù)重新激活消息。例如,所述服務(wù)激活消息可以與所建立的通話相關(guān),并且請(qǐng)求添加新的參與者。所述服務(wù)請(qǐng)求消息被發(fā)布至回?fù)躸rl1312(例如,如先前在圖13的s1308處所生成的),并根據(jù)章節(jié)1的信令協(xié)議而提供至客戶端。圖14的步驟s1404至s1410構(gòu)成了子例程,其被重復(fù)地執(zhí)行以重新激活以經(jīng)序列化的狀態(tài)數(shù)據(jù)1300表示的對(duì)象圖表的至少一部分——具體地,對(duì)象圖表的子圖表,針對(duì)該子圖表,在s1302的服務(wù)請(qǐng)求消息中所標(biāo)識(shí)的持續(xù)型對(duì)象是根,即由經(jīng)標(biāo)識(shí)的對(duì)象引用的所有持續(xù)型對(duì)象,并且進(jìn)而,由這些對(duì)象引用的任何另外的持續(xù)型對(duì)象,并且進(jìn)而,由所述另外的持續(xù)型對(duì)象引用的任何另外的持續(xù)型對(duì)象等。回?fù)苕溄?312被解析以獲得持續(xù)型對(duì)象標(biāo)識(shí)符1310以及用于重新創(chuàng)建該類(lèi)型的持續(xù)型對(duì)象的標(biāo)識(shí)工廠的工廠對(duì)象標(biāo)識(shí)符1308,并且所述子例程最開(kāi)始是針對(duì)這些持久型和工廠對(duì)象執(zhí)行的:在該示例中,鏈接包括<poba的id>和<pofa的id>,即持續(xù)型對(duì)象poba的持續(xù)型對(duì)象標(biāo)識(shí)符,以及用于從相關(guān)的序列化狀態(tài)數(shù)據(jù)創(chuàng)建poba的工廠對(duì)象pof的工廠對(duì)象標(biāo)識(shí)符。在步驟s1404處,工廠對(duì)象id1308和服務(wù)對(duì)象id1310用于恢復(fù)由服務(wù)對(duì)象標(biāo)識(shí)符1310所標(biāo)識(shí)的持續(xù)型對(duì)象pob的persistedobjectreference對(duì)象por——如在上文中所指示的,這兩個(gè)標(biāo)識(shí)符是重新構(gòu)造引用對(duì)象所需的全部。在步驟s1406處,搜索根據(jù)圖13所生成的經(jīng)序列化的狀態(tài)數(shù)據(jù)1300以找到具有與從回?fù)苕溄?312所獲得的工廠對(duì)象標(biāo)識(shí)符1308和持續(xù)型對(duì)象標(biāo)識(shí)符1310相匹配的標(biāo)簽的條目。在步驟s1408處,該條目中的個(gè)體的經(jīng)序列化的狀態(tài)數(shù)據(jù)1302被輸入至由工廠對(duì)象標(biāo)識(shí)符1308所標(biāo)識(shí)的工廠對(duì)象以恢復(fù)持續(xù)型對(duì)象pob——這通過(guò)調(diào)用por.getobejct()來(lái)實(shí)現(xiàn)的。在該示例中,所討論的服務(wù)對(duì)象是poba,并且重新創(chuàng)建的poba是在存儲(chǔ)器中在addrd至addrd+4處實(shí)現(xiàn)的。變量x的值從經(jīng)序列化的狀態(tài)數(shù)據(jù)被加載到addrd+4中;因?yàn)閜oba引用porb(參見(jiàn)上文),所以存儲(chǔ)器位置被預(yù)留以保存指向porb的指針——但是在該階段porb還未被重新創(chuàng)建,所以addrd最開(kāi)始時(shí)是空的。映射m1’也在存儲(chǔ)器414中被創(chuàng)建,其將<poba的id>映射至標(biāo)識(shí)poba在存儲(chǔ)器414中在哪里被實(shí)現(xiàn)的存儲(chǔ)器指針,在該示例中即指向addrd的指針。在步驟s1410處,是取決于剛剛被重新創(chuàng)建的持續(xù)型對(duì)象是否引用任何其他持續(xù)型對(duì)象的子例程分支:如果否,則子例程結(jié)束。如果是,則重復(fù)子例程s1404-s1410,但是這一次是針對(duì)所引用的服務(wù)對(duì)象,即由剛剛被重新創(chuàng)建的持續(xù)型對(duì)象間接地引用的(那些)對(duì)象。圖14的右手側(cè)作為示例示出了porb和pobb(由poba所引用的)如何被重新創(chuàng)建。一個(gè)porb已經(jīng)在addrh至addrh+4處被重新創(chuàng)建,在存儲(chǔ)器414中的addrh處生成了指針p1’以完成對(duì)poba的重新構(gòu)造。為了重復(fù)該子例程,僅僅當(dāng)實(shí)際上需要與引用對(duì)象por相對(duì)應(yīng)的服務(wù)對(duì)象來(lái)實(shí)現(xiàn)服務(wù)功能時(shí)才調(diào)用por.getobject()。例如,在pobb實(shí)現(xiàn)服務(wù)功能fb()的情況下,poba可以調(diào)用porb.getobject().fb(),這使得pobb被重新激活并且接著使得fb()在被重新激活的pobb上被調(diào)用。接著,再次執(zhí)行子例程以用相同的方式來(lái)重新構(gòu)造porc和pobc。2.2恢復(fù)并提取對(duì)象:如將顯而易見(jiàn)的,針對(duì)非循環(huán)對(duì)象圖表,過(guò)程將最終以不引用任何其他服務(wù)對(duì)象的服務(wù)對(duì)象終止。針對(duì)循環(huán)對(duì)象圖表,提供了額外的機(jī)制。循環(huán)的對(duì)象圖表是具有閉環(huán)的引用的圖表——圖12a的對(duì)象圖表是循環(huán)對(duì)象圖表的一個(gè)示例??紤]以下的場(chǎng)景:存在兩個(gè)持續(xù)型對(duì)象a和b。a引用b,并且b引用a。如果a恢復(fù)b,并且在恢復(fù)期間b嘗試恢復(fù)a,則這將引起死循環(huán),該死循環(huán)將最終導(dǎo)致堆棧溢出和崩潰。為了照顧好該場(chǎng)景,在服務(wù)對(duì)象恢復(fù)之后,服務(wù)對(duì)象的標(biāo)識(shí)符與指向存儲(chǔ)器414中的在其處實(shí)現(xiàn)該服務(wù)對(duì)象的單元處的存儲(chǔ)器指針之間的映射(例如,圖12b中的m1、m2、m3)在本地激活高速緩存中被創(chuàng)建。未來(lái)對(duì)恢復(fù)該對(duì)象的嘗試(通過(guò)在對(duì)應(yīng)的引用對(duì)象上調(diào)用getobject())僅僅引起高速緩存的值被返回,因此打破了循環(huán)鏈。當(dāng)在實(shí)例上“恢復(fù)”持續(xù)型對(duì)象時(shí),算法(persistedobjectfactory遵循的)是:1.從外部存儲(chǔ)提取持久型狀態(tài):state(狀態(tài))=persistedobjectstore.getstate(objectid)2.在本地存儲(chǔ)器中創(chuàng)建對(duì)象:x=新的persistedobejct()3.利用從外部存儲(chǔ)所取回的狀態(tài)來(lái)初始化所創(chuàng)建的對(duì)象,x.initialize(state)4.將所創(chuàng)建的實(shí)例放入本地激活高速緩存,其是從對(duì)象id到對(duì)在本地恢復(fù)的對(duì)象的引用的字典(dictionary)。此時(shí),x是駐留在本地存儲(chǔ)器中的被完全恢復(fù)的(被重新組合)的persistedobject對(duì)象(即,服務(wù)對(duì)象)。因此,實(shí)例x是對(duì)存儲(chǔ)器中的實(shí)際的對(duì)象的引用。因此,當(dāng)某一其他對(duì)象(y)具有對(duì)x的persistedobjectreference并且想要調(diào)用其上的方法時(shí),以下情況將發(fā)生:1.y將調(diào)用persistedobjectreference(x).getobject()——這將最終去往persistedobjectfactory()。createobejct(),其將首先看本地激活高速緩存,并且如果針對(duì)objectid的條目已經(jīng)存在,則將返回對(duì)已經(jīng)創(chuàng)建的對(duì)象的引用。如果條目不存在,則其將遵循以上的算法以對(duì)其創(chuàng)建并且將其放入本地激活高速緩存2.現(xiàn)在y具有對(duì)x的本地實(shí)例化的引用,并且可以調(diào)用x上的任何方法以將其視為任何其他對(duì)象即,返回高速緩存的對(duì)象,并且沒(méi)有創(chuàng)建高速緩存的對(duì)象的另一版本。使用該機(jī)制確保了所有persistedobjectreference(x)對(duì)象引用persistedobject(x)的相同實(shí)例。該屬性確保了persistedobject圖表的行為與具有在圖11a中所示出的類(lèi)型的圖表完全相同,其中對(duì)象直接引用彼此的存儲(chǔ)器單元(并且因此“自動(dòng)地”指對(duì)象的相同實(shí)例)。3.確保單個(gè)恢復(fù):下文提供了一種機(jī)制以確保如果針對(duì)相同通話的多個(gè)事務(wù)同時(shí)發(fā)生,則它們?nèi)加上嗤膶?shí)例來(lái)處理以確保通話狀態(tài)的一致性。由于不同的通話中請(qǐng)求可以去往通話控制器的不同實(shí)例,所以這可能引起針對(duì)通話的對(duì)象圖表同時(shí)在多個(gè)通話控制器實(shí)例上被恢復(fù)的情況。當(dāng)相同對(duì)象的不同恢復(fù)試圖將它們的(不同的)狀態(tài)寫(xiě)入到外部存儲(chǔ)中時(shí),這可能引起數(shù)據(jù)的不一致。盡管有可能使用樂(lè)觀并發(fā)性的詳盡方案,但是重新嘗試和回退以調(diào)解數(shù)據(jù)并達(dá)到一致的值是復(fù)雜的和不可預(yù)測(cè)的。針對(duì)該原因,通話控制器部署以一種不同的、更加可預(yù)測(cè)的方式確保了數(shù)據(jù)的一致性。該機(jī)制確保存在對(duì)象圖表的單個(gè)恢復(fù),以使得相同的對(duì)象圖表獲得處理并發(fā)請(qǐng)求的機(jī)會(huì)。利用該方式,對(duì)象可以使用傳統(tǒng)的同步技術(shù)——例如鎖、監(jiān)視器、和信號(hào)裝置——以容易地確保數(shù)據(jù)一致性。所公開(kāi)的一種用于在通信網(wǎng)絡(luò)的端點(diǎn)之間實(shí)現(xiàn)通信事件的通信系統(tǒng)。所述系統(tǒng)包括:數(shù)據(jù)庫(kù);用于接收消息的輸入端;被配置為保存代碼的計(jì)算機(jī)存儲(chǔ);以及一個(gè)或多個(gè)處理器。所述代碼被配置為實(shí)現(xiàn)用于管理所建立的通信事件的控制器。所述處理器被配置為運(yùn)行控制器的多個(gè)實(shí)例。針對(duì)控制器的每個(gè)實(shí)例,響應(yīng)于所述實(shí)例接收請(qǐng)求與所建立的通信事件相關(guān)的動(dòng)作的消息,所述實(shí)例訪問(wèn)數(shù)據(jù)庫(kù)以確定其是否包含有效的擁有權(quán)條目,所述有效的擁有權(quán)條目將控制器的另一實(shí)例標(biāo)識(shí)為當(dāng)前擁有該通信事件。如果這樣,則該實(shí)例將該消息轉(zhuǎn)發(fā)至其他實(shí)例;如果否,則該實(shí)例在數(shù)據(jù)庫(kù)中創(chuàng)建將該實(shí)例標(biāo)識(shí)為當(dāng)前擁有該通信事件的有效的擁有者條目,并且執(zhí)行所請(qǐng)求的動(dòng)作,其包括修改在計(jì)算機(jī)存儲(chǔ)中所保存的通信事件的狀態(tài)。在下文中,fdqn意指完全合格域名。“<通話控制器fqdn>”意指通話控制器聚類(lèi)的域名。該聚類(lèi)內(nèi)的個(gè)體的實(shí)例具有不同的ip地址并且由相關(guān)聯(lián)的實(shí)例id來(lái)區(qū)分。這可以通過(guò)使用以下方案來(lái)實(shí)現(xiàn):1.每個(gè)通話與唯一的上下文相關(guān)聯(lián),其具有將其與任何其他上下文區(qū)分開(kāi)的唯一的id(上下文標(biāo)識(shí)符)<上下文id>;此外,該部署的通話控制聚類(lèi)中的每個(gè)通話控制器實(shí)例具有將其與該聚類(lèi)中任何其他實(shí)例區(qū)分開(kāi)的唯一的實(shí)例id。2.指向通話控制器的每個(gè)回?fù)躸rl在url中具有該上下文id,其具有以下形式:https://<通話控制器fqdn>/<上下文id>/<persistedobjectfactoryid>/persistedobject>。3.當(dāng)在通話控制器實(shí)例上調(diào)用任何動(dòng)作時(shí),其執(zhí)行以下算法(“proxyortakeover”):a.針對(duì)通話創(chuàng)建請(qǐng)求,在外部存儲(chǔ)中的數(shù)據(jù)庫(kù)(1502,圖15)中創(chuàng)建以下條目:<contextid,processinginstanceid>,其最初是有效的?!疤幚韺?shí)例id”是創(chuàng)建該條目的實(shí)例的實(shí)例id。因此,該條目將該實(shí)例標(biāo)識(shí)為當(dāng)前擁有該通話,只要該條目保持有效。在一段時(shí)間之后該條目過(guò)期(變得無(wú)效)。針對(duì)該條目的過(guò)期時(shí)間是其完成任何單個(gè)事務(wù)(例如,建立通話)所花費(fèi)的最大時(shí)間。i.應(yīng)當(dāng)注意的是,該條目與對(duì)象圖表的狀態(tài)(只要該通話是活動(dòng)的,其就留存)不同;ii.針對(duì)通話控制器,最大時(shí)間是90秒(基于該協(xié)議);iii.在不活動(dòng)的時(shí)間間隔之后,擁有權(quán)條目到期(失效),其中在該時(shí)間間隔上不執(zhí)行針對(duì)該通話的通話控制操作,這是出于以下兩個(gè)原因:1.當(dāng)新請(qǐng)求著陸在任何實(shí)例上時(shí),該實(shí)例應(yīng)該僅能夠變成新的擁有者而不是必須總將該請(qǐng)求代理至原始的實(shí)例。這通過(guò)避免不需要的代理而提供了更優(yōu)化的處理,并且其還確保了更好的負(fù)載分配;2.擁有權(quán)條目保持有效越久,擁有者在通話活動(dòng)時(shí)發(fā)生故障的可能性越大,并且因此需要另一服務(wù)器來(lái)試驗(yàn)擁有者、檢測(cè)其故障、并且接著試圖接管;4.如果不發(fā)生什么的話,則可以通過(guò)允許擁有權(quán)到期來(lái)避免以上的兩個(gè)問(wèn)題。a.對(duì)于著陸在實(shí)例(1504,圖15)上的通話中請(qǐng)求,檢查其是否存在未過(guò)期的<contextid,processinginstanceid>b.如果不存在這樣的條目,則創(chuàng)建條目<contextid,currentinstanceid>(1506,圖15),并且開(kāi)始處理該請(qǐng)求;“currentinstanceid”是通話中請(qǐng)求已經(jīng)著陸在其上的實(shí)例的標(biāo)識(shí)符,因此將該實(shí)例標(biāo)識(shí)為當(dāng)前的擁有者,只要該條目保持有效;c.如果存在這樣的條目,并且處理實(shí)例的實(shí)例id的值與當(dāng)前實(shí)例的實(shí)例id相同,則擴(kuò)展條目的壽命,并且開(kāi)始處理該請(qǐng)求d.如果該條目的實(shí)例id與當(dāng)前實(shí)例的實(shí)例id不同,則檢查該處理實(shí)例是否活動(dòng)(使用下文呈現(xiàn)的算法),并且如果活動(dòng),則將該請(qǐng)求代理至該實(shí)例。該實(shí)例將再次執(zhí)行相同的算法e.如果處理實(shí)例死了,則更新用于將當(dāng)前實(shí)例標(biāo)記為新的處理實(shí)例的條目,并且開(kāi)始處理該請(qǐng)求i.多個(gè)同時(shí)的寫(xiě)入是使用樂(lè)觀并發(fā)性來(lái)處理的。因此,當(dāng)實(shí)例1和實(shí)例2嘗試同時(shí)變成擁有者時(shí),一個(gè)將勝利而另一個(gè)會(huì)了解它并代理至勝利者。當(dāng)針對(duì)通話的通話狀態(tài)被序列化時(shí),將其與該通話的上下文id相關(guān)聯(lián)地存儲(chǔ),以使得正確的通話狀態(tài)可以在之后被恢復(fù)。圖15是用于處理通話中請(qǐng)求消息的流程圖(例如,將新的參與者添加至所建立的通話、結(jié)束所建立的通話等)。在右側(cè)示出了該方法步驟的繪圖表示。在步驟s1502處,請(qǐng)求事務(wù)(其涉及一個(gè)或多個(gè)操作)的通話中請(qǐng)求消息(即,其與已經(jīng)建立的通話相關(guān))被發(fā)布至url。該url指向通話控制器聚類(lèi)522c,并且所述消息因此是由聚類(lèi)的負(fù)載平衡器548接收的,并且相應(yīng)地被轉(zhuǎn)發(fā)至通話控制器的實(shí)例——在該示例中,是434c2。該消息被發(fā)布至的url包含對(duì)所建立的通話唯一的“contextid”(參見(jiàn)上文)。作為響應(yīng),實(shí)例434c2訪問(wèn)數(shù)據(jù)庫(kù)1502以確定是否存在將該通話控制器的另一實(shí)例標(biāo)識(shí)為當(dāng)前擁有該通話的有效的擁有權(quán)條目(s1204)。這樣的條目將包含該擁有實(shí)例的實(shí)例標(biāo)識(shí)符(例如,圖15中的“id1”)。如果這樣,則實(shí)例434c2檢查(s1507)其他的實(shí)例是否仍然起作用(活動(dòng))——參見(jiàn)下文。如果活動(dòng),則實(shí)例432c將該消息轉(zhuǎn)發(fā)至在有效條目中所標(biāo)識(shí)的其他實(shí)例(例如,434c1)(s1506)。這被稱(chēng)為“代理操作”。如果不存在有效的擁有權(quán)條目或其他實(shí)例不活動(dòng),則該實(shí)例創(chuàng)建有效的擁有權(quán)條目,所創(chuàng)建的條目包括該實(shí)例的實(shí)例標(biāo)識(shí)符(“id2”)和上下文id,由此將其自身標(biāo)識(shí)為該通話的當(dāng)前擁有者(s1508)。這被稱(chēng)為“上下文接管操作”。接著,該實(shí)例繼續(xù)以執(zhí)行所請(qǐng)求的事務(wù),所述事務(wù)涉及從外部存儲(chǔ)606中的相關(guān)的經(jīng)序列化的狀態(tài)數(shù)據(jù)(其在存儲(chǔ)中由該通話的上下文id所標(biāo)識(shí))重新創(chuàng)建針對(duì)該通話的對(duì)象圖表(即,通話狀態(tài))、執(zhí)行實(shí)現(xiàn)該事務(wù)所需的動(dòng)作(其將固有地涉及修改所恢復(fù)的狀態(tài))、以及將經(jīng)修改的通話狀態(tài)的經(jīng)序列化的版本存儲(chǔ)回外部存儲(chǔ)606中。使用上下文的讀/寫(xiě)優(yōu)化:通過(guò)采用在上文中所定義的上下文的概念,可以?xún)?yōu)化對(duì)外部對(duì)象高速緩存的讀/寫(xiě)。這可以通過(guò)根據(jù)上下文來(lái)創(chuàng)建虛擬外部存儲(chǔ)來(lái)實(shí)現(xiàn),其累積所有的寫(xiě)&服務(wù)所有的讀,并且接著成批地將所有的寫(xiě)推出至“實(shí)際的”外部存儲(chǔ)——例如,通過(guò)對(duì)存儲(chǔ)器中的經(jīng)序列化的圖表拍快照。每個(gè)個(gè)體的persistedobject將繼續(xù)“認(rèn)為”它們正將它們數(shù)據(jù)寫(xiě)入外部存儲(chǔ),但是實(shí)際上,它們正寫(xiě)入本地存儲(chǔ)器;對(duì)于所有的讀同樣如此。針對(duì)通話控制器,虛擬存儲(chǔ)器基于通話的階段而將其數(shù)據(jù)寫(xiě)入實(shí)際的外部存儲(chǔ)。例如,針對(duì)1:1通話,當(dāng)該通話被建立時(shí)數(shù)據(jù)被轉(zhuǎn)儲(chǔ),而當(dāng)該通話結(jié)束時(shí)數(shù)據(jù)被刪除。并且通過(guò)確保單個(gè)對(duì)象圖表恢復(fù),所有的讀&寫(xiě)被保證是一致的。虛擬上下文存儲(chǔ)可以自身作為其中本地實(shí)例變成處理實(shí)例的上下文接管操作的一部分而被填充。這具有確保在成功接管了該上下文之后,沒(méi)有恢復(fù)將因?yàn)樽x取失敗而發(fā)生故障的優(yōu)點(diǎn),這確保了可預(yù)測(cè)性。實(shí)例可用性檢查:為了檢查實(shí)例是否活動(dòng)(出于代理或接管操作算法的目的),通話控制器遵循簡(jiǎn)單的技術(shù):1.每隔4秒每個(gè)實(shí)例將心跳消息寫(xiě)入具有10秒到期時(shí)間的外部存儲(chǔ)中的數(shù)據(jù)庫(kù)608(10秒=2*4+2秒的安全極限)。該到期時(shí)間給予了條目對(duì)瞬時(shí)故障的一些彈性——心跳需要連續(xù)故障兩次以供其他實(shí)例認(rèn)為特定的實(shí)例死亡。2.每隔4秒,每個(gè)實(shí)例還讀取由所有其他實(shí)例所寫(xiě)的條目。3.找到針對(duì)其的條目的實(shí)例被認(rèn)為是活動(dòng)的,而其他的實(shí)例則被認(rèn)為是死亡的4.以該方式,在特定的實(shí)例故障的14秒內(nèi)(在最壞的情況下),其他實(shí)例開(kāi)始知道該故障,并且對(duì)先前由現(xiàn)在死亡的實(shí)例所服務(wù)的通話進(jìn)行適當(dāng)?shù)摹敖庸堋?。使用通話處理的示例:為了有助于描繪,呈現(xiàn)了示例性和簡(jiǎn)化的情況,在該情況下,圖表在通話控制器實(shí)例處理通話時(shí)被創(chuàng)建,并且接著,一旦該通話已經(jīng)被建立,則在該通話自身期間,至少一部分圖表被重新創(chuàng)建。協(xié)作以傳遞通話控制服務(wù)的所有對(duì)象被創(chuàng)建為持續(xù)型對(duì)象,并且在它們的狀態(tài)中僅僅包含persistedobjectreference(除了其他本質(zhì)上可序列化的狀態(tài)之外)。當(dāng)它們需要對(duì)它們引用的任何對(duì)象進(jìn)行作用時(shí),它們僅僅調(diào)用persistedobjectreferece.getobject().<要調(diào)用的方法>。在下文中,對(duì)引用另一服務(wù)對(duì)象(對(duì)象2)的服務(wù)對(duì)象(對(duì)象1)的引用指的是使用對(duì)應(yīng)的引用對(duì)象(引用2)的間接引用。在對(duì)象2實(shí)現(xiàn)服務(wù)函數(shù)(f2())的情況下,對(duì)象2通過(guò)調(diào)用reference2.getobject().f2()在對(duì)象上調(diào)用f2()(reference2.getobject()返回對(duì)象2,f2()接著在對(duì)象2上被調(diào)用)。序列是:1.用戶a(alice)呼叫用戶b(bob)a.callinvitationrequest(通話邀請(qǐng)請(qǐng)求)包括由通話控制器使用以在其上發(fā)送通知的一組回?fù)躸rl2.通話控制器接收該請(qǐng)求,并且在將其解析之后,創(chuàng)建以下的服務(wù)對(duì)象:a.userafacingcallbackhandler——其具有從用戶a作為狀態(tài)接收的各種url。該對(duì)象暴露了以下方法i.accept(),其使用接受url來(lái)向呼叫者發(fā)送通話接受消息ii.reject(),其使用拒絕url來(lái)向呼叫者發(fā)送通話結(jié)束消息b.call0——其是商業(yè)邏輯層可以對(duì)其進(jìn)行作用的抽象。其特征在于:i.狀態(tài):1.通話內(nèi)容,例如呼叫者、被叫者、以及通話模態(tài)(音頻/視頻)2.對(duì)userafacingcallbackhandler的引用3.支路——對(duì)通過(guò)調(diào)用createfork方法所創(chuàng)建的call(通話)對(duì)象的引用的陣列(分支是在下文的點(diǎn)中的一個(gè)點(diǎn)中描述的,并且指的是將一個(gè)通話發(fā)送至多個(gè)端點(diǎn)的過(guò)程)ii.方法:1.accept——當(dāng)被叫者接受該通話時(shí)被調(diào)用2.reject——當(dāng)被叫者拒絕該通話時(shí)被調(diào)用3.cancel——當(dāng)呼叫者取消該通話時(shí)被調(diào)用4.createfork——由背對(duì)背(back-to-back)控制器(在下文中所描述的)使用來(lái)創(chuàng)建針對(duì)通話的支路iii.其工作的方式是——如果邏輯層呼叫call0.accept,則userafacingcallbackhandler的accepturl將被讀取,并且callacceptance消息將被發(fā)送至該url3.接著,通話控制器將該call0對(duì)象給予商業(yè)邏輯層4.商業(yè)邏輯包括被稱(chēng)為背對(duì)背路由控制器的對(duì)象的鏈;a.這些對(duì)象可以參與通話的路由;b.對(duì)call對(duì)象使用所述方法,它們可以影響整個(gè)消息流,并且暫時(shí)地或永久得保持在該消息流鏈中;c.背對(duì)背路由器的幾個(gè)示例是:i.計(jì)費(fèi)控制器——從通話開(kāi)始時(shí)其就保持在鏈中,并追蹤對(duì)該用戶的計(jì)費(fèi),并且如果用戶超時(shí),則可以切斷該通話;ii.許可實(shí)施控制器——該控制器確保用戶a僅僅可以執(zhí)行根據(jù)政策是允許的通話操作(例如,用戶b可能已經(jīng)屏蔽了用戶a);iii.端點(diǎn)路由控制器——該控制器定位被叫用戶(用戶b)的端點(diǎn),并將通話路由至合適的目的地;d.每個(gè)背對(duì)背路由器獲得call對(duì)象,并且創(chuàng)建一個(gè)或多個(gè)call對(duì)象(通過(guò)呼叫createfork)——所創(chuàng)建的call對(duì)象中的每一個(gè)表示原始通話的支路。例如,如果用戶b具有2個(gè)端點(diǎn),則端點(diǎn)路由控制器將創(chuàng)建2個(gè)call對(duì)象,其每一個(gè)將被適當(dāng)?shù)芈酚?至相應(yīng)的端點(diǎn))e.假定控制器鏈?zhǔn)牵涸S可實(shí)施-﹥計(jì)費(fèi)-﹥端點(diǎn)路由;5.許可實(shí)施控制器獲得call0對(duì)象,并且創(chuàng)建另一call對(duì)象——forkedcall1,其具有以下特征a.狀態(tài):i.對(duì)父call對(duì)象的引用——其工作方式是:如果forkedcall1.accept獲得通話,則call0.accept將被調(diào)用。ii.支路——如果任何一個(gè)被創(chuàng)建b.方法:i.與call對(duì)象相同c.應(yīng)當(dāng)注意的是,作為許可施加控制器在原始call對(duì)象上調(diào)用createfork()的結(jié)果,父對(duì)象的支路陣列將被附加有forkedcall1-﹥call0.forks={forkedcall1}6.計(jì)費(fèi)控制器接著獲得forkedcall1并且創(chuàng)建forkedcall2a.forkedcall2引用了父forkedcall1,并且具有與forkedcall對(duì)象相同的類(lèi)型b.forkedcall1.forks={forkedcall2}7.端點(diǎn)路由控制器獲得forkedcall2并且創(chuàng)建forkedcall31和forkedcall32a.這兩個(gè)支路都具有與通話相同的類(lèi)型并且包含對(duì)父對(duì)象forkedcall2的引用b.forkedcall2.forks={forkedcall31,forkedcall32}8.通話控制器現(xiàn)在生成兩個(gè)通話通知請(qǐng)求——針對(duì)forkedcall31和forkedcall32各一個(gè)a.通話通知請(qǐng)求中的每個(gè)通話通知請(qǐng)求包含指向合適的通話對(duì)象的附接urlb.callnotification(forkedcall31).attachurl=https://<callcontrollerprocessinginstance>/<idrepresentingforkedcall31>/attachc.對(duì)forkedcall32類(lèi)似9.當(dāng)用戶b的端點(diǎn)中的任何一個(gè)端點(diǎn)附接(通過(guò)向在callnotification中所接收的附接url發(fā)送附接請(qǐng)求),forkedcall31/32的通話狀態(tài)將被附加有作為attachrequest(附接請(qǐng)求)的一部分接收的endurl(結(jié)束url)。10.作為attachresponse(附接響應(yīng))的一部分,端點(diǎn)將獲得與它們的forkedcall(支路通話)相對(duì)應(yīng)的鏈接。例如,針對(duì)forkedcall31的accepturl(接受url)將看起來(lái)象a.https://<callcontrollerprocessinginstance>/<idrepresentingforkedcall31>/accept11.假定forkedcall31被接受(通過(guò)向與forkedcall31相對(duì)應(yīng)的接受url發(fā)送callacceptance消息):a.該接受消息包含針對(duì)通話中鏈接的回?fù)躸rl(例如,媒體重新協(xié)商、傳輸?shù)?;b.在接收到callacceptance消息之后,通話控制器將創(chuàng)建對(duì)象userbfacingacceptedcallcallbackhandler(用戶b面對(duì)經(jīng)接受的通話回?fù)芫浔?,其具有作為其狀態(tài)的用戶b的端點(diǎn)供應(yīng)的url。該對(duì)象暴露了以下方法:i.renegotiatemedia()——其使用媒體重新協(xié)商url來(lái)將ediarengotiation(媒體重新協(xié)商)消息發(fā)送回用戶bii.transfer(),其使用傳輸url來(lái)將傳輸消息發(fā)送回用戶b;12.forkedcall31.accept()產(chǎn)生了userbfacingacceptedcall(用戶b面對(duì)經(jīng)接受的通話),其具有以下特性:a.狀態(tài):i.對(duì)userbfacingacceptedcallcallbackhandler的引用;ii.對(duì)在forkedcall2.accept()被調(diào)用時(shí)作為forkedcall31.accept()的一部分所產(chǎn)生的accetptedcall2對(duì)象的引用;b.方法:i.handlemediarenegotiation()——其調(diào)用回?fù)芫浔膔enegotiatemedia();ii.handletransfer()——其調(diào)用回?fù)芫浔膖ransfer();iii.renegotiatemedia()——其調(diào)用acceptedcall2.renegotiatemedia()。這是當(dāng)用戶b通過(guò)發(fā)送目標(biāo)是userbfacingacceptedcall對(duì)象的媒體重新協(xié)商消息而開(kāi)始媒體重新協(xié)商時(shí)所調(diào)用的方法;iv.transfer()——其調(diào)用acceptedcall2.transfer()。這是當(dāng)用戶b通過(guò)發(fā)送目標(biāo)是userbfacingacceptedcall對(duì)象的傳輸消息而開(kāi)始傳輸時(shí)所調(diào)用的方法;13.如在上文中所提及的,forkedcall31.accept()也調(diào)用forkedcall2.accept(),其創(chuàng)建了具有以下特性的acceptedcall2:a.狀態(tài):i.對(duì)userbfacingacceptedcall的引用;ii.對(duì)當(dāng)forkedcall1.accept()被調(diào)用時(shí)作為forkedcall1.accept()的一部分所產(chǎn)生的acceptedcall1對(duì)象的引用;b.方法:i.與userbfacingacceptedcall相同;14.類(lèi)似地,forkedcall2.accept()也調(diào)用forkedcall1.accept(),其創(chuàng)建具有以下特性的acceptedcall1:a.狀態(tài):i.對(duì)acceptedcall2的引用;ii.對(duì)當(dāng)call0.accept()被調(diào)用時(shí)作為call0.accept()的一部分所產(chǎn)生的userafacingacceptedcall對(duì)象的引用;b.方法:i.與其他的acceptedcall對(duì)象相同。15.forkedcall1.accept()還調(diào)用call0.accept(),其創(chuàng)建具有以下特性的userafacingacceptedcall:a.狀態(tài):i.對(duì)accetpedcall1的引用;ii.對(duì)當(dāng)用戶a利用其通話中回?fù)躸rl來(lái)發(fā)送callacceptanceackowlegement時(shí)所創(chuàng)建的userafacingacceptedcallcallbackhandler的引用;b.方法:i.與其他acceptedcall對(duì)象相同。16.call0.accept()還調(diào)用在接受url上發(fā)送callacceptance消息的userafacingcallbackhandler.accept()17.在接收callacceptance之后,用戶a的端點(diǎn)發(fā)送具有通話中回?fù)躸rl的callacceptanceackowlegement消息。18.通話控制器創(chuàng)建具有作為狀態(tài)的這些回?fù)躸rl以及具有以下方法的userafacingacceptedcallcallbackhandler:a.renegotiatemedia(),其使用媒體重新協(xié)商url來(lái)將mediarengotiation消息發(fā)送回用戶a;b.transfer(),其使用傳輸url來(lái)將傳輸消息發(fā)送回用戶a。在圖16中示出了針對(duì)活動(dòng)通話而被生成的運(yùn)行時(shí)圖表1600。運(yùn)行時(shí)圖表1600是針對(duì)這樣的通話的活動(dòng)通話狀態(tài),所述通話在其在處理器能夠直接訪問(wèn)的存儲(chǔ)器中實(shí)現(xiàn)的意義上是活動(dòng)的。用戶a執(zhí)行的任何通話中操作引起在userafacingacceptedcall上調(diào)用合適的方法。例如,由用戶a觸發(fā)的媒體重新協(xié)商將引起以下順序的對(duì)象調(diào)用:userafacingacceptedcall.renegotiatemedia()-﹥acceptedcall1.handlemediarenegotiation()-﹥acceptedcall2.handlemediarenegotiation()-﹥userbfacingacceptedcall.handlemediarenegotiation()-﹥userbfacingacceptedcallcallbackhandler.renegotiatemedia()-﹥?cè)谟捎脩鬮所發(fā)送的mediarenegotiation回?fù)躸rl上發(fā)送媒體重新協(xié)商消息。類(lèi)似地,用戶b執(zhí)行的任何通話中操作引起了在userbfacingacceptedcall上調(diào)用合適的方法。例如,由用戶b觸發(fā)的媒體重新協(xié)商將引起以下操作:userbfacingacceptedcall.renegotiatemedia()-﹥acceptedcall2.handlemediarenegotiation()-﹥acceptedcall1.handlemediarenegotiation()-﹥userafacingacceptedcall.handlemediarengotiation()-﹥userfacingacceptedcallcallbackhandle.renegotiatemedia()-﹥?cè)谟捎脩鬭所發(fā)送的mediarenegotiation回?fù)躸rl上發(fā)送媒體重新協(xié)商消息。為了確保任何通話中操作可以在任何實(shí)例上執(zhí)行,我們需要確保整個(gè)運(yùn)行時(shí)狀態(tài)圖表可以在任何實(shí)例上被恢復(fù)。這意味著,針對(duì)接受通話的對(duì)象圖表應(yīng)該以在上文中所描述的方式被序列化并且被存儲(chǔ)到到高度可用的外部存儲(chǔ)中。一旦轉(zhuǎn)換到合適的形式,則可以通過(guò)跟隨從任何對(duì)象開(kāi)始的引用鏈來(lái)恢復(fù)圖表的合適的部分(在上文的示例中,我們可以從userfacingacceptedcall開(kāi)始、或者從userbfacingacceptedcall開(kāi)始)。通常而言,在本文中所描述的功能中的任何一個(gè)可以使用軟件、固件、硬件(例如,固定邏輯電路)、或這些實(shí)現(xiàn)的組合來(lái)實(shí)現(xiàn)。如在本文中所使用的術(shù)語(yǔ)“模塊”、“功能”、“組件”、和“邏輯”通常表示軟件、固件、硬件、或其組合。在軟件實(shí)現(xiàn)的情況下,模塊、功能、或邏輯表示當(dāng)在處理器(例如,cpu或多個(gè)cpu)上被執(zhí)行時(shí),執(zhí)行指定任務(wù)的程序代碼。程序代碼可以存儲(chǔ)在一個(gè)或多個(gè)計(jì)算機(jī)可讀存儲(chǔ)器設(shè)備中。在下文中所描述的技術(shù)的特征是與平臺(tái)無(wú)關(guān)的,這意味著所述技術(shù)可以在具有多種處理器的多種商業(yè)計(jì)算平臺(tái)上實(shí)現(xiàn)。例如,用戶設(shè)備(用戶終端)還可以包括使得用戶終端的硬件執(zhí)行操作的實(shí)體(例如,軟件),例如處理器功能塊等。例如,用戶終端可以包括可以被配置為保存使得用戶終端并且更加特別地使得操作系統(tǒng)和用戶終端的相關(guān)聯(lián)的硬件執(zhí)行操作的計(jì)算機(jī)可讀介質(zhì)。因此,上述指令用于配置操作系統(tǒng)和相關(guān)聯(lián)的硬件執(zhí)行操作,并且以該方式引起操作系統(tǒng)和相關(guān)聯(lián)的硬件轉(zhuǎn)換以執(zhí)行功能。所述指令可以是由計(jì)算機(jī)可讀介質(zhì)通過(guò)各種不同的配置而向用戶終端提供的。計(jì)算機(jī)可讀介質(zhì)的一個(gè)這樣的配置是信號(hào)承載介質(zhì),并且因此被配置為例如經(jīng)由網(wǎng)絡(luò)向計(jì)算設(shè)備發(fā)送指令(例如,作為載波)。計(jì)算機(jī)可讀介質(zhì)還可以被配置為計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)并且因此不是信號(hào)承載介質(zhì)。計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)的示例包括隨機(jī)存取存儲(chǔ)器(ram)、只讀存儲(chǔ)器(rom)、光盤(pán)、閃速存儲(chǔ)器、硬盤(pán)存儲(chǔ)器、以及可以使用磁的、光學(xué)的、以及其他技術(shù)來(lái)存儲(chǔ)指令和其他數(shù)據(jù)的其他存儲(chǔ)器設(shè)備。根據(jù)第一方面,一種用于經(jīng)由通信網(wǎng)絡(luò)在客戶端設(shè)備的用戶和另一客戶端設(shè)備的另一用戶之間建立實(shí)時(shí)通信事件的方法。所述方法包括在所述客戶端設(shè)備上運(yùn)行的客戶端執(zhí)行以下操作:通過(guò)經(jīng)由所述網(wǎng)絡(luò)向所述另一客戶端設(shè)備或向連接至所述網(wǎng)絡(luò)的服務(wù)器發(fā)送消息來(lái)執(zhí)行通信事件建立過(guò)程的第一階段。所述消息包括與還未執(zhí)行的所述通信事件建立過(guò)程的第二階段相關(guān)的多個(gè)選項(xiàng)。所述消息針對(duì)所述多個(gè)選項(xiàng)中的每個(gè)選項(xiàng)而包括對(duì)所述選項(xiàng)唯一的不同的網(wǎng)絡(luò)地址,所述不同的網(wǎng)絡(luò)地址能夠被訪問(wèn)以選擇所述選項(xiàng)。所述方法還包括:檢測(cè)到已經(jīng)訪問(wèn)了對(duì)所述多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的上所述網(wǎng)絡(luò)地址;并且作為響應(yīng),根據(jù)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)而發(fā)起所述通信事件建立過(guò)程的所述第二階段。在第一實(shí)施例中,所述消息被發(fā)送至所述服務(wù)器,所述方法包括所述服務(wù)器執(zhí)行以下操作:存儲(chǔ)對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址與服務(wù)器網(wǎng)絡(luò)地址之間的映射;將所述服務(wù)器網(wǎng)絡(luò)地址發(fā)送至所述另一客戶端設(shè)備或者發(fā)送至連接至所述網(wǎng)絡(luò)的另外的服務(wù)器;檢測(cè)到已經(jīng)訪問(wèn)了所述服務(wù)器網(wǎng)絡(luò)地址;并且作為響應(yīng),訪問(wèn)對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址,其中所述訪問(wèn)是由所述客戶端檢測(cè)到的以便觸發(fā)第一方面的發(fā)起步驟。在第二實(shí)施例中,所述方法還包括所述另外的服務(wù)器執(zhí)行以下操作:存儲(chǔ)所述服務(wù)器網(wǎng)絡(luò)地址與另外的服務(wù)器網(wǎng)絡(luò)地址之間的另一映射;將所述另外的服務(wù)器網(wǎng)絡(luò)地址發(fā)送至所述另一客戶端設(shè)備或者發(fā)送至又一服務(wù)器;檢測(cè)到已經(jīng)訪問(wèn)了所述另外的服務(wù)器網(wǎng)絡(luò)地址;并且作為響應(yīng),訪問(wèn)所述服務(wù)器網(wǎng)絡(luò)地址,其中所述訪問(wèn)是由所述服務(wù)器所檢測(cè)到的以便觸發(fā)第一實(shí)施例的訪問(wèn)步驟。在第三實(shí)施例中,所述消息被發(fā)送至所述向服務(wù)器,并且所述方法包括:針對(duì)每個(gè)網(wǎng)絡(luò)地址,所述服務(wù)器存儲(chǔ)所述網(wǎng)絡(luò)地址與對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址之間的映射、修改所述消息以用所述對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址來(lái)替代所述網(wǎng)絡(luò)地址、并且將經(jīng)修改的消息發(fā)送至所述另一客戶端設(shè)備或者發(fā)送至連接至所述網(wǎng)絡(luò)的另外的服務(wù)器;所述服務(wù)器檢測(cè)到已經(jīng)訪問(wèn)了與對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址相對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址;以及作為響應(yīng),所述服務(wù)器訪問(wèn)對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址,其中所述訪問(wèn)是由所述客戶端檢測(cè)到的以便觸發(fā)第一方面的所述發(fā)起步驟。在第四實(shí)施例中,對(duì)應(yīng)的網(wǎng)絡(luò)地址被發(fā)送至所述另外的服務(wù)器,并且所述方法包括:所述另外的服務(wù)器存儲(chǔ)所述對(duì)應(yīng)的網(wǎng)絡(luò)地址與另外的對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址之間的另一映射、進(jìn)一步修改所述消息以用另外的對(duì)應(yīng)的網(wǎng)絡(luò)地址來(lái)替代所述對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址、并且將經(jīng)進(jìn)一步修改的消息發(fā)送至所述另一客戶端設(shè)備或者發(fā)送至連接至所述網(wǎng)絡(luò)的又一服務(wù)器;所述另外的服務(wù)器檢測(cè)到已經(jīng)訪問(wèn)了與所述服務(wù)器網(wǎng)絡(luò)地址相對(duì)應(yīng)的所述另外的服務(wù)器網(wǎng)絡(luò)地址,其中,所述服務(wù)器網(wǎng)絡(luò)地址與對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址相對(duì)應(yīng);以及作為響應(yīng),所述另外的服務(wù)器訪問(wèn)與對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址相對(duì)應(yīng)的所述服務(wù)器網(wǎng)絡(luò)地址,其中所述訪問(wèn)是由所述服務(wù)器所檢測(cè)到的以便觸發(fā)第三實(shí)施例的所述訪問(wèn)步驟??梢栽诳蛻舳嗽O(shè)備和代理服務(wù)器之間建立連接,網(wǎng)絡(luò)地址是代理服務(wù)器的;第一方面的檢測(cè)步驟可以包括所述客戶端檢測(cè)到經(jīng)由所述連接所接收的信號(hào),所述信號(hào)指示已經(jīng)訪問(wèn)了對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址。所述連接可以是websocket連接。網(wǎng)絡(luò)地址可以是uri,例如url。對(duì)所述多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的網(wǎng)絡(luò)地址可以根據(jù)http協(xié)議來(lái)訪問(wèn),例如使用post或delete請(qǐng)求方法。根據(jù)第二方面,一種用于經(jīng)由通信網(wǎng)絡(luò)而在客戶端設(shè)備的用戶與另一客戶端設(shè)備的另一用戶之間實(shí)現(xiàn)實(shí)時(shí)通信事件的服務(wù)器。所述服務(wù)器包括:計(jì)算機(jī)存儲(chǔ);網(wǎng)絡(luò)接口,其被配置為從所述網(wǎng)絡(luò)接收消息;處理器,其被配置為:接收消息,所述消息包括與通信事件有關(guān)的多個(gè)選項(xiàng),并且針對(duì)所述多個(gè)選項(xiàng)中的每個(gè)選項(xiàng)而包括對(duì)所述選項(xiàng)唯一的不同的網(wǎng)絡(luò)地址,所述不同的網(wǎng)絡(luò)地址能夠被訪問(wèn)以選擇所述選項(xiàng);針對(duì)多個(gè)網(wǎng)絡(luò)地址中的每個(gè)網(wǎng)絡(luò)地址,將所述網(wǎng)絡(luò)地址與對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址之間的映射存儲(chǔ)在所述計(jì)算機(jī)存儲(chǔ)中;將所述服務(wù)器網(wǎng)絡(luò)地址發(fā)送至所述另一客戶端設(shè)備或者發(fā)送至連接至所述網(wǎng)絡(luò)的另外的服務(wù)器;以及檢測(cè)到與對(duì)所述多個(gè)選項(xiàng)中的所述一個(gè)選項(xiàng)唯一的所述網(wǎng)絡(luò)地址相對(duì)應(yīng)的所述服務(wù)器網(wǎng)絡(luò)地址已經(jīng)被訪問(wèn),并且作為響應(yīng)來(lái)訪問(wèn)對(duì)所述選項(xiàng)唯一的所述網(wǎng)絡(luò)地址以選擇所述選項(xiàng)。所述處理器可以被配置為將所述消息記錄在計(jì)算機(jī)存儲(chǔ)中。所述處理器可以被配置為將一段時(shí)間的通信事件記錄在計(jì)算機(jī)存儲(chǔ)中。所述消息可以被發(fā)送至另外的服務(wù)器,以便使得所述另外的服務(wù)器作為響應(yīng)而執(zhí)行與所述通信事件相關(guān)的動(dòng)作。所述處理器可以被配置為:接收與所述通信事件相關(guān)的另一消息,所述消息包括另一選項(xiàng),該選項(xiàng)與所述通信事件的另一選項(xiàng)和可以訪問(wèn)以選擇另一選項(xiàng)的、對(duì)該選項(xiàng)唯一的另一網(wǎng)絡(luò)地址相關(guān);將在所述另一網(wǎng)絡(luò)地址和另一對(duì)應(yīng)的服務(wù)器網(wǎng)絡(luò)地址之間的另一映射存儲(chǔ)在計(jì)算機(jī)存儲(chǔ)中;并且向與所述另外的服務(wù)器不同的所述網(wǎng)絡(luò)的另一服務(wù)器發(fā)送所述另一對(duì)應(yīng)的網(wǎng)絡(luò)地址,以使得所述另一服務(wù)器執(zhí)行與所述通信事件相關(guān)的另一動(dòng)作。網(wǎng)絡(luò)地址和所述(另外)服務(wù)器網(wǎng)絡(luò)地址可以是uri,例如url。可以根據(jù)http協(xié)議來(lái)訪問(wèn)對(duì)所述多個(gè)選項(xiàng)中的一個(gè)選項(xiàng)唯一的網(wǎng)絡(luò)地址。根據(jù)第三方面,一種用于傳遞服務(wù)的方法,所述方法是由計(jì)算機(jī)系統(tǒng)實(shí)現(xiàn)的,所述計(jì)算機(jī)系統(tǒng)包括處理器、能夠由所述處理器訪問(wèn)的存儲(chǔ)器、以及計(jì)算機(jī)存儲(chǔ)。所述存儲(chǔ)器保存定義服務(wù)對(duì)象類(lèi)的代碼。服務(wù)對(duì)象類(lèi)被配置為提供服務(wù)功能。該方法包括以下步驟。接收至少一個(gè)服務(wù)發(fā)起消息。響應(yīng)于所述至少一個(gè)服務(wù)發(fā)起消息,所述服務(wù)對(duì)象類(lèi)被實(shí)例化以創(chuàng)建服務(wù)對(duì)象。所述服務(wù)對(duì)象實(shí)現(xiàn)所述服務(wù)功能以傳遞所述服務(wù)。每個(gè)服務(wù)對(duì)象具有保存在所述存儲(chǔ)器中的相關(guān)聯(lián)的狀態(tài)數(shù)據(jù),并且所述服務(wù)對(duì)象中的至少一些服務(wù)對(duì)象引用其他服務(wù)對(duì)象。針對(duì)每個(gè)服務(wù)對(duì)象,在存儲(chǔ)器中生成相關(guān)聯(lián)的服務(wù)對(duì)象標(biāo)識(shí)符,所述服務(wù)對(duì)象標(biāo)識(shí)符對(duì)所述服務(wù)對(duì)象與任何其他服務(wù)對(duì)象進(jìn)行區(qū)分。服務(wù)對(duì)象被序列化以生成經(jīng)序列化的數(shù)據(jù),所述經(jīng)序列化的數(shù)據(jù)包括對(duì)每個(gè)服務(wù)對(duì)象的表示,并且所述表示包括所述服務(wù)對(duì)象的服務(wù)對(duì)象標(biāo)識(shí)符,所述服務(wù)對(duì)象的相關(guān)聯(lián)的狀態(tài)數(shù)據(jù)、以及由所述服務(wù)對(duì)象所引用的任何其他服務(wù)對(duì)象的服務(wù)對(duì)象標(biāo)識(shí)符。所述經(jīng)序列化的數(shù)據(jù)被存儲(chǔ)在所述計(jì)算機(jī)存儲(chǔ)器中。當(dāng)所述服務(wù)對(duì)象已經(jīng)被去激活時(shí),接收到標(biāo)識(shí)服務(wù)對(duì)象被重新激活的服務(wù)重新激活消息,并且針對(duì)所標(biāo)識(shí)的服務(wù)對(duì)象而執(zhí)行重新激活過(guò)程。所述重新激活過(guò)程包括:從其以所述經(jīng)序列化的數(shù)據(jù)的表示重新激活所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象,并且如果所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象引用實(shí)現(xiàn)服務(wù)功能所需的至少一個(gè)服務(wù)對(duì)象,則針對(duì)所引用的至少一個(gè)服務(wù)對(duì)象而重復(fù)所述重新激活過(guò)程,由此創(chuàng)建服務(wù)對(duì)象的替代組以替代經(jīng)去激活的服務(wù)對(duì)象中的至少一些服務(wù)對(duì)象。在實(shí)施例中,所述方法可以用于在通信網(wǎng)絡(luò)的端點(diǎn)之間建立通信事件,并且用于管理所建立的通信事件;所述服務(wù)請(qǐng)求消息是通信事件建立請(qǐng)求,并且所述服務(wù)對(duì)象被創(chuàng)建以建立通信事件;所述服務(wù)重新激活消息請(qǐng)求與所述所建立的通信事件相關(guān)的動(dòng)作,并且服務(wù)對(duì)象的所述替代組實(shí)現(xiàn)所請(qǐng)求的動(dòng)作。所述動(dòng)作可以例如是:-終止所述通信事件;-向所述通信事件添加參與者/從所述通信事件移除參與者;-將所述通信事件的參與者靜音或取消靜音;-將所述通信事件暫停;-向所述通信事件添加媒體模態(tài)/從所述通信事件移除媒體模態(tài)。所述通信事件可以是通話。所述代碼可以定義針對(duì)每個(gè)服務(wù)對(duì)象類(lèi)的對(duì)應(yīng)的工廠對(duì)象類(lèi),每個(gè)工廠對(duì)象類(lèi)被配置為提供服務(wù)對(duì)象重新激活功能以用于從在所述經(jīng)序列化的數(shù)據(jù)中的所述表示來(lái)創(chuàng)建所述服務(wù)對(duì)象類(lèi)的服務(wù)對(duì)象,所述方法可以包括:針對(duì)每個(gè)服務(wù)對(duì)象類(lèi),將所述對(duì)應(yīng)的工廠對(duì)象類(lèi)實(shí)例化以生成對(duì)應(yīng)的工廠對(duì)象,所述對(duì)應(yīng)的工廠對(duì)象被配置為實(shí)現(xiàn)由所述工廠對(duì)象類(lèi)所提供的所述服務(wù)對(duì)象重新激活功能;針對(duì)每個(gè)工廠對(duì)象,在所述存儲(chǔ)器中生成相關(guān)聯(lián)的工廠對(duì)象標(biāo)識(shí)符,所述工廠對(duì)象標(biāo)識(shí)符將所述工廠對(duì)象與任何其他工廠對(duì)象進(jìn)行區(qū)分;對(duì)每個(gè)服務(wù)對(duì)象的所述表示還可以包括與所述服務(wù)對(duì)象的服務(wù)對(duì)象類(lèi)相對(duì)應(yīng)的所述工廠對(duì)象的所述工廠對(duì)象標(biāo)識(shí)符;所述服務(wù)重新激活消息標(biāo)識(shí)與所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象的服務(wù)對(duì)象類(lèi)相對(duì)應(yīng)的工廠對(duì)象,其中,針對(duì)所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象而執(zhí)行所述重新激活過(guò)程可以包括:經(jīng)標(biāo)識(shí)的對(duì)應(yīng)的工廠對(duì)象在所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象的所述經(jīng)序列化的數(shù)據(jù)中的表示上實(shí)現(xiàn)其服務(wù)對(duì)象重新激活功能以重新激活所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象。所述代碼可以定義被配置為提供獲取對(duì)象函數(shù)的引用對(duì)象類(lèi),并且所述方法包括:針對(duì)每個(gè)服務(wù)對(duì)象:將持續(xù)型對(duì)象引用類(lèi)實(shí)例化以生成對(duì)應(yīng)的引用對(duì)象,所述對(duì)應(yīng)的應(yīng)用對(duì)象具有保存在存儲(chǔ)器中的相關(guān)聯(lián)的狀態(tài)數(shù)據(jù),所述相關(guān)聯(lián)的狀態(tài)數(shù)據(jù)不包括指向所述存儲(chǔ)器中的任何單元的任何存儲(chǔ)器指針,但是包括所述服務(wù)對(duì)象的所述服務(wù)對(duì)象標(biāo)識(shí)符;針對(duì)所述至少一個(gè)服務(wù)對(duì)象的所述重新激活過(guò)程在所述引用對(duì)象已經(jīng)被去激活時(shí)被執(zhí)行,并且包括:使用在所述至少一個(gè)服務(wù)對(duì)象的表示中的所述服務(wù)對(duì)象標(biāo)識(shí)符來(lái)重新激活與所述至少一個(gè)服務(wù)對(duì)象相對(duì)應(yīng)的所述引用對(duì)象;當(dāng)在經(jīng)重新激活的引用對(duì)象上被調(diào)用時(shí),所述獲得對(duì)象函數(shù)被配置為從所述至少一個(gè)服務(wù)對(duì)象的所述表示重新激活所述至少一個(gè)服務(wù)對(duì)象,并且所述至少一個(gè)服務(wù)對(duì)象是通過(guò)在所述經(jīng)重新激活的以用對(duì)象上調(diào)用所述獲得對(duì)象函數(shù)而被重新激活的。獲得對(duì)象功能可以被配置為,當(dāng)在至少一個(gè)服務(wù)對(duì)象已經(jīng)被去激活之前在重新激活的引用對(duì)象上再次被調(diào)用時(shí),返回存儲(chǔ)器指針以重新激活的至少一個(gè)服務(wù)對(duì)象,由此僅僅創(chuàng)建單個(gè)替代服務(wù)來(lái)替代至少一個(gè)服務(wù)對(duì)象。針對(duì)所述服務(wù)對(duì)象中的至少一些服務(wù)對(duì)象中的每個(gè)服務(wù)對(duì)象,可以生成包括所述服務(wù)對(duì)象的相關(guān)聯(lián)的服務(wù)對(duì)象標(biāo)識(shí)符的相關(guān)聯(lián)的網(wǎng)絡(luò)地址,并且所述服務(wù)重新激活消息是在與將被重新激活的服務(wù)對(duì)象相關(guān)聯(lián)的網(wǎng)絡(luò)地址處接收的,所述服務(wù)對(duì)象將被重新激活是從所述網(wǎng)絡(luò)地址識(shí)別的。每個(gè)網(wǎng)絡(luò)地址可以是uri(例如,url),并且所述方法可以包括解析與要被重新激活的服務(wù)對(duì)象相關(guān)聯(lián)的uri,以識(shí)別所述服務(wù)要被重新激活。所述方法可以包括包括緩存指向每個(gè)經(jīng)重新激活的服務(wù)對(duì)象的相應(yīng)的存儲(chǔ)器指針,其中,如果所述重新激活過(guò)程是針對(duì)已經(jīng)被重新激活的服務(wù)對(duì)象并且是在所述已經(jīng)被重新激活的服務(wù)對(duì)象被重新激活之前被執(zhí)行的,則所述重新激活過(guò)程返回指向所述已經(jīng)被重新激活的服務(wù)對(duì)象的存儲(chǔ)器指針,由此,僅僅創(chuàng)建單個(gè)相應(yīng)的替代服務(wù)對(duì)象來(lái)替代每個(gè)經(jīng)重新激活的服務(wù)對(duì)象。所述服務(wù)發(fā)起消息是由所述代碼的實(shí)例接收的,其中,所述實(shí)例執(zhí)行接收、實(shí)例化、生成、序列化、和存儲(chǔ)的步驟;所述服務(wù)重新激活消息是由所述代碼的另一實(shí)例接收的,并且所述另一實(shí)例執(zhí)行所述重新激活過(guò)程。所述服務(wù)重新激活消息是由所述代碼的實(shí)例接收的,并且所述實(shí)例訪問(wèn)數(shù)據(jù)庫(kù)以確定其是否包含將所述代碼的另一實(shí)例標(biāo)識(shí)為當(dāng)前擁有所述經(jīng)序列化的數(shù)據(jù)的有效的擁有權(quán)條目,并且:如果包含,則所述實(shí)例將所述服務(wù)重新激活消息轉(zhuǎn)發(fā)至所述另一實(shí)例以使得所述另一實(shí)例執(zhí)行所述重新激活過(guò)程,而如果不包含,所述實(shí)例在所述數(shù)據(jù)庫(kù)中創(chuàng)建將所述實(shí)例標(biāo)識(shí)為當(dāng)前擁有所述經(jīng)序列化的狀態(tài)數(shù)據(jù)的有效的擁有權(quán)條目,并且所述實(shí)例執(zhí)行所述重新激活過(guò)程。當(dāng)從所述擁有權(quán)條目被創(chuàng)建開(kāi)始已經(jīng)過(guò)了預(yù)先確定的量的時(shí)間時(shí),每個(gè)擁有權(quán)條目變得無(wú)效。每個(gè)實(shí)例被配置為周期性地向所述數(shù)據(jù)庫(kù)寫(xiě)入有效的心跳消息,所述心跳消息將所述實(shí)例標(biāo)識(shí)為當(dāng)前是活動(dòng)的,當(dāng)從所述心跳消息被創(chuàng)建開(kāi)始已經(jīng)過(guò)了預(yù)先確定的量的時(shí)間時(shí),每個(gè)心跳消息變得無(wú)效,其中,每個(gè)擁有權(quán)條目只有在其標(biāo)識(shí)的實(shí)例也由有效的心跳消息標(biāo)識(shí)為是活動(dòng)的的情況下采是有效的,以使得所述服務(wù)重新激活消息只有在所述另一實(shí)例由有效的心跳消息標(biāo)識(shí)為是活動(dòng)的的情況下才被轉(zhuǎn)發(fā)至所述另一實(shí)例。所述經(jīng)序列化的數(shù)據(jù)是在所述存儲(chǔ)器中生成的,并且通過(guò)在所有服務(wù)對(duì)象已經(jīng)被序列化時(shí)執(zhí)行單個(gè)寫(xiě)操作而從所述存儲(chǔ)器寫(xiě)至所述計(jì)算機(jī)存儲(chǔ)。響應(yīng)于接收到所述重新激活消息,創(chuàng)建所述服務(wù)對(duì)象的替代組所需要的所有狀態(tài)數(shù)據(jù)通過(guò)執(zhí)行單個(gè)寫(xiě)操作而從所述計(jì)算機(jī)存儲(chǔ)被加載在所述存儲(chǔ)器中或者能夠由所述計(jì)算機(jī)系統(tǒng)的另一處理器訪問(wèn)的另一存儲(chǔ)器中,并且所述替代組是從加載在所述存儲(chǔ)器或所述另一存儲(chǔ)器中的所述經(jīng)序列化的數(shù)據(jù)而創(chuàng)建的。根據(jù)第四方面,計(jì)算機(jī)系統(tǒng)包括:被配置為接收消息的輸入端;計(jì)算機(jī)存儲(chǔ);處理器;能夠由所述處理器訪問(wèn)的存儲(chǔ)器。所述存儲(chǔ)器保存定義服務(wù)對(duì)象類(lèi)的代碼,所述服務(wù)對(duì)象類(lèi)被配置為提供服務(wù)功能。所述處理器被配置為響應(yīng)于至少一個(gè)服務(wù)發(fā)起消息而執(zhí)行以下操作:將所述服務(wù)對(duì)象類(lèi)實(shí)例化以創(chuàng)建服務(wù)對(duì)象,所述服務(wù)對(duì)象實(shí)現(xiàn)所述服務(wù)功能以傳遞所述服務(wù),每個(gè)服務(wù)對(duì)象具有保存在所述存儲(chǔ)器中的相關(guān)聯(lián)的狀態(tài)數(shù)據(jù),所述服務(wù)對(duì)象中的至少一些服務(wù)對(duì)象引用其他服務(wù)對(duì)象;針對(duì)每個(gè)服務(wù)對(duì)象,在存儲(chǔ)器中生成相關(guān)聯(lián)的服務(wù)對(duì)象標(biāo)識(shí)符,所述服務(wù)對(duì)象標(biāo)識(shí)符將所述服務(wù)對(duì)象與任何其他服務(wù)對(duì)象進(jìn)行區(qū)分;將服務(wù)對(duì)象序列化以生成經(jīng)序列化的數(shù)據(jù),所述經(jīng)序列化的數(shù)據(jù)包括對(duì)每個(gè)服務(wù)對(duì)象的表示,所述表示包括所述服務(wù)對(duì)象的服務(wù)對(duì)象標(biāo)識(shí)符、所述服務(wù)對(duì)象的相關(guān)聯(lián)的狀態(tài)數(shù)據(jù)、以及由所述服務(wù)對(duì)象所引用的任何其他服務(wù)對(duì)象的服務(wù)對(duì)象標(biāo)識(shí)符;以及將所述經(jīng)序列化的數(shù)據(jù)存儲(chǔ)在所述計(jì)算機(jī)存儲(chǔ)器中。當(dāng)所述服務(wù)對(duì)象已經(jīng)被去激活時(shí)并且響應(yīng)于標(biāo)識(shí)將被重新激活的服務(wù)對(duì)象的服務(wù)重新激活消息,所述計(jì)算機(jī)系統(tǒng)的所述處理器或另一處理器被配置為針對(duì)經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象而執(zhí)行重新激活過(guò)程,包括:從其在所述經(jīng)序列化的數(shù)據(jù)中的表示來(lái)重新激活所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象,并且如果所述經(jīng)標(biāo)識(shí)的服務(wù)對(duì)象引用實(shí)現(xiàn)服務(wù)功能所需的至少一個(gè)服務(wù)對(duì)象,則針對(duì)所引用的至少一個(gè)服務(wù)對(duì)象而重復(fù)所述重新激活過(guò)程由此創(chuàng)建服務(wù)對(duì)象的替代組以替代經(jīng)去激活的服務(wù)對(duì)象中的至少一些服務(wù)對(duì)象。所述計(jì)算機(jī)系統(tǒng)可以是云平臺(tái),由此所述處理器和所述另一處理器各自被配置為運(yùn)行多個(gè)虛擬機(jī),其中,所述代碼的實(shí)例在所述多個(gè)虛擬機(jī)中的每個(gè)虛擬機(jī)上運(yùn)行。所述代碼被配置為實(shí)現(xiàn)通話控制器以用于在通信網(wǎng)絡(luò)的端點(diǎn)之間建立通信事件并且用于管理所建立的通信事件,其中,所述服務(wù)請(qǐng)求消息是通信事件建立請(qǐng)求,而所述服務(wù)對(duì)象由所述通話控制器的實(shí)例創(chuàng)建以用于建立通信事件;例如:所述服務(wù)重新激活消息是由所述通話控制器的所述實(shí)例或另一實(shí)例接收的;或者所述代碼還被配置為實(shí)現(xiàn)媒體控制器以用于管理所述所建立的通信事件的媒體模態(tài),并且所述服務(wù)重新激活消息是由所述媒體控制器的實(shí)例接收的;在任何一種情況中,所述服務(wù)重新激活消息請(qǐng)求與所述所建立的通信事件相關(guān)的動(dòng)作,并且服務(wù)對(duì)象的所述替代組實(shí)現(xiàn)所請(qǐng)求的動(dòng)作。根據(jù)第五方面,計(jì)算機(jī)程序產(chǎn)品包括代碼,所述代碼被存儲(chǔ)在計(jì)算機(jī)可讀存儲(chǔ)介質(zhì)上,并且被配置為當(dāng)被執(zhí)行時(shí)實(shí)現(xiàn)在本文中所公開(kāi)的方法和系統(tǒng)中的任何方法和系統(tǒng),包括第一和第三方面的方法,第二方面的服務(wù)器的功能,以及第四方面的計(jì)算機(jī)系統(tǒng)。盡管已經(jīng)用于特定于結(jié)構(gòu)特征和/或方法動(dòng)作的語(yǔ)言描述了本主題,但是應(yīng)當(dāng)理解的是,在所附權(quán)利要求中所定義的主題并不一定限于在上文中所描述的具體的特征或動(dòng)作。相反,在上文中所描述的具體的特征和動(dòng)作是作為實(shí)現(xiàn)權(quán)利要求的示例性形式而公開(kāi)的。當(dāng)前第1頁(yè)12當(dāng)前第1頁(yè)12