國內(nèi)最大的酷站演示中心! 可靠的 xml web service eric schmidt microsoft corporation,xml core services 組,項(xiàng)目經(jīng)理 2001 年 12 月 11 日
下載此專欄的示例代碼。
注意:要下載與本文相關(guān)的代碼,您需要: visual studio .net release candidate(英文) sql server 2000(英文) 在 pdc 上,我談?wù)摿擞嘘P(guān)可靠的 xml web service(web 服務(wù))的話題,這個(gè)話題源于過去一年來的多次交流。在有關(guān)建立 xml web service 的眾多常見問題中,可靠性問題是開發(fā)人員實(shí)現(xiàn)分散式 web 服務(wù)所面臨的五個(gè)最重要的問題之一。如果分開來講,這個(gè)問題并不是太難,因此,本月我準(zhǔn)備談一談建立可靠的 xml web service 這一棘手的問題。
概述 global xml web services architecture(gxa [英文])最突出的一面就是可以使用可合成處理協(xié)議擴(kuò)展該體系結(jié)構(gòu)。這些協(xié)議主要通過 soap 標(biāo)頭實(shí)現(xiàn),可以提供包括安全性、加密、路由和可靠性的廣泛服務(wù)。當(dāng)您開始構(gòu)建基于 gxa 的應(yīng)用程序時(shí),您將發(fā)現(xiàn) gxa 實(shí)質(zhì)上是一種消息處理體系結(jié)構(gòu),它通過基于標(biāo)準(zhǔn)的編碼技術(shù) (soap) 在系統(tǒng)和服務(wù)之間提供協(xié)同工作能力。到目前為止,大部分實(shí)現(xiàn)工作都集中在 soap 1.1 和 wsdl 兼容服務(wù)上,因此 web 服務(wù)實(shí)現(xiàn)方案可以與多種語言和操作系統(tǒng)協(xié)同工作。
這是一個(gè)了不起的概念。任何兩個(gè)系統(tǒng)之間都能夠進(jìn)行交流,只要它們能夠分析 xml 并理解 soap 規(guī)范的規(guī)則。但是,簡單的消息交換并不能滿足復(fù)雜的業(yè)務(wù)應(yīng)用程序的需要。真正的應(yīng)用程序(不管其內(nèi)部域體系結(jié)構(gòu)如何)均需要標(biāo)準(zhǔn)化的服務(wù),例如處于 web 服務(wù)消息處理層上的安全性、授權(quán)和可靠性。在 global xml web services architecture(具體地說就是 soap、soap 模塊和基礎(chǔ)結(jié)構(gòu)協(xié)議)的創(chuàng)建和實(shí)現(xiàn)背后有一個(gè)巨大的動力。隨著今年十月份四項(xiàng)新規(guī)范(ws-routing、ws-referral、ws-licensing 和 ws-security)的發(fā)布,我們已經(jīng)開始著手下一代 xml web service 實(shí)現(xiàn)工作。盡管發(fā)布了這么多的新規(guī)范,但仍有兩個(gè)領(lǐng)域尚無公共規(guī)范,即事務(wù)處理和可靠的消息處理,這主要是因?yàn)檫@些基礎(chǔ)結(jié)構(gòu)協(xié)議依賴于底層 soap 模塊。
本專欄主要從 gxa 環(huán)境的角度討論可靠性和可靠的消息處理的含義。而且我還要花一些時(shí)間探討通過在 .net 框架中擴(kuò)展現(xiàn)有 web 服務(wù)類來開發(fā)可靠性協(xié)議需要做些什么。本專欄有兩個(gè)主要目的:
讓讀者了解可靠性概念,為以后各種規(guī)范的實(shí)施做好準(zhǔn)備。請注意,本文不是規(guī)范,而只是一篇文章,旨在引發(fā)讀者思考下面要討論的問題。 說明 .net 框架中 web 服務(wù)和 soap 類強(qiáng)大的、基于標(biāo)準(zhǔn)的功能。 xml web service 的可靠性 我們把問題分開來講。我們前面講過,gxa 服務(wù)實(shí)現(xiàn)方案屬于消息處理服務(wù),它們需要在分散式環(huán)境中發(fā)送和接收基于標(biāo)準(zhǔn)的編碼消息。在 web 服務(wù)實(shí)現(xiàn)方案中發(fā)送 soap 消息的主要傳輸協(xié)議是 http,它易于實(shí)現(xiàn)和管理,但本身不可靠。我們無需深入探討 http 不可靠的具體原因,但只要知道 http 沒有基于標(biāo)準(zhǔn)的服務(wù)來保證終點(diǎn)或服務(wù)器能夠接收到請求就足夠了。盡管內(nèi)置的網(wǎng)絡(luò)層設(shè)備可以在發(fā)生一般災(zāi)難性故障(例如未找到資源)時(shí)產(chǎn)生錯(cuò)誤,但是卻沒有機(jī)制可以確保客戶端能夠以可靠的方式接收請求或響應(yīng)。
該協(xié)議是用于教學(xué)的原型。 該協(xié)議主要是通過擴(kuò)展 soap 消息處理層在 soap 處理層上執(zhí)行的。 soap 標(biāo)頭用于對處理層所需信息進(jìn)行編碼。 該協(xié)議要求實(shí)現(xiàn)方案具有某種方式的持續(xù)存儲,以便記錄消息。本實(shí)現(xiàn)方案使用的是 microsoft sql server 2000。 注意:不管采取哪種方式在 soap 環(huán)境中實(shí)現(xiàn)可靠性層,除了 soap 分析器之外,都還需要其他基礎(chǔ)結(jié)構(gòu)。 該協(xié)議支持對話概念,也就是說可以對多條消息進(jìn)行排序,從而保證有序的發(fā)送。 該協(xié)議的全部實(shí)現(xiàn)方案都由 ericrp 名稱空間限定。 ericrp 基于兩方對話方案,即兩個(gè)服務(wù)可以通過 xml web services 體系結(jié)構(gòu)(http、soap 和 wsdl)進(jìn)行對話。 客戶端負(fù)責(zé)消息的所有更正。(本文后面有詳細(xì)論述) 服務(wù)器只負(fù)責(zé)基于特定標(biāo)準(zhǔn)發(fā)送確認(rèn)。 服務(wù)器不記錄收到的過期消息。 服務(wù)器不記錄收到的無序消息。 服務(wù)器不記錄收到的重復(fù)消息。 處理 api 在這個(gè)原型中,我建立了六個(gè)主要的類和一個(gè)小型數(shù)據(jù)庫。我將類稱為處理 api。web 服務(wù)客戶端和服務(wù)器將使用這些類監(jiān)控和更正使用 ericrp 可靠性協(xié)議的消息。所有的類都屬于 ericrp 名稱空間:
client.conversationmanager:由客戶端使用,創(chuàng)建 web 服務(wù)消息關(guān)聯(lián)和消息監(jiān)控的對話環(huán)境。 client.rpclienttrace:由 web 服務(wù)客戶端使用,這些客戶端的方法對出站消息執(zhí)行 ericrp 可靠性協(xié)議。 server.conversationmanager:由 web 服務(wù)服務(wù)器使用,記錄并處理入站消息。 server.rpservertrace:由 web 服務(wù)服務(wù)器使用,這些服務(wù)器的方法對入站消息執(zhí)行 ericrp 可靠性協(xié)議。 reliabilityinfo:具有雙重作用。它可以由 client.conversationmanager 使用,為記錄提供可靠性信息;也可以由 web 服務(wù)客戶端代理使用,為出站消息創(chuàng)建必要的 soap 標(biāo)頭信息。 acknowledgment:由 server.conversationmanager 使用,向客戶端發(fā)送確認(rèn)。 ericrp 的工作原理 在查看代碼之前,我想先從用戶的角度說明該協(xié)議的工作原理。例如,我有一個(gè)簡單的 web 服務(wù)代理類,通過它可以向 web 服務(wù)發(fā)送訂單消息。打算使用 api 的客戶端需要執(zhí)行以下操作: