SlideShare une entreprise Scribd logo
1  sur  38
Télécharger pour lire hors ligne
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

Contenu connexe

Tendances

Devs@Home - Einführung in Go
Devs@Home - Einführung in GoDevs@Home - Einführung in Go
Devs@Home - Einführung in GoFrank Müller
 
Introduction to BlazeDS
Introduction to BlazeDSIntroduction to BlazeDS
Introduction to BlazeDSawerft
 
SysDig Metriken zentralisieren
SysDig Metriken zentralisierenSysDig Metriken zentralisieren
SysDig Metriken zentralisiereninovex GmbH
 
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 SchmitzVerein 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 KoebkeNETWAYS
 

Tendances (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
 

Similaire à Skalierbare Anwendungen mit Google Go

Java und Go im Vergleich
Java und Go im VergleichJava und Go im Vergleich
Java und Go im VergleichQAware GmbH
 
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 machtSebastian Springer
 
Einführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungEinführung in die funktionale Programmierung
Einführung in die funktionale ProgrammierungDigicomp Academy AG
 
DevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoDevOpsCon - Verteilte Entwicklung in Go
DevOpsCon - Verteilte Entwicklung in GoFrank Müller
 
Angular von 0 auf 100
Angular von 0 auf 100Angular von 0 auf 100
Angular von 0 auf 100Yvette 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.netDaniel Fisher
 
Woop - Workflow Optimizer
Woop - Workflow OptimizerWoop - Workflow Optimizer
Woop - Workflow OptimizerMartin Homik
 
Übungsaufgaben
ÜbungsaufgabenÜbungsaufgaben
Übungsaufgabenmaikinger
 
Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2Datenbindung und Performance in Angular 2
Datenbindung und Performance in Angular 2Manfred 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
 
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 morgenDr. Herwig Henseler
 
Mein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-EntwicklerMein paralleles Leben als Java-Entwickler
Mein paralleles Leben als Java-Entwicklerjlink
 
Funktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit ScalaFunktionale Programmierung und mehr mit Scala
Funktionale Programmierung und mehr mit Scalathoherr
 
Datentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsDatentransfer mit Oracle Tools
Datentransfer mit Oracle ToolsChristian Gohmann
 
Javascript done right
Javascript done rightJavascript done right
Javascript done rightDirk Ginader
 

Similaire à 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
 
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
 
Javascript done right
Javascript done rightJavascript done right
Javascript done right
 

Plus de Frank Müller

JAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsJAX 2023 - Cloud Provider APIs
JAX 2023 - Cloud Provider APIsFrank Müller
 
JAX 2023 - Generics in Go
JAX 2023 - Generics in GoJAX 2023 - Generics in Go
JAX 2023 - Generics in GoFrank Müller
 
Let The Computer Do It
Let The Computer Do ItLet The Computer Do It
Let The Computer Do ItFrank Müller
 
2021 OOP - Kubernetes Operatoren
2021   OOP - Kubernetes Operatoren2021   OOP - Kubernetes Operatoren
2021 OOP - Kubernetes OperatorenFrank 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ährungenFrank Müller
 
Juju - Scalable Software with Google Go
Juju - Scalable Software with Google GoJuju - Scalable Software with Google Go
Juju - Scalable Software with Google GoFrank Müller
 
RESTful Web Applications with Google Go
RESTful Web Applications with Google GoRESTful Web Applications with Google Go
RESTful Web Applications with Google GoFrank Müller
 
Clouds, leicht beherrschbar
Clouds, leicht beherrschbarClouds, leicht beherrschbar
Clouds, leicht beherrschbarFrank 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 CloudFrank 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 EnvironmentFrank 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 SoftwareFrank Müller
 
Beauty and Power of Go
Beauty and Power of GoBeauty and Power of Go
Beauty and Power of GoFrank 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 ParadigmaFrank Müller
 
On Event-Driven Architecture
On Event-Driven ArchitectureOn Event-Driven Architecture
On Event-Driven ArchitectureFrank 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 SOAFrank Müller
 

Plus de 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