Terracotta a distribuované metody

Dnes budu pokračovat v popisu svých experimentů s Terracottou. Povíme si něco o distribuovaném volání metod (Distributed Method Invocation). Motivace je jednoduchá. Představme si, že uživatel změní přes webové rozhraní globální nastavení aplikace. O této události potřebujeme informovat všechny členy clusteru. V EJB ale i bez nich je řešení velmi obtížné. Jediné mě známé řešení je šíření této události pomocí sdílené databáze. (a samozřejmě JMS viz. diskuze (updated 6.12))

Jak nám v tom pomůže Terracotta? Hodně. Umožňuje označit metodu jako distribuovanou. Tzn. pokud mám instanci objektu s takovouto metodou dostupnou z rootu a na jednom z členů clusteru tuto metodu zavolám, zavolá se mi i na ostatních členech. Ukažme si to na příkladu. Mějme následující triviální listener.



1 public class Listener {
2   public void actionPerformed(String action)
3   {
4     System.out.println(Thread.currentThread().getName()+" says \""+action+"\"");
5   }
6 }

Označíme metodu actionPerformed jako distribuovanou (viz. XML updated 28.11.2007) a nasimulujeme si její volání. Nejdříve musíme umístit instanci listeneru do rootu. Použijeme na to skladiště, které máme z minula. Pak už jenom zavoláme metodu listeneru.



1 public class Sender {
2   public static void main(String[] args) {
3     Store store = new Store();
4     Listener listener = new Listener();
5     store.put("listener", listener);
6     listener.actionPerformed("Action!");
7   }
8 }

Pokud vysílač běží na jediném virtuálním stroji spuštěném v clusteru, nic zvláštního se nestane. Jenom se nám vypíše hláška na konzoli. Zajímavé to začne být, až když spustíme další instanci. Přijímající stranu nejjednodušeji nasimulujeme takto.



1 public class Receiver {
2   public static void main(String[] argsthrows InterruptedException {
3       Thread.sleep(60000);
4   }
5 }

To je nejjednodušší příklad který mě napadl. Pokud tento přijímač běží v okamžiku kdy spustím vysílač, vypíše se mi v konzoli přijímače WorkerThread(dmi_stage,0) says "Action!". Cože, kde se mi tam vzalo další vlákno, vždyť ta moje aplikace je evidentně jednovláknová? Není! V okamžiku kdy jakoukoliv aplikaci spustím v Terracottě, musím počítat s tím, že je vícevláknová a chovat se podle toho. Zopakujme si, co znamená distribuované volání metod. Zavolám-li metodu, která je označena jako distribuovaná, na jednom členu clusteru, zavolá se mi i na ostatních. V uvedeném případě mám dva virtuální stroje spojené do clusteru, metoda se mi zavolá na obou. Na jednom normálně, na druhém automagicky

Samozřejmě, uvedený příklad je umělý. V praxi by nám pravděpodobně na všech virtuálních strojích běžela stejná aplikace. Pak by to bylo o něco méně magické. Také bychom listener pravděpodobně instancovali pomocí Springu, na což je Terracotta také připravena.

Co říci závěrem. Terracotta je zajímavý nástroj, který nám umožňuje dělat věci, které by bez ní byly obtížné. Navíc podobné experimentování je neuvěřitelně snadné. Stačí si stáhnout Eclipse plugin a pak všechno jednoduše naklikáte. Zkuste si to.

Zdrojové kódy jsou na stejném místě jako minule.

8 Responses to “Terracotta a distribuované metody”

  1. Dagi Says:

    "Jediné mě známé řešení je šíření této události pomocí sdílené databáze."

    A JMS Topic znas urcite take ;-).

    Mam to chapat tak, ze pokud je jajykoliv objekt ulozeny do objektu distribuovaneho Terracotou, dochazi nejen k propagaci stavu, ale i chovani? Pripadne lze toto chovani ridit na mensi granularite, napriklad anotaci metody?

  2. Honza Novotný Says:

    Nějak jsem z článku nepostřehl jak "označíme metodu actionPerformed jako distribuovanou"? Nebo to je dáno tím, že umístíme objekt do rootu?

  3. Lukáš Křečan Says:

    Metodu actionPerformed označíme jako distribuovanou v XML konfiguraci Terracotty. Například takto: https://java-crumbs.svn.sourceforge.net/svnroot/java-crumbs/terracotta-playground/tc-config.xml Tzn. budou distribuovány jenom označené metody.

  4. Lukáš Křečan Says:

    S tím JMS topicem to není tak jednoduché. Vezměme si třeba MDB. Těch mám v poolu na jednom JVM více. Očekávám, že pokud poslouchají na topicu, tak zprávu zpracuje právě jedna instance (rozhodně ne všechny v poolu, to by to bylo k ničemu). Jak se to bude chovat v clusteru? Zpráva se zpracuje N krát, kde je N počet členů clusteru? Nebo jednou? Specifikace taktně mlčí.

  5. Lukas Barton Says:

    Kdyz pouzijete JSM topics muzete tech prijemcu zpravy mit vice, viz napr.: http://java.sun.com/developer/EJTechTips/2003/tt0415.html

  6. dagi Says:

    I v pripade MDB to lze samozrejme nastavit, aby to dostali vsichni. Neni to sice pokryte speckou, ale aplikacn iservery to podporuji. Kdyby to byl problem, tak to lze udelat pres klasicke JMS API.

  7. Lukáš Křečan Says:

    Máte pravdu JMS topic pravděpodobně použí lze. Sypu si popel na hlavu i když už na ní mám máslo.

  8. Orion Letizi Says:

    Hi. I work on Terracotta but, unfortunately, I don't speak czech. I'd love to know what you think of Terracotta so far and what you're using it for...

    Cheers,
    Orion