Rozszerzenie mechanizmu zdalnego wywołania metod w językach
Transkrypt
Rozszerzenie mechanizmu zdalnego wywołania metod w językach
Rozszerzenie mechanizmu zdalnego wywołania metod w językach typu Java o własność atomowego wykonania rozproszonych metod Mariusz Mamoński promotor: dr hab. inż. Paweł T. Wojciechowski Atomowe wykonanie Wykonanie zbioru metod przez dwa lub większą liczbę współbieżnych zadań (ang. tasks) można uznać za atomowe jeżeli efekt tego wykonania jest taki sam jakby wszystkie zadania zostały wykonane w sposób sekwencyjny. Atomowe wykonanie - przykład P M1p , M1q , M2p , M2q M1p , M2p , M1q , M2q M1p , M2p , M2q , M1q M1p T1 M1q Q M2p M2q T2 Nieodwracalne efekty przetwarzania w przeciwieństwie do systemów baz danych w pewnych systemach wykonanie operacji (metody) może mieć uboczne efekty w postaci zewnętrznych operacji Wejścia/Wyjścia, niemożność zastosowania niektórych podejść znanych z SBD, delayed output commit, manualne zakładanie blokad jest podatne na błedy. Algorytmy wersjonowania z każdym zdalnym obiektem P związane są dwa licznik: lokalny i globalny licznik wersji obiektu (lvA, gvA), zakładają pewną wiedzę o przebiegu przetwarzania, algorytmy: Basic Versioning Algorithm (BVA), Supremum Versioning Algorithm (SVA), Composite Versioning Algorithm (CVA). Java RMI Remote Method Invocation - mechanizm zdalnego wywoływania metod, stworzony dla środowiska Java, pozwala na zdalne wywoływanie metod obiektów znajdujących się w innych maszynach wirtulnych (również na zdalnych węzłach). Funkcje biblioteki implementacja algorytmu CVA, wyróżniony pojedynczy zarządca, dzięki wykorzystaniu mechanizmów dynamicznego generowania kodu korzystanie z biblioteki jest w dużym stopniu przezroczyste, implementacja prostego mechanizmu typu ,,Fault Tolerant’’ (uwzględnienie awarii klientów). Przykład dwie instancje tej samej usługi IncService (IncA, IncB), dwa identyczne zadania (T1, T2). IncA Inc1A T1 Inc1B IncB Inc2A Inc2B T2 Przykład IncService public class IncServiceImpl extends UnicastRemoteObject implements IncServiceInf { protected int counter = 0; ... public int increment() throws RemoteException { counter++; return counter; } } Przykład: standardowe RMI utworzenie usługi reg = LocateRegistry.getRegistry(); reg.bind("incA", new IncServiceImpl()); reg.bind("incB", new IncServiceImpl()); definicja zadania reg = LocateRegistry.getRegistry(“remote.com”); IncServiceInf incA = (IncServiceInf)reg.lookup("incA"); IncServiceInf incB = (IncServiceInf)reg.lookup("incB"); int valA = incA.increment(); int valB = incB.increment(); assertTrue(valA == valB); ??? Przykład: atomowe RMI taskManager = new AtomicTaskManagerService(); reg = VersionedLocateRegistry.getRegistry(taskManager.lookupTaskManager(”localhost”) ); reg.bind("incA", new IncServiceImpl()); reg.bind("incB", new IncServiceImpl()); AtomicTaskManager taskManager = AtomicTaskManagerService.lookupTaskManager("remote.host"); reg = VersionedLocateRegistry.getRegistry(taskManager, “remote.host”); IncServiceInf incA = (IncServiceInf)reg.lookup("incA"); IncServiceInf incB = (IncServiceInf)reg.lookup("incB"); RMIAtomicTask task = new RMIAtomicTask(); TaskDescription taskDescription = new TaskDescription(); taskDescription.addObjectAccess(incA); taskDescription.addObjectAccess(incB); task.startTask(taskDescription); int valA = incA.increment(); int valB = incB.increment(); transaction.endTask(); assertTrue(valA == valB); //OK