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