Rozdil je technicky, u posilani zprav muzu komunikovat skrze ruzna rozhrani, treba i socket a mit tak distribuovany system, za tuto flexibilitu se, jako vzdy, plati vykonem
To je pravda.
a navic je to komplikovanejsi na spravu.
Ne vždycky, záleží na okolnostech.
Např. v Erlangu je datový typ "Process Identifier" (PID), který se používá jako identifikátor adresáta zprávy a vždycky obsahuje i jakousi "adresu" VM, na které proces běží (v erlangovské terminologii "node"). Takže pokud chce proces A poslat nějakou zprávu procesu B, tak vůbec neřeší, kde B fyzicky běží - kód je stejný pro lokální i vzdálené volání. V principu tak můžeš libovolný proces vzít a přesunout někam jinam, bez změny kódu. Kdybys chtěl tohle udělat v systému s voláním metod, musíš mezi A a B vrazit dvě proxy. V nejhorším myslitelném případě dokonce specializované právě pro ten konkrétní objekt (call stub) a při jakékoliv změně B proxy taky překompilovat (to je pro správu dost peklo).
A tohle je právě jeden z technických důsledků toho zásadního rozdílu -
předání informace se velice snadno zakóduje jakkoli (request může putovat klidně třeba mailem a A vůbec nepozná rozdíl), zatímco
volání metody typicky využívá přímo instrukce procesoru, takže pokud chci udělat RPC, musím tam vrazit nějakou proxy, která to nafejkuje.
V praxi to pak dopadne tak, že když se rozhodneš monolit rozsekat na nějaké microservices (protože chceš mít tenhle buzzword v letáku), musíš:
1. systém zásadně přepsat (málo kdo to umí napsat dobře, protože to není triviální)
2. nemáš moc způsob, jak komunikaci sjednotit, takže skončíš s nějakým hrůzostrašným HTTP/JSON
3. ve finále teda jak blázen pořád převádíš interní datové struktury do JSONu a zpátky, což je ideální příležitost na domrvení dat, a třetinu energie spálíš na dumání nad tím, jak designovat HTTP endpointy
4. celé je to děsivě náročný proces jak z hlediska nároků na kvalitu designu/analýzy, tak z hlediska řízení exekuce
Srovnej s tím, že v Erlangu jenom tak "mimochodem" napsali distribuovanou databázi (Mnesia) s dost pokročilými vlastnostmi (failover, dynamické přidávání a odebírání nodů, změny způsobu replikace za běhu, ...), která je přímo součástí standardní knihovny. Protože jakmile máš podvozek, který umí skvěle distribuovat sám o sobě, není ta úloha tak těžká, spoustu problémů ti odpadne. Srovnej s mainstreamovými RDBMS, kde udělat to samý je na desetiletí a Turingovu cenu pro hlavního designéra...
(Samozřejmě, Mnesia má svoje problémy, netvrdím, že je to všespásné řešení, ale přijde mi to jako dobrá ilustrace)
Jaky je v tom rozdil ale pro navrh programu? Imho zadny, protoze z pohledu abstrakce je to to same. Tedy v pripade, ze se bude jednat o objekty v ramci jednoho programu. U distribuovaneho systemu me to bude nutit delat co nejvetsi objekty s co nejdelsi zivotnosti.
I v rámci jednoho programu je rozdíl zásadní - buď píšu autonomní objekty, které se samy rozhodují, nebo píšu tupé recepty "když X, tak Y".