Download - JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Transcript
Page 1: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

| 1Log kao osnova distribuiranih sustava .

Page 2: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Kapsch – O kompaniji

| 2Log kao osnova distribuiranih sustava .

Page 3: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Što je log? (1)

„Činjenica” je nepromjenjivi podatak o nekom događaju koji se dogodio u nekom trenutku

Primjeri:

• MoneyDeposited

• timestamp = 201401T140102

| 3Log kao osnova distribuiranih sustava .

• timestamp = 201401T140102

• accountId = 1341

• amount = 45.5

• UserAddressChanged

• timestamp = 201401T140112

• userId = 7009

• address = „Vukovarska 13, 10000 Zagreb”

• AccountBlocked

• …

Page 4: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Što je log? (2)

Log je način pohrane podataka

• samo dodavanje činjenica - (Create, Read, Update, Delete)

• činjenice su vremenski poredane

• sekvencijalno čitanje - od starijeg prema novijem zapisu

• svaka činjenica ima svoj indeks u logu

| 4Log kao osnova distribuiranih sustava .

Page 5: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Log i stanje sustava

Indeksu logu

Činjenica Stanje sustava

1 AccountOpened

• accountId=701

• Account ID 701, balance = 0

Indeks neke činjenice u logu ���� trenutak u vremenu stanja tog sustava !!!

| 5Log kao osnova distribuiranih sustava .

• accountId=701

2 MoneyDeposited

• accountId = 701

• amount = 45.5

• Account ID 701, balance = 45.5

3 AccountOpened

• accountId=702

• Account ID 701, balance = 45.5

• Account ID 702, balance = 0

4 MoneyWithdrawn

• accountId=701

• amount=5

• Account ID 701, balance = 40.5

• Account ID 702, balance = 0

Page 6: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Proizvođač činjenica

public class AccountManager {

private AccountDao accountDao;

private EventLogger eventLogger;

@Transactional

| 6Log kao osnova distribuiranih sustava .

@Transactional

public void depositMoney(long accountId, float amount) {

Account account = accountDao.findById(accountId);

float newBalance = account.getBalance() + amount;

account.setBalance(newBalance);

eventLogger.logEvent( new MoneyDeposited(accountId, amount) );}

}

Page 7: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Što log nudi? (1)

• Univerzalan način integracije sustava• „message bus” ?

• „event-driven” SOA?

| 7Log kao osnova distribuiranih sustava .

Page 8: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Što log nudi? (2)

• Zaštita opterećenja potrošača• svaki potrošač konzumira svojom brzinom

• Replikacija node-ova unutar potrošačkih clustera• nodeovi potrošačkih clustera mogu replicirati stanje preko loga

• nije potreban poseban mehanizam replikacije

| 8Log kao osnova distribuiranih sustava .

• nije potreban poseban mehanizam replikacije

• Jedinstveni „izvor istine” sustava• referentna vrijednost neke činjenice je u logu

• svaka greška među činjenicama se ispravlja samo na tom jednom

mjestu (nova kompenzirajuća činjenica), a propagira do svih potrošača

Page 9: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Što log nudi? (3)

• Bootstrapiranje novih potrošača• novi servisi (ili novi nodeovi u servis clusteru) konzumiraju log od

početnog indeksa (0)

• nije potreban poseban mehanizam za inicijalni import podataka

| 9Log kao osnova distribuiranih sustava .

• Restoriranje privremenih padova potrošača• privremeno srušeni servisi (ili nodeovi u njihovom clusteru) nakon

oporavka konzumiraju log od zadnjeg validnog indeksa u prošlosti

Page 10: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Količina podataka u logu

• Log zapisa obično ima 1-2 reda veličine više od zapisa stanja

• Idealno: podaci se nikad ne brišu

• Realno: podaci se dugo drže

• Hard diskovi:

• jeftini

• sekvencijalno čitanje (upravo to i treba)

| 10Log kao osnova distribuiranih sustava .

• sekvencijalno čitanje (upravo to i treba)

Page 11: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Kafka (1) – Uvod

• nastao u LinkedIn-u

• hibrid baze i message brokera (kontrast sa ActiveMQ/RabbitMQ-om)

• model:

• broker

• topic

• partitition

• poredak zapisa

| 11Log kao osnova distribuiranih sustava .

• poredak zapisa

samo u particiji

• potrošači „pull”-aju

zapise

• potrošači sami

pamte „offset”

zadnje poruke

Page 12: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Kafka (2) - Features

• ne degradira sa količinom zapisa, kao i brojem potrošača

• horizontalno skalabilan

• veliki throughput (nije napravljen za minimalnu latenciju)

• podržava velike backlog-ove (tjedni, mjeseci…)

• replikacija (v0.8)

• relativno low-level u usporedbi sa drugim message brokerima/ESB-ovima

| 12Log kao osnova distribuiranih sustava .

Page 13: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Datomic baza - Uvod

• Clojure! Rich Hickey! F*** yeah!

• baza nepromjenjivih činjenica u obliku „entity-attribute-value-time” (EAVT)

| 13Log kao osnova distribuiranih sustava .

• log svih činjenica je dio public API-a

• stanje baze za bilo koji trenutak u prošlosti (ne pohranjuje snapshot-ove, već

perzistentne data strukture - poput Git-a)

Page 14: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Datomic baza (2) - pisanje

| 14Log kao osnova distribuiranih sustava .

Page 15: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Datomic baza (3) - čitanje

| 15Log kao osnova distribuiranih sustava .

Page 16: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

CQRS/Event-sourcing (1)

• command i query dio aplikacije razdvojeni

(Command-Query-Responsibility-Separation)

• command (write) dio

• brine o atomičnosti procesiranja akcije koja nešto mijenja

(npr. ne smije se skinuti više novaca nego što ima na bankovnom računu)

| 16Log kao osnova distribuiranih sustava .

(npr. ne smije se skinuti više novaca nego što ima na bankovnom računu)

• često je dovoljan samo dohvat cjelokupnih entiteta po ID-u (key-value

baza, in-memory?)

• query (read) dio

• brine o različitim načinima prikaza podataka

(npr. kako najlakše JOIN-ati ovaj podatak sa nekim drugim radi prikaza na

toj web stranici)

• potreban je dohvat preko bogatog query API-a (npr. SQL)

Page 17: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

CQRS/event-sourcing (2)

• svaka izvršena komanda logira event

• log evenata služi za

• bootstrap in-memory modela

„command” dijela

• real-time opskrbljivanje

query/RDBMS dijela

| 17Log kao osnova distribuiranih sustava .

query/RDBMS dijela

• Axon framework

Page 18: JavaCro'14 - Log as basis for distributed systems – Vjeran Marčinko

Hvala!

| 18Log kao osnova distribuiranih sustava .

Hvala!