SlideShare ist ein Scribd-Unternehmen logo
Skalierbare Anwendungen
mit Google Go
Frank Müller

Oldenburg
Baujahr 1965
Entwickler
Fachautor
!

frank@mweb.de
@themue
Moderne
Mehrkernsysteme

sind wie die

Vereinigung von Flüssen
Ihre Energie gilt es

effizient zu nutzen
Hier bietet sich

	 	 	 	 	 	 	 Google Go an
imperativ

bedingt objektorientiert

Google Go als multikulturelle Sprache

bedingt funktional

nebenläufig
❝
It’s better to have a permanent
income than to be fascinating.
–Oscar Wilde
Nebenläufigkeit in Go

•

Leichtgewichtige Goroutines im Thread
Pool


• Sehr große Anzahl gleichzeitig möglich

• Kommunikation und Synchronisation über
Channels


•

Vielfältige Kontrolle durch select
Statement
Beispiel: Goroutines als Server
Client

Client

Client

Server
Beispiel: Lastverteilung
Worker

Client

Master

Client

Worker

Worker
Netze von Goroutines
A
C

D

B
E

F

G
E1

E2

E3
Ein Wimmeln wie

im Bienenstock
Kapselung in Typen
package service
!

type Service struct {
	 thisChan	 chan *This
	 thatChan	 chan *That
	 foo	 	 	 bool
	
	 bar	 	 	 int
	 baz	 	 	 string
}
Konstruktoren sind Funktionen
func NewService(...) *Service {
	 s := &Service{
	 	 thisChan: make(chan *This),
	 	 thatChan: make(chan *That, 10),
	 	 …,
	 }
!

	
	

// Start of the backend loop as goroutine.
go s.loop()

!

	 return s
}
Endlosschleifen und select
func (s *Service) loop() {
	 ticker := time.NewTicker(time.Second)
	 for {
	 	 select {
	 	 case this := <-s.thisChan:
	 	 	 s.doThis(this)
	 	 case that := <-s.thatChan:
	 	 	 s.doThat(that)
	 	 case <-ticker.C:
	 	 	 s.doTick()
	 	 }
	 }
}
Methoden als externe Schnittstellen

func (s *Service) DoThis(data string) int {
	 respChan := make(chan int)
	 this := &This{data, respChan}
!

	 s.thisChan <- this
	 return <-respChan
}
Goroutines können
eigene Wege

gehen …
… oder gemeinsame
Rechenleistung nutzen

Konflikte vermeiden

Herausforderungen nebenläufiger Anwendungen

Rennen kontrollieren

Probleme abfedern
Sehr naive Parallelisierung (1)
func process(in []int) []int {
	 resultChan := make(chan int)
	 for _, value := range in {
	 	 // One goroutine per value.
	 	 go processValue(value, resultChan)
	 }
	 out := make([]int, 0)
	 for i := 0; i < len(in); i++ {
	 	 out = append(out, <-resultChan)
	 }
	 return out
}
Sehr naive Parallelisierung (2)

func processValue(
	 inValue int, resultChan chan int) {
	 // Time of result calculation depends
	 // on value.
	 outValue := inValue …
!

	 resultChan <- outValue
}
Verbesserung

•
• Output mit richtiger Größe initialisieren

Ergebnis gemäß Index setzen
•
Index in der Verarbeitung mitführen
Verbesserung (1)
func process(in []int) []int {
	 resultChan := make(chan *result)
	 for index, value := range in {
	 	 // One goroutine per value.
	 	 go processValue(index, value, resultChan)
	 }
	 out := make([]int, len(in))
	 for i := 0; i < len(in); i++ {
	 	 result <- resultChan
	 	 out[result.index] = result.value
	 }
	 return out
}
Verbesserung (2)
type result struct {
	 index int
	 value int
}
!

func processValue(
	 index, inValue int, resultChan chan *result) {
	 // Time of result calculation depends
	 // on value.
	 outValue := inValue …
!

	 // Send index with result.
	 resultChan <- &result{index, outValue}
}
Isolierung von Zugriffen

• Loops serialisieren Zugriffe

• Synchronisation über Channels oder
Package sync


• Referenzen nur an eine Goroutine senden

Aufteilung von Arrays und Slices
•
Unabhängigkeit von Goroutines

• Keine Beziehung zwischen Goroutines

Kontrolle nur über Channels

•
• Externe Packages helfen

git.tideland.biz/goas/loop

•
• launchpad.net/tomb
Schleifenfunktion
func (t *MyType) backendLoop(l loop.Loop) error {
	 for {
	 	 select {
	 	 case <-l.ShallStop():
	 	 	 return nil
	 	 case foo := <-t.fooChan:
	 	 	 if err := t.processFoo(foo); err != nil {
	 	 	 	 return err
	 	 	 }
	 	 case …:
	 	 	 …
	 	 }
	 }
}
Kontrolle der Schleifenfunktion
// Start of the goroutine in constructor.
t.loop = loop.Go(t.backendLoop)
!

// Tell loop to stop.
err := t.loop.Stop()
!

// Kill loop with passed error and wait.
t.loop.Kill(myError)
err := t.loop.Wait()
!

// Retrieve status and possible error.
status, err := t.loop.Error()
Deadlocks vermeiden (Timeout)

func (t *MyType) Foo(foo *Foo) error {
	 select {
	 case t.fooChan <- foo:
	 case <-time.After(timeout):
	 	 return errors.New("timed out")
	 }
	 return nil
}
Deadlocks vermeiden (Loop)

func (t *MyType) Foo(foo *Foo) error {
	 select {
	 case t.fooChan <- foo:
	 case <-t.loop.IsStopping():
	 	 return errors.New("not running anymore")
	 }
	 return nil
}
Vernetzung
Hilfreiche Packages

• net, …/http für IP und Web

html/template, mime/… für Inhalte

•
• encoding/gob, …/json, …/xml für die
Serialisierung


• compress/… zur Komprimierung

• crypto/… zur Verschlüsselung
Externe Packages von Google

• WebSocket, SPDY, Dict und mehr in
code.google.com/p/go.net


• Weitere Crypto Packages (u.a. OpenPGP)
in code.google.com/p/go.crypto
Serialisierung via JSON
type OrderItem struct {
	 Id	 	 	 	 int		 	 `json:"ArticleNo"`
	 Quantity		 int
}
!

type Order struct {
	 Name		 	 string
	 Street	 	 string
	 City	 	 	 string
	 Remarks	 string	 `json:",omitempty"`
	 Items		 	 []OrderItem
}
Marshalling
order := Order{
	 Name: 	 "Foo Bar",
	 …
	 Items:	 []OrderItem{{4711, 1}, {4712, 5}, …},
}
!

marshalledOrder, err := json.Marshal(order)
if err != nil {
	 …
}
!

n, err := anyWriter.Write(marshalledOrder)
Unmarshalling

var order Order
!

err := json.Unmarshal(marshalledOrder, &order)
if err != nil {
	 …
}
!

fmt.Printf("Name: %sn", order.Name)
Netz und Crypto

WebSockets

Fallbeispiel einer API

Reflection für Dispatching

Serialisierung via JSON
❝
Zitat hier eingeben.
Bildquellen –Christian Bauer
123RF

iStockphoto

eigene Quellen

Weitere ähnliche Inhalte

Was ist angesagt?

OpenCL Grundlagen
OpenCL GrundlagenOpenCL Grundlagen
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
Frank Müller
 
Introduction to BlazeDS
Introduction to BlazeDSIntroduction to BlazeDS
Introduction to BlazeDS
awerft
 
SysDig Metriken zentralisieren
SysDig Metriken zentralisierenSysDig Metriken zentralisieren
SysDig Metriken zentralisieren
inovex GmbH
 
C++11 und c++14
C++11 und c++14C++11 und c++14
C++11 und c++14
Holger Jakobs
 
Multithreaded Algorithms
Multithreaded Algorithms Multithreaded Algorithms
Multithreaded Algorithms
Kersten Broich
 
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
FMK2014: FileMaker Plugin erzeugen by Christian SchmitzFMK2014: FileMaker Plugin erzeugen by Christian Schmitz
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
Verein FM Konferenz
 
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten KoebkeOSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
NETWAYS
 

Was ist angesagt? (8)

OpenCL Grundlagen
OpenCL GrundlagenOpenCL Grundlagen
OpenCL Grundlagen
 
Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in Go
 
Introduction to BlazeDS
Introduction to BlazeDSIntroduction to BlazeDS
Introduction to BlazeDS
 
SysDig Metriken zentralisieren
SysDig Metriken zentralisierenSysDig Metriken zentralisieren
SysDig Metriken zentralisieren
 
C++11 und c++14
C++11 und c++14C++11 und c++14
C++11 und c++14
 
Multithreaded Algorithms
Multithreaded Algorithms Multithreaded Algorithms
Multithreaded Algorithms
 
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
FMK2014: FileMaker Plugin erzeugen by Christian SchmitzFMK2014: FileMaker Plugin erzeugen by Christian Schmitz
FMK2014: FileMaker Plugin erzeugen by Christian Schmitz
 
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten KoebkeOSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
OSMC 2018 | Katzeninhalt mit ein wenig Einhornmagie by Carsten Koebke
 

Ähnlich wie Skalierbare Anwendungen mit Google Go

Ein Gopher im Netz
Ein Gopher im NetzEin Gopher im Netz
Ein Gopher im Netz
Frank Müller
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
QAware GmbH
 
JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
Jan Stamer
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Sebastian Springer
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
Digicomp Academy AG
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
openForce Information Technology GesmbH
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in Go
Frank Müller
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100
Yvette Teiken
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
GEEKcon
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net
Daniel Fisher
 
Woop - Workflow Optimizer
Woop - Workflow OptimizerWoop - Workflow Optimizer
Woop - Workflow Optimizer
Martin Homik
 
Übungsaufgaben
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgaben
maikinger
 
Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2
Manfred Steyer
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
gedoplan
 
Slides
SlidesSlides
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
Dr. Herwig Henseler
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwickler
jlink
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
thoherr
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
Christian Gohmann
 

Ähnlich wie Skalierbare Anwendungen mit Google Go (20)

Ein Gopher im Netz
Ein Gopher im NetzEin Gopher im Netz
Ein Gopher im Netz
 
Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im Vergleich
 
JAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzenJAX 2024: Go in der Praxis einsetzen
JAX 2024: Go in der Praxis einsetzen
 
Warum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser machtWarum ECMAScript 6 die Welt ein Stückchen besser macht
Warum ECMAScript 6 die Welt ein Stückchen besser macht
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale Programmierung
 
jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?jQuery & CouchDB - Die zukünftige Webentwicklung?
jQuery & CouchDB - Die zukünftige Webentwicklung?
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in Go
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100
 
Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)Differenzial Analyse in der Praxis (Florian Walther)
Differenzial Analyse in der Praxis (Florian Walther)
 
2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net2006 - NRW Conf: Asynchronous asp.net
2006 - NRW Conf: Asynchronous asp.net
 
Woop - Workflow Optimizer
Woop - Workflow OptimizerWoop - Workflow Optimizer
Woop - Workflow Optimizer
 
Übungsaufgaben
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgaben
 
Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2
 
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
Battle of the Languages: Java und Python im Wettstreit beim Lösen von Program...
 
Slides
SlidesSlides
Slides
 
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgenSEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
SEROM 2018 - 11/14/17/20 - C++ gestern heute und morgen
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwickler
 
Ruby, Ruby, Ruby!
Ruby, Ruby, Ruby!Ruby, Ruby, Ruby!
Ruby, Ruby, Ruby!
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scala
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle Tools
 

Mehr von Frank Müller

JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIs
Frank Müller
 
JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in Go
Frank Müller
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do It
Frank Müller
 
Concurrency with Go
Concurrency with GoConcurrency with Go
Concurrency with Go
Frank Müller
 
2021 OOP - Kubernetes Operatoren
2021   OOP - Kubernetes Operatoren2021   OOP - Kubernetes Operatoren
2021 OOP - Kubernetes Operatoren
Frank Müller
 
Fun with functions
Fun with functionsFun with functions
Fun with functions
Frank Müller
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale Währungen
Frank Müller
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google Go
Frank Müller
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google Go
Frank Müller
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbar
Frank Müller
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
Frank Müller
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable Environment
Frank Müller
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source Software
Frank Müller
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of Go
Frank Müller
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Frank Müller
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven Architecture
Frank Müller
 
Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.
Frank Müller
 
Agility And The Way To SOA
Agility And The Way To SOAAgility And The Way To SOA
Agility And The Way To SOA
Frank Müller
 

Mehr von Frank Müller (19)

JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIs
 
JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in Go
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do It
 
Concurrency with Go
Concurrency with GoConcurrency with Go
Concurrency with Go
 
2021 OOP - Kubernetes Operatoren
2021   OOP - Kubernetes Operatoren2021   OOP - Kubernetes Operatoren
2021 OOP - Kubernetes Operatoren
 
Fun with functions
Fun with functionsFun with functions
Fun with functions
 
Blockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale WährungenBlockchains - Mehr als nur digitale Währungen
Blockchains - Mehr als nur digitale Währungen
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google Go
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google Go
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbar
 
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten CloudWTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
WTC 2013 - Juju - Mit etwas Magie zur perfekten Cloud
 
Juju - Google Go in a scalable Environment
Juju - Google Go in a scalable EnvironmentJuju - Google Go in a scalable Environment
Juju - Google Go in a scalable Environment
 
OOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source SoftwareOOP 2013 - Weltweite Entwicklung von Open Source Software
OOP 2013 - Weltweite Entwicklung von Open Source Software
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of Go
 
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches ParadigmaPecha Kucha: Nebenläufigkeit als natürliches Paradigma
Pecha Kucha: Nebenläufigkeit als natürliches Paradigma
 
Go to the Cloud
Go to the CloudGo to the Cloud
Go to the Cloud
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven Architecture
 
Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.Google Go - Good artists borrow, great artists steal.
Google Go - Good artists borrow, great artists steal.
 
Agility And The Way To SOA
Agility And The Way To SOAAgility And The Way To SOA
Agility And The Way To SOA
 

Skalierbare Anwendungen mit Google Go