DCOM Distributed Component Object Model Almir Delkic og Frank Jensen Institutt for Informatikk, Universitetet i Oslo, oktober 2003 Introduksjon Utvikling av distribuerte applikasjoner Utvidelse av COM for støtte av distribuerte objekter Utviklet av Microsoft, men styres nå av ActiveX Consortium
Motivasjon Feil-tolerent ovenfor hardware feil Passer like bra til små og store nett Robust ved nettverksfeil Godt egnet til heterogene klienter Effektiv utnyttelse av nettverk COM Spesifikasjon for å bygge software komponenter Pakke eller modul (EXE/DLL) Binær standard Tillater sømløs sammarbeid mellom heterogene komponenter
Arkitektur 1 COM komponenter i samme prosess Direkte kommunikasjon mellom klient og komponent Kommuniserer uten overhead Arkitektur 2 COM komponenter i forskjellige prosesser Ikke mulig å kalle komponenter direkte COM tar seg av kommunikasjonen transperent for programmereren
Arkitektur 3 COM komponenter på forskjellige maskiner Interprosess kommunikasjon erstates med netverksprotokoll transperent for både klienten og komponenten Gjenbruk Direkte gjenbruk av COM komponenter Tredjepartskomponenter
Lokasjonsuavhengighet Skjult lokasjon Komponenter kan kjøre på lokasjoner som gir mest mening Språkuavhengighet COM utvikles vha valgfritt språk Dette gjør DCOM språkuavhengig
Connection Management Teller antall tilkoblede klienter for hver komponent Hvis telleren går til null frigjøres komponenten Automatisk garbage collection Bruker ping protokoll Skalering 1 Symmetric Multiprocessing DCOM håndterer thread pool automatisk optimalisering i forhold til antall prosessorer
Skalering 2 Flexible Deployment Parallel deployment Skalering 3 Flexible Deployment Isolering av kritiske komponenter
Skalering 4 Flexible Deployment Pipelining Versjonshåndtering COM komponent kan tilby forskjellige grensesnitt til forskjellige klienter
Ytelse Metodekall i én prosess ingen overhead Interprosess metodekall ca 1000 ganger tregere metodekall må mellomlagres i buffer Fjerne metodekall ca 35% overhead over TCP/IP Båndbredde og latenstid foretrukket UDP protokoll bruker ping slår sammen pinger for samme klient som bruker flere komponenter forskjellige applikasjoner deler på en felles håndtering slår sammen flere metodekall i ett
Sikkerhet bruker innebygget sikkerhet i Windows NT Access Control Lists (ACL) for komponenter Blaster ormen: sårbarheter i protokollen RPC DCOM DCOM vs CORBA Binær standard Object Remote Procedure Call Verdi/referanse parameter er valgfritt Exceptions i IDL er ikke ok Exceptions kastes vha HRESULT return verdi Definerer eget interface ID Impl har Class IDs, CLSID, mappes i registry Distributed Garbage Collection (vha ping) Kun en spesifikasjon Internet Inter-ORB Protocol Kun interface typer sendes som referanse Exceptions i IDL er ok Exceptions kastes på vanlig måte Interface navn er ID Impl finnes vha Implementation Repository Ingen distribuert Garbage Collection
Grensesnitt (IDL) [ uuid(7371a240-2e51-11d0-b4c1-444553540000), version(1.0) ] library SimpleStocks importlib("stdole32.tlb"); [ uuid(bc4c0ab0-5a45-11d2-99c5-00a02414c655), dual ] interface IStockMarket : IDispatch HRESULT get_price([in] BSTR p1, [out, retval] float * rtn); [ uuid(bc4c0ab3-5a45-11d2-99c5-00a02414c655), ] coclass StockMarket interface IStockMarket; ; ; module SimpleStocks interface StockMarket float get_price(in string symbol); ; ; Klient import simplestocks.*; import com.ms.com.comfailexception public class StockMarketClient public static void main(string[] x) try IStockMarket market = (IStockMarket) new StockMarket(); float price = market.get_price("my_company") ); catch (ComFailException e) import org.omg.corba.*; import org.omg.cosnaming.*; import SimpleStocks.*; public class StockMarketClient public static void main(string[] x) try ORB orb = ORB.init(); NamingContext root = NamingContextHelper.narrow( orb.resolve_initial_references("names ervice") ); NameComponent[] name = new NameComponent("NASDAQ",""); StockMarket market = StockMarketHelper.narrow(root.resolve (name)); float price = market.get_price("my_company")); catch(exception e )
Server implementasjon import com.ms.com.*; import simplestocks.*; public class StockMarket implements IStockMarket private static final String CLSID = "BC4C0AB3-5A45-11d2-99C5-00A02414C655"; public float get_price( String symbol ) return 1.234; import org.omg.corba.*; import SimpleStocks.*; public class StockMarketImpl extends StockMarketPOA public float get_price( String symbol ) return 1.234; Server oppstart Internet Explorer In-process-server javareg Gjør endringer i registryen slik at komponentene alltid kjører Vanlige metodekall i en main - metode
Sammenligning: IDL Spesiell syntaks parametere returverdi, alltid vha parameter alle metoder returnerer HRESULT implementerer IDispatch diverse id er navn på klasse som skal implementere et grensesnitt (coclass) Spesiell syntaks Enkel parametere Sammenligning: Klient Referanse til objekt finnes automatisk av vha CLSID Lage objekt og caste til riktig grensesnitt Bruke metoder Mer automatisk Må initiere ORB Finne referanse til objekt F eks vha Naming Service Lage objekt og caste til riktig grensesnitt Bruke metoder Mer manuelt
Sammenligning: Server Må implementere metoder fra grensesnittet Må definere strengen CLSID Lik uuid fra IDL Må implementere metoder fra grensesnittet Må arve fra en Object Adapter e.l. f eks en POA-klasse Sammendrag Binært, slik at kildekode skjules Kan bruke gamle COMkomponenter Enkelt å lage klienter Flere ting er automatisk Garbage Collection Språkuavhenig Open source Flere ting er manuelt Kan lage grensesnitt til gamle klasser, indirekte Språkuavhengig
Referanser MSDN Library http://msdn.microsoft.com/library/default.asp?url=/library/backgrnd/html/ms dn_dcomtec.htm Gopalan Suresh Raj http://gsraj.tripod.com/misc/compare.html