Téma: RPC, MQ, WEBSERVICE
Témafelelős: Matyi
Folyamatok közötti kommunikáció
A folyamatok közötti kommunikáció, azaz Inter-Process Communication(IPC) a különbözõ, úgynevezett címterek között biztosít kapcsolatot. Ezek a címterek jelenthetnek ugyanazon, vagy két külön gépen futó szálakat, folyamatokat. Az 1967-ben elfogadott RFC707-es "High level framework for network-based resource sharing" nevû definícíóban már ezen kapcsolat alapjai írják le. Mint minden kommunikáció alapfeltétele, a közös nyelv, az IPC esetén is elengedhetetlen. A közös nevezõt az Interface Definition Language (IDL) segítségével határozzák meg és mivel a különbözõ típusú adatok egységes reprezentációja is szükséges, így ehhez egy External Data Representation (XDR) leírás is tartozhat.
- Tehát az IPC lehet:
- helyi: LPC ún. Local Procedure Call, ami egy csak Microsoft Windows NT kernelek esetén alkalmazott hívás típus
- távoli: Remote Procedure Call, továbbiakban ezt tárgyaljuk. - Elsõ implementációk:
- UNIX: DCE/RPC
- Microsoft: MSRPC/DCOM
Az RPC-vel kapcsolatos alapvetõ jellemzõk:
- Szinkron vagy Aszinkron módon megy végbe, vagyis blokkolja-e a hívó szálat, vagy sem. Aszinkron hívás esetén fellép bizonyos callback esemény, illetve ez valamilyen -mondjuk kommunikációs- hiba folytán el is maradhat: elveszik a kérés, vagy a válasz a kommunikációs hálózaton
- Konkurencia: Ha a hívás egy távoli erõforrás használatára irányul, akkor valamilyen módon kezelni kell az esetleges konkurens kérések kezelését: ez történhet a kérés elutasításával, vagy várakozásra kényszerítésével.
- Átviteli közeg: Függ a folyamatok címtereinek elhelyezkedésétõl, átviteli közegnek tekinthetõ két gép között egy RS232 kapcsolat, vagy akár távolabbi gépek esetén az Ethernet.
- Biztonság: Egyfelõl itt felmerülhet akár a hívó, akár a kiszolgáló oldal kétséget kizáró, egyértelmû azonosítása, mely történhet bizonyítványok, vagy azonosító-jelszó páros segítségével, ez tulajdonképpen része az autentikációs folyamatnak. Másrészrõl a kommunikáció titkosítása jelenthet nagyobb biztonságot. Lehetséges a hívást lehetõvé tevõ kommunikációs közeg titkosítása, vagy magának a hívást leíró kérés titkosítása, vagy ezek kombinációja.
- Kliens oldali stub: Olyan kód-csonk, amely lehetõvé teszi a távoli eljárások hívását, nagyon hasonlóan mintha lokálisak lennének.
RPC analógiára épülõ megoldások:
- JAVA RMI (Remote Method Invocation): elsõsorban JVM-ek közötti kommunikáció
- XMLRPC: a Simple Object Access Protocol (SOAP) elõdje, bizonyos korlátozásokkal
- Pyro: python nyelvû implementáció. Az objektumok pár sorral kiterjeszthetõk és használhatók távoli eljáráshívásra.
- CORBA (Common Object Request Broker Architecture): célja az volt, hogy architektúrától és nyelvtõl függetlenül lehetõvé tegye az eljáráshívásokat, minezt úgy, hogy gyakorlatilag mindenhez külön implementációt készítettek. Brokerek kezelik az üzeneteket.
- MQ (Message Queueing): Bár ez nem RPC megoldás, mégis gyakran közvetítenek rajt olyan kéréseket, amelyek távoli erõforrás elérésére irányulnak. Managerek kezelik az üzeneteket.
JAVA RMI:
Java Remote Method Protocol (JRMP). A protokoll a java.rmi, vagy a sun.rmi csomagok keresztül érhetõ el. Érdekesség, hogy 5-ös java elõtt a stubokat egy külön fordítóval kellett fordítani.
Plusz szolgáltatás, hogy ún. service lookup érhetõ el, amely segíti a hívó számára nem ismert, kiajánlott szolgáltatások felderítését.
XML-RPC:
XML formátumon, valamint HTTP átviteli protokollon alapuló, egyszerú RPC, mely széles körû implementációkkal rendelkezik. Egyszerre csak egy metódus hívható, valamint már támogat a HTTP által biztosított egyszerû autentikációt, vagy HTTPS-en keresztüli titkosítást. Bizonyos esetekben XML helyett, egy másik "lightweight" adatformátumot, a JSON-t is használják.
WebService:
Az XML-RPC-re épülõ szolgáltatás, mely SOAP üzeneteket forgalmaz. Ezek az üzenetek tartalmaznak egy fej elemet, testet, valamint lehetséges MIME objektumokat csatolni. A fejléc tartalmaz üzenet azonosítót, küldõt, fogadót, valamint a hívni kívánt metódus nevét, a test pedig tartalmazza a metódusnak átadandó paramétereket, adatokat. A szolgáltatások leírására az ún. WebService Definition Language (WSDL) áll rendelkezésre, amely akár több Szerviz, Port és Metódus leírását is támogatja egyszerre. Alapvetõen állapotmentes kommunikációról beszélünk RPC esetén, viszont a WebService-hez nagyon hasonló REST interface már biztosít állapotokat. A rest különlegessége, hogy míg a WebService-ek HTTP POST kérésekkel dolgoznak, addig a REST akár a HTTP GET, vagy DELETE kérésekkel is dolgozhat.
A WebService-ek biztonságáért a WebService Security (WSS) felelõs. Itt ugyanúgy lehetõség van a HTTP azonosítás, vagy titkosítás használatára, ezenfelül az XML üzenetet alá lehet írni egy az üzenethez csatolt karaktersorozat segítségével (XML signature), illetve akár titkosítani is lehet ám az XML formátum itt is megmarad (XML encryption).
MQ:
Az MQ biztosan aszinkron módon mûködik, az üzenetek pedig FIFO elv alapján kerülnek kézbesítésre, bár ezt az implementáció nem feltétlenül garantálja. A queue egy gépen helyezkedik el, ezt egy manager kezeli, ehhez csatlakoznak a kliensek. A sorba helyetett üzenetek tartósság szerint lehetnek csak memóriában tárolódóak, lemezre írottak, vagy adatbázisba mentettek. Az üzeneteknek lehet élettartama, ezután törlésre kerülnek. Elõny lehet RPC esetén az üzenetek routolása, illetve a tömeges kézbesítés, amely csak bizonyos számú összegyûlt kérés után kézbesít "burst" szerûen, így egy "költségesen elindítható" erõforrással lehet takarékoskodni.
A különbözõ nyelveken írt RPC támogató framework-ök nagyon nagy terhet vehetnek le a fejlesztõk válláról, kiszolgáló oldalon automatikus IDL generálással, kliens oldalon pedig ezeket beolvasva automatikus stub generálással, valamint magukban foglalják a közegtõl általában független kommunikációs megoldások implementációit.