GopherCon UK 2018 (pokračování)

Poznámky z londýnské konference o programovacím jazyce Go. Den druhý.

Text vyšel původně na webu autora.

První část konference najdete v minulém článku.

Zmiňoval jsem, že čtvrteční přednášky nebyly až tolik Golang-technické (a žádná z nich nebyla advanced). Z tohoto pohledu byl páteční den přínosnější i zajímavější.

🔑 Growing a Community of Gophers

Úvodní keynote Cassandry Salisbury (@Cassandraoid) jsem neviděl. Téma budování komunity na konferenci (aspoň mezi speakery) silně rezonovalo.

👍 From source code to Kubernetes, a Continuous Deployment tale

Z přenášky Alexandra Gonzáleze (@agonzalezro) si pamatuju, že měl pěkné live-demo, ve kterém ukazoval:

  1. Jednoduché Hello, world! s využitím gorilla/mux.
  2. Push do GitHub repozitory.
  3. Webhook + push na (public) Jenkins.
  4. Deployment do Kubernetes clusteru.

Nic světoborného, takhle si představuju Continuous Deployment. Samozřejmě, chyběly tam testy atd. a čekal bych nějaké modernější Pipelines než obstarožní Jenkins, ale jinak pěkná a svižná přednáška.

👍 Goroutines: the dark side of the runtime

Konečně přednáška, která přesahovala mé Golang technické znalosti! Roberto Clapis (@empijei) se ponořil do záludností goroutines. Zkuste si tipnout, jaký bude výstup tohoto programu:

package main

import (
 "fmt"
 "time"
)

func main() {
 for i := 0; i <= 9; i++ {
  go func() { fmt.Println(i) }()
 }
 time.Sleep(100 * time.Millisecond)
}

Že to bude deset desítek, asi nikdo z vás netipoval, co? 🤔

To podstatné z Robertovy přednášky:

  • Go má jak goroutines, tak closures – nemíchat!
  • Runtime is not preemptive – goroutine is done when it says it’s done.
  • Garbage collection (stop the world) – goroutines are asked to yield execution. Čekání na goroutines může blokovat GC -> freeze all the cores.
  • Goroutine cannot be stopped. Měly by explicitně vracet return a přijímat context (s cancel funkcí), nebo done channel.
  • Check for cancellation wherever possible. Pokud knihovna/funkce cancellation neumožňuje, dodejte svoji vlastní via closure.

A pro zvědavce, jak by měl předešlý kód správně vypadat, aby dával očekávaný výstup (ďábel 😈 je skrytý v detailu).

package main

import (
 "fmt"
 "time"
)

func main() {
 for i := 0; i <= 9; i++ {
  i := i // Seems odd, but it's legal and idiomatic.
  go func() { fmt.Println(i) }()
 }
 time.Sleep(100 * time.Millisecond)
}

Pro vysvětlení se podívejte buď na přednášku, nebo si přečtěte Effective Go.

👍 Understanding Go’s Memory Allocator

André Carvalho (@andresantostc) doručil druhou z nejtechničtějších přednášek – vysvětlení, jak funguje Go Memory Allocator:

  • Založený na TCMalloc (Thread-Caching Malloc).
  • Navíc přidává tiny allocations (k původním smallmedium a large alokacím).
  • Go (očividně) nemá malloc, ani free.
  • Pragma //go:noinline prevents inlining.
  • Kompilátor se snaží držet většinu proměnných na stacku (levnější) a jenom ty, které uniknou (escape) dává na heap.
  • Volání funkce mallocgc() vkládá kompilátor.
  • GC Sweeping:
    1. Scan all objects.
    2. Mark objects that are live.
    3. Sweep objects that are not alive.
  • Šikovná funkce ReadMemStats() – runtime statistiky memory allokátoru.

👍 Building Resilient Data Pipelines in Go

Přednáška Granta Griffithse (@griffithsgrant) byla primárně o případu užití Go – vytvoření data pipelines, které přesouvají data z IoT do zákaznických aplikací. Pipelines, které přesouvají data z Apache Kafka nodů do Apache Cassandra nodů, měli původně napsané v Javě, ale kvůli provozním nákladům je začali přepisovat do Golang. Pro porovnání:

  • 30 Kafka nodes -> 144 Java pipelines nodes -> 150 Cassandra nodes = 900.000 writes/sec.
  • 4 Kafka nodes -> 32 Go pipelines -> 9 Cassandra nodes = 450.000 writes/sec.

Po náběhu na stejnou úroveň nodů jako u Java řešení očekávají dvojnásobné množství zápisů do Cassandry.

Design Go data pipelines vypadá následovně:

  • Go micro-services
  • Go channels
    • Message channel – čte data z Kafky
    • Notification channel – rebalance notifikace
    • Error channel – chyby v Offset Managementu
    • OS Signals channel – naslouchání signálům OS pro graceful shutdown
  • Message transformation
  • Deployované na K8s cluster

Zajímavé bylo také Reliability Testing, něco vy stylu:

  1. Pošli 50 zpráv,
  2. „Za-pauzuj“ Docker po 10 zprávách,
  3. „Od-pauzuj“ Docker po 30 zprávách.

Celkově, velmi zajímavá přednáška o real-world, large-scale use casu, jakých na koferenci moc nebylo (což mi chybělo).

👍 How do you structure your Go apps?

Od prezentace Kat Zien (@kasiazien) jsem nečekal žádné zjevení, ale ve výsledku to byla příjemná přednáška a i něco nového jsem se v závěru přiučil. Jak strukturovat Go projekt je vousatá otázka. Přednáška shrnula různé layouty a krátce vypíchla jejich charakteristiky. Tedy:

  • Flat structure – všechno je v main packagi, vhodné pro malé projekty. Z pohledu na soubory je většinou nejasná business doména.
  • Group by function – klasika, která většinou vede k něčemu, jako je MVC.
  • Group by module – seskupení podle business domény. Vede k repetitivnosti (user.User, user.AddUser() atd.) a není intuitivní (kam přidat novou funkci?).
  • Group by context – vhodné pro komplikovanější aplikace:

Takže, jako vždycky – No Silver Bullet, strukturu svého Golang projektu si budete muset vyřešit sami. 😉

🔑 Athens – The Center of Knowledge

Brian Ketelsen (@bketelsen), mající závěrečnou keynote, přinesl asi nejzajímavější téma celé akce. Obecně, problém verzování a dependency managementu Golang packagů mi na konferenci hodně chybělo – je to nejsilnější a nejbolavější téma posledního půlroku, který jsem s Go strávil. Občas se sice někdo zeptal, kdo používá vgo a kdo používá dep, ale žádná přednáška se tomu nevěnovala.

Brian představil zbrusu nový projekt – Athens, který zastřešuje několik aktivit. Mimo jiné poskytuje:

  • Caching proxy server, který může běžet za firewallem.
  • Distributed trust, potvrzující autenticitu balíčků.
  • Decentralized verification, nezávisející na jednom centrálním poskytovateli (a.k.a. evil corporation).

Co to všechno nabízí (resp. bude poskytovat)?

  • Repeatable builds (i pokud je GitHub/GitLab/Bitbucket nedostupný).
  • Module validation, využívající hash v go.sum souboru (nyní součást Go modules).
  • Module signing, pomocí sítě distribuovanýcn „notářství“ (notaries).
  • Discoverability = Notaries + Publishers (collect certificates from Notaries).

Hlavním heslem je: Decentralized, Federated, Independent. Bude hodně zajímavé tenhle projekt sledovat!

Gopher – to be, or not to be?

Celkově hodnotím konferenci pozitivně. Co bych vypíchnul, byla profesionalita, která byla všudypřítomná. Nevím, jestli je v Česku něco podobně srovnatelného. Samozřejmě, nesmím zapomenout na dobré jídlo a catering.

Orientaci na komunitu jsem opakovaně zmiňoval. Což je pozitivní – Go je velice otevřená platforma a byť je to jazyk, který se blíží první dekádě, je zatím relativně mladý a řekl bych, že – minimálně v oblasti cloudu (a cloudové infrastruktury) – ještě stále nabírá momentum (které do Česka zatím ještě moc nedorazilo).

Co mi na konferenci chybělo? Advanced přednášky – pokud má konference 3 streamy, jsou dvě pokročilé prezentace za dva dny málo. Taky mi chybělo víc use case použití, real-world scénářů, kdy Go je dobrá/správná/excelentní volba.

Musím ocenit, že na konferenci bylo relativně hodně holek – na jednu stranu je to trochu překvapující (Go je docela low-level jazyk), na druhou stranu, na konferenci bylo znát, že nastupující/etablovanou generací jsou Milleniálové, což možná jde ruku v ruce.

Takže, za mne palec nahoru 👍 a snad se jednou dočkáme Golang konference i v Česku.

The Loneliness of the Long Distance Runner

Konference je jedna věc, co dělat ve zbývajícím volném čase je jiná záležitost. Londýn samozřejmě nabízí mnoho lákadel, od volného vstupu do mnoha muzeí a galerií přes kvantum pamětihodností až po obrážení tradičních pubů a rozmanitých restaurací s národními jídly.

Byť jsem některé z těchto možností také využil, hlavně jsem si užil Londýn běžecky – sice to není úplně intuitivní volba, ale když to člověk zkusí, zjistí, že tak pokryje docela velký akční rádius, včetně bonusových překvapení. Můžu doporučit. Doprovodné fotografie (vyjma 3 konferenčních) jsou pořízeny právě z těchto běžecko-průzkumných výprav.

Mind Map

Poslední rok píšu micro-services v Golangu. Předtím jsem (sekvenčně) programoval 2 roky v JavaScriptu, 3 roky v PHP a 12 let v Javě. Paralelně k tomu jsem 8 let fungoval jako Team/Technical Leader. Píšu technologický blog SoftWare Samuraj, kde se věnuji různým aspektům z oblasti SW engineeringu.

Věděli jste, že nám můžete zasílat zprávičky? (Jen pro přihlášené.)

Komentáře: 2

Přehled komentářů

Oldisy3 mind map
Vít Kotačka Re: mind map
Zdroj: https://www.zdrojak.cz/?p=21822