Ty cloudy
Tags: cloud, go, postgres, docker
Published: 2022-06-19 09:50:53

**Cloud computing**, jak jej známe dnes, je s námi již dvě dekády a dávno nejde o buzzword. Metaforu mraku vnesl do distribuovaných systémů Apple na počátku devadesátých let, ale teprve s rozvojem internetu tento přístup k tvorbě softwarových systémů zpopularizoval Amazon se svým AWS (a následně se přidali další, například Microsoft s Azure). Zde se zaměříme na současný stav, především tedy monolity vs. mikroslužby, moderní úložiště a dnes nejlepší programovací jazyky pro tuto oblast.

## Co nás čeká

Cloudová služba sestává z vlastní aplikace (napsané například v Javě nebo nyní populárním Go), ideálně bezstavové, která musí někde běžet, typicky v kontejneru (Docker apod.) v nějakém shluku serverů.

Data žijí v úložišti, ke kterému aplikace přistupuje a data vhodným způsobem prezentuje (buď přímo na webové stránce nebo pomocí API například pro mobilní aplikace). Dříve byly značně populární specializované objektové databáze, ovšem dnešní relační databáze nabízejí různá rozšíření pro práci s objektovými daty (například JSONB v PostgreSQL), jejichž nasazení je téměř vždy výhodnější. Případně se může použít nějaká NoSQL databáze, protože ty jsou oproti relačním podstatně výkonnější v distribuovaném prostředí. Příkladem je například Datastore v Google App Engine, ke které se záhy dostaneme.

## Monolity a mikroslužby

Monolitická aplikace je jedna velká binárka, jejíž instance běží na několika serverech a zpracovávají požadavky klientů. Taková aplikace se snáze píše, překládá, nasazuje a, popravdě, pro většinu projektů je tato architektura plně postačující.

U velkých projektů se vyplácí rozsekání aplikace do samostatných celků, které se implementují a nasazují zvlášť a komunikují mezi sebou po síti. Nejpopulárnější jsou v současnosti v tomto ohledu mikroslužby, což jsou malé, funkčně omezené aplikace, každá ve svém vlastním kontejneru, které dohromady tvoří vysoce škálovatelnou aplikaci.

Mikroslužby mezi sebou potřebují komunikovat rychle, k čemuž slouží specializované protokoly a knihovny, například gRPC. Každá má také svou databázi, v dobrém návrhu se nepoužívá jedna sdílená. Jednou z výhod mikroslužeb je, že každá může být napsaná v jiném jazyku (Java, C++, Go, Rust apod.) a používat jinou databázi (relační, dokumentovou, grafovou atd.)

## Google App Engine (GAE)

GAE je prostředí a sada knihoven od Googlu pro tvorbu cloudových aplikací, které lze psát v několika jazycích, z nichž je nejefektivnější Go (při použití tzv. "custom runtimes" lze použít libovolný jazyk, za tu námahu to ale nestojí). Později se podíváme i na neméně efektivní Rust.

V GAE se typicky nasazují monolity (je ale možné aplikaci rozdělit do samostatných služeb), které mají přístup k rychlému objektovému úložišti, memcache (pro zrychlení zpracování požadavků) nebo třeba frontám úloh. Nasazení a správa jsou plně automatické, Google aplikaci přeloží, zabalí do kontejneru a bezpečně spustí na svých serverech. Nové instance jsou spouštěny automaticky s rostoucí zátěží.

Datastore v GAE nemá žádné datové schéma, jde o poměrně jednoduchou NoSQL databázi. V Go lze ukládat přímo objekty, například:
```go
type User struct {
  ID       uuid.UUID
  UserName string
  Email    string
  FullName string         `datastore:",noindex"`
  Key      *datastore.Key `datastore:"-"`
}

func InsertUser(ctx context.Context, u *User) error {
  key := datastore.NewIncompleteKey(ctx, "User", nil)
  key, err := datastore.Put(ctx, key, u)
  if err != nil {
    return err
  }
  u.Key = key
  return nil
}
```
Jednotlivé položky odpovídají sloupcům v relační databázi a automaticky se indexují, pokud není přítomen tag `noindex`.

Příště si ukážeme jednoduchou aplikaci pro GAE a práci s databází.