SlideShare uma empresa Scribd logo
1 de 37
Baixar para ler offline
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 1/37
Concurrency Patterns
26 May 2015
Aaron Schlesinger
Sr. Engineer, Iron.io
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 2/37
About me
Database & backend systems engineer at Iron.io
Writing Go for ~2 yrs, JVM for a while during/before that
Distributed systems at Zynga, StackMob, PayPal, now Iron.io
C -> C++ -> Python/PHP -> Java -> Scala -> Go
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 3/37
"It's almost too easy to write concurrency bugs in Go"
Because Go has powerful concurrency primitives.
I'm discussing today how to use them responsibly.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 4/37
Today
Conventions & patterns for:
sync.Mutex, chanand sync.WaitGroup
Timeouts(http://blog.golang.org/go-concurrency-patterns-timing-out-and), cancellation and net.Context
(http://godoc.org/golang.org/x/net/context)
For-select loops
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 5/37
Something old
Locks have a time and a place. We found a few at Iron.io (building a distributed DB).
If you use locks:
But prefer sharing memory by communicating.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 6/37
Go-specific conventions
deferunlocking wherever possible
Document ownership in your public interface
Abstract mutual exclusion if it crosses an exported func
Worth paying attention to conventions from other communities (e.g. lock acquisition
order).
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 7/37
Documenting Mutual Exclusion
packagemain
import"errors"
varErrNotReserved=errors.New("notreserved")
//Reserverisamap[string]interface{}whereeachkey/valuepair
//canbereservedbycallersformutuallyexclusiveread-modify-write
//operations.
typeReserverinterface{
//GetAndReservewaitsforthekeytobeunreserved,thenreservesitformutualexclusion.
//Onsuccess,returnsthecurrentstateandreservationID.Usethelatterin
//futurecallsthatrequireareservationID.Ifanon-nilerrorisreturned,no
//reservationisestablishedandthereturnedvalueandreservationIDareinvalid.
GetAndReserve(keystring)(valinterface{},reservationIDstring,errerror)
//SetReservedsetsthevalueofthegivenkeyifreservationIDisvalid
//andpointstothecurrentreservation.Afterthiscallreturnssuccessfully,
//thecallerdoesn'thaveownershipofkeyandreservationIDisinvalid.
//ReturnsErrNotReservedifthereservationIDisinvalidornotthecurrentreservation.
//Onanynon-nilerror,neitherthevaluenorthecurrentreservationarechanged.
SetReserved(key,reservationIDstring,valueinterface{})error
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 8/37
Channels
Sharememorybycommunicating.
Channels + goroutines are "easy" but powerful enough to build real systems
They're built in for a reason. Use them by default
When in doubt, ask why you shouldn't use them to communicate between
goroutines
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 9/37
Conventions for Channels
Document sends and receives across funcboundaries: who and how?
Enlist the compiler. Use directional channels
Don't return a chanunless the funcis a generator(https://talks.golang.org/2012/concurrency.slide#25)
closeis a useful signal to callers. Use it and document it
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 10/37
Example
packagemain
import"sync"
//WatchChangeswillwatchthestateofthegivenrequest.chwillsendafter
//eachrequeststatechangeandwillbeclosedaftertherequestisremovedfrom
//therequeststatedatabase.Sendsonchfromthesamegoroutineasthecaller.
//
//ReturnsErrNotFoundiftherequestisnotreservedatcalltime.
//WatchChangeswilldonooperationsonchifanynon-nilerrorisreturned.
funcWatchChanges(reqIDstring,chchan<-int)error
//WatchAllwatchesforalleventsonthegivenrequest.
//
//TheWaitGroupwillbedoneaftertherequestisreserved,andthechannel
//willsendoneachstatechange,thenbeclosedwhentherequestisreleased.
//
//Thechannelwillsendfromanew,internalgoroutine,whichyouarenotresponsible
//formanaging.
funcWatchAll(reqIDstring)(*sync.WaitGroup,<-chanint)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 11/37
On Documentation
Documentation may establish contracts or invariants that code can't or won't
Code should be as self-documenting as possible, but don't let Godoc be empty
The remainder of this talk has mostly runnable code
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 12/37
WaitGroup
If you're waiting for a chanto close or receive a struct{}, can you use a
sync.WaitGroupinstead?
Use these as:
Notifiers for one-time events
Rendezvous points
Helpers to write deterministic tests
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 13/37
Notification of an event
packagemain
import"sync"
//startLoopstartsaloopinagoroutine.thereturnedWaitGroupisdone
//afterthefirstloopiterationhasstarted
funcstartLoop(nint)*sync.WaitGroup{
varwgsync.WaitGroup
wg.Add(1)
gofunc(){
first:=true
for{
//dosomeworkhere
iffirst{
wg.Done()
first=false
}
}
}()
return&wg
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 14/37
Revisiting fan-in
(Taken from https://talks.golang.org/2012/concurrency.slide#28
(https://talks.golang.org/2012/concurrency.slide#28), credit Renée French)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 15/37
Why?
If you can do work concurrently, do it. There's no excuse not to.
How I'm defining fan-in:
A code pattern to gather results from 2 or more goroutines
An algorithm to follow for converting sequential code to concurrent
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 16/37
Details
Read about it under "Fan-out, fan-in" section at https://blog.golang.org/pipelines
(https://blog.golang.org/pipelines)
sync.WaitGroupand a few channels make fan-in simple & understandable
In many cases, you can get an easy latency win without changing an exported func
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 17/37
Sequential datastore queries
funcGetAll()[]int{
ints:=make([]int,10)
fori:=0;i<10;i++{
ints[i]=datastoreGet()//sleepsfor<=1sec,thenreturnsarandomint
}
returnints
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 18/37
Concurrent datastore queries
funcGetAll()[]int{
wg,ch:=getWGAndChan(10)//getawaitgroupthathas10addedtoit,andachanint
fori:=0;i<10;i++{
c:=make(chanint)
godatastoreGet(c) //sendsanintoncthenclosesaftersleeping<=1sec
gofunc(){
deferwg.Done()//markthisiterationdoneafterreceivingonc
ch<-<-c //enhancement:rangeofcif>1results
}()
}
gofunc(){
wg.Wait()//waitforalldatastoreGetstofinish
close(ch)//thenclosethemainchannel
}()
ints:=make([]int,10)
i:=0
forres:=rangech{//streamallresultsfromeachdatastoreGetintotheslice
ints[i]=res//GetAllcanbeageneratorifyou'rewillingtochangeAPI.
i++ //thatletsyoupushresultsbacktothecaller.
}
returnints
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 19/37
Production issues
Specifically, issues in long-running systems.
They will happen
Test for them
Even if you can't, be proactive and try to fail gracefully
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 20/37
Timeouts
Your system shouldn't grind to a halt on channel sends.
Select on the channel and a timer. Or, do better...
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 21/37
Use net.Context
net.Context(https://blog.golang.org/context)has a nice interface in front of timers.
I'm cheating here. I said everything would be done with the standard library
Contexts are more than a timer. They provide a nice interface with some extras
You could build and test your own context in a few hours, from the stdlib
That's my excuse
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 22/37
Context interface
With (excellent) comments taken out for brevity.
import"time"
typeContextinterface{
Deadline()(deadlinetime.Time,okbool)
Done()<-chanstruct{}
Err()error
Value(keyinterface{})interface{}
}
(Copyright (c) 2009 The Go Authors. All rights reserved. Please see the full license
(https://github.com/golang/net/blob/master/LICENSE)for more.)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 23/37
Using contexts
They add cancellation
They build a tree of control
net.Contextis a good universal tool for timeouts/cancellation in a large codebase.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 24/37
Contexts in a distributed system
The Tail at Scale.
Jeff Dean talk/paper. I originally saw it at a Ricon 2013 Talk(https://www.youtube.com/watch?v=C_PxVdQmfpk)
Hedged requests: do a few identical GET (e.g. no side effects) requests, cancel
remaining requests after first returns
Rob showed a variant in https://talks.golang.org/2012/concurrency.slide#50
(https://talks.golang.org/2012/concurrency.slide#50)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 25/37
Adding cancellation
funcmain(){
ch:=make(chanint)
ctx,cancel:=context.WithTimeout(context.Background(),10*time.Millisecond)
defercancel()
fori:=0;i<10;i++{
//getsleepsforarandomduration<=100ms,
//thensendsarandomintonch.stopsifctx.Done()receives.
goget(ctx,ch)
}
select{
casei:=<-ch:
fmt.Printf("gotresult%dn",i)
case<-ctx.Done():
fmt.Println("gotnoresult")
}
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 26/37
That was the naïve implementation
But, it's not too hard to get "fancy"
Don't send 2nd request until 1st is past 95th percentile expected latency (2
contexts - one cancel)
Cancel in-flight requests (pass context to RPC subsystem)
Target-target communication (pass info on other in-flight requests over RPC)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 27/37
Putting it all together
For-select loops put together almost all of the concepts in here.
Possible applications:
Event loops
GC
Sequential state mutation (like an actor)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 28/37
For-select loop mechanics
Run a (possibly infinite) loop in a goroutine
Generally select on 2+ channels in each iteration
Sometimes pass long running operations to other goroutines
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 29/37
Patterns
Ack before and after real work is done. testing is easier and rate
limiting/backpressure is easy
If you're ticking, wrap time.Tickerto add ack
net.Contextfor cancellation
sync.WaitGroupfor started and stopped
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 30/37
A for-select poller
funcpoll(ctxcontext.Context)(*sync.WaitGroup,*sync.WaitGroup,<-chanstring){
varstart,endsync.WaitGroup//start&endnotificationstomultipleparties
start.Add(1)
end.Add(1)
ch:=make(chanstring)
gofunc(){
deferclose(ch)
deferend.Done()
start.Done()
for{
time.Sleep(5*time.Millisecond)
select{
case<-ctx.Done():
return
casech<-"element"+strconv.Itoa(rand.Int()):
}
}
}()
return&start,&end,ch
}
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 31/37
Driving the poller
funcmain(){
ctx,cancel:=context.WithTimeout(context.Background(),10*time.Millisecond)
defercancel()
mainCh,wg:=makeThings(10)//makeachanstringandawgthathas10addedtoit
fori:=0;i<10;i++{
start,_,ch:=poll(ctx)
start.Wait()
gofunc(){
deferwg.Done()
forstr:=rangech{
mainCh<-str
}
}()
}
gofunc(){
wg.Wait()
close(mainCh)
}()
printCh(mainCh)//loopsonmainChuntilit'sclosed
} Run
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 32/37
Notes
The poller is missing the ack
We have a small utility at Iron.io to add acks to time.Tickerand time.Timer
Exercise left to the reader
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 33/37
Conclusion
Go has really good built in concurrency primitives.
I believe we (the community) are starting to build good patterns & tools to responsibly
build on them.
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 34/37
If you take one thing away
Use net.Contextin your codebase.
Or, at least try it.
It's simple and powerful, and follows the "Go way."
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 35/37
If you take two things away
Add reading and understanding Go Concurrency Patterns(https://talks.golang.org/2012/concurrency.slide).
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 36/37
Thank you
Aaron Schlesinger
Sr. Engineer, Iron.io
aaron@iron.io(mailto:aaron@iron.io)
http://github.com/arschles(http://github.com/arschles)
@arschles(http://twitter.com/arschles)
5/27/2015 Concurrency Patterns
http://127.0.0.1:3999/concurrency-patterns/pres.slide#1 37/37

Mais conteúdo relacionado

Mais procurados

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operationbobwolff68
 
Golang 101
Golang 101Golang 101
Golang 101宇 傅
 
Porting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mindPorting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mindBeMyApp
 
Os Leventhal
Os LeventhalOs Leventhal
Os Leventhaloscon2007
 
Performance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPPerformance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPMax Romanovsky
 
Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)Nils Adermann
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projectsMpho Mphego
 
Real-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsReal-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsStanislav Zozulia
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingAndres Almiray
 
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language TracingDigibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language TracingLizzie Hodgson
 
Javaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersJavaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersAndres Almiray
 
[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtoolingDouglas Chen
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingAndrey Karpov
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingPVS-Studio
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy CodeRowan Merewood
 
Tensorflow on Android
Tensorflow on AndroidTensorflow on Android
Tensorflow on AndroidKoan-Sin Tan
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestSeb Rose
 
Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet
 

Mais procurados (20)

2012 04-19 theory-of_operation
2012 04-19 theory-of_operation2012 04-19 theory-of_operation
2012 04-19 theory-of_operation
 
Golang 101
Golang 101Golang 101
Golang 101
 
Composer
ComposerComposer
Composer
 
Porting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mindPorting and Maintaining your C++ Game on Android without losing your mind
Porting and Maintaining your C++ Game on Android without losing your mind
 
Os Leventhal
Os LeventhalOs Leventhal
Os Leventhal
 
Performance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHPPerformance tips for Symfony2 & PHP
Performance tips for Symfony2 & PHP
 
Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)Composer (PHP Usergroup Karlsruhe)
Composer (PHP Usergroup Karlsruhe)
 
Makefile for python projects
Makefile for python projectsMakefile for python projects
Makefile for python projects
 
Real-Time Web applications with WebSockets
Real-Time Web applications with WebSocketsReal-Time Web applications with WebSockets
Real-Time Web applications with WebSockets
 
Javaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 GroovytestingJavaone2008 Bof 5101 Groovytesting
Javaone2008 Bof 5101 Groovytesting
 
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language TracingDigibury: Edd Barrett - A Case Study in Cross-Language Tracing
Digibury: Edd Barrett - A Case Study in Cross-Language Tracing
 
Javaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 GroovybuildersJavaone2008 Bof 5102 Groovybuilders
Javaone2008 Bof 5102 Groovybuilders
 
[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling[COSCUP 2020] How to use llvm frontend library-libtooling
[COSCUP 2020] How to use llvm frontend library-libtooling
 
Os Ramirez
Os RamirezOs Ramirez
Os Ramirez
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
 
The Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and EverythingThe Ultimate Question of Programming, Refactoring, and Everything
The Ultimate Question of Programming, Refactoring, and Everything
 
Living With Legacy Code
Living With Legacy CodeLiving With Legacy Code
Living With Legacy Code
 
Tensorflow on Android
Tensorflow on AndroidTensorflow on Android
Tensorflow on Android
 
Stopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under TestStopping the Rot - Putting Legacy C++ Under Test
Stopping the Rot - Putting Legacy C++ Under Test
 
Puppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepoPuppet camp2021 testing modules and controlrepo
Puppet camp2021 testing modules and controlrepo
 

Destaque (7)

Concurrency Patterns
Concurrency PatternsConcurrency Patterns
Concurrency Patterns
 
Design Patterns
Design PatternsDesign Patterns
Design Patterns
 
Concurrency With Go
Concurrency With GoConcurrency With Go
Concurrency With Go
 
An introduction to programming in Go
An introduction to programming in GoAn introduction to programming in Go
An introduction to programming in Go
 
Concurrent programming1
Concurrent programming1Concurrent programming1
Concurrent programming1
 
Go Concurrency
Go ConcurrencyGo Concurrency
Go Concurrency
 
Beyond Relational
Beyond RelationalBeyond Relational
Beyond Relational
 

Semelhante a Concurrency patterns

Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Christian Catalan
 
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)VMware Tanzu
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of ReactiveVMware Tanzu
 
2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the TrenchesNicolas Fränkel
 
Dead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with CoroutinesDead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with CoroutinesTravis Kaufman
 
Tempest scenariotests 20140512
Tempest scenariotests 20140512Tempest scenariotests 20140512
Tempest scenariotests 20140512Masayuki Igawa
 
Continuous Integration using Cruise Control
Continuous Integration using Cruise ControlContinuous Integration using Cruise Control
Continuous Integration using Cruise Controlelliando dias
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go BadSteve Loughran
 
Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010David Gageot
 
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...Cωνσtantίnoς Giannoulis
 
Spring boot microservice metrics monitoring
Spring boot   microservice metrics monitoringSpring boot   microservice metrics monitoring
Spring boot microservice metrics monitoringOracle Korea
 
Spring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringSpring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringDonghuKIM2
 
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived SystemsEphemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived SystemsPriyanka Aash
 
Webinar: Agile Network Deployment
Webinar: Agile Network DeploymentWebinar: Agile Network Deployment
Webinar: Agile Network DeploymentVasudhaSridharan
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaAmazon Web Services
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in DjangoKevin Harvey
 

Semelhante a Concurrency patterns (20)

Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
Testing Vue Apps with Cypress.io (STLJS Meetup April 2018)
 
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
Spring Boot & Spring Cloud on PAS- Nate Schutta (2/2)
 
The value of reactive
The value of reactiveThe value of reactive
The value of reactive
 
The Value of Reactive
The Value of ReactiveThe Value of Reactive
The Value of Reactive
 
2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches2014 Joker - Integration Testing from the Trenches
2014 Joker - Integration Testing from the Trenches
 
Dead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with CoroutinesDead-Simple Async Control Flow with Coroutines
Dead-Simple Async Control Flow with Coroutines
 
Sprockets
SprocketsSprockets
Sprockets
 
Tempest scenariotests 20140512
Tempest scenariotests 20140512Tempest scenariotests 20140512
Tempest scenariotests 20140512
 
Continuous Integration using Cruise Control
Continuous Integration using Cruise ControlContinuous Integration using Cruise Control
Continuous Integration using Cruise Control
 
Azure from scratch part 4
Azure from scratch part 4Azure from scratch part 4
Azure from scratch part 4
 
When Web Services Go Bad
When Web Services Go BadWhen Web Services Go Bad
When Web Services Go Bad
 
Le Tour de xUnit
Le Tour de xUnitLe Tour de xUnit
Le Tour de xUnit
 
Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010Let's make this test suite run faster! SoftShake 2010
Let's make this test suite run faster! SoftShake 2010
 
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
Lessons Learned in Software Development: QA Infrastructure – Maintaining Rob...
 
Spring boot microservice metrics monitoring
Spring boot   microservice metrics monitoringSpring boot   microservice metrics monitoring
Spring boot microservice metrics monitoring
 
Spring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics MonitoringSpring Boot - Microservice Metrics Monitoring
Spring Boot - Microservice Metrics Monitoring
 
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived SystemsEphemeral DevOps: Adventures in Managing Short-Lived Systems
Ephemeral DevOps: Adventures in Managing Short-Lived Systems
 
Webinar: Agile Network Deployment
Webinar: Agile Network DeploymentWebinar: Agile Network Deployment
Webinar: Agile Network Deployment
 
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh VariaCloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
Cloud-powered Continuous Integration and Deployment architectures - Jinesh Varia
 
Continuous Integration Testing in Django
Continuous Integration Testing in DjangoContinuous Integration Testing in Django
Continuous Integration Testing in Django
 

Último

Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprisepreethippts
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Velvetech LLC
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfDrew Moseley
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf31events.com
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationBradBedford3
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsChristian Birchler
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtimeandrehoraa
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROmotivationalword821
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024StefanoLambiase
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Hr365.us smith
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaHanief Utama
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)jennyeacort
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identityteam-WIBU
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Developmentvyaparkranti
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanyChristoph Pohl
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odishasmiwainfosol
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfStefano Stabellini
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentationvaddepallysandeep122
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZABSYZ Inc
 

Último (20)

Odoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 EnterpriseOdoo 14 - eLearning Module In Odoo 14 Enterprise
Odoo 14 - eLearning Module In Odoo 14 Enterprise
 
Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...Software Project Health Check: Best Practices and Techniques for Your Product...
Software Project Health Check: Best Practices and Techniques for Your Product...
 
Comparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdfComparing Linux OS Image Update Models - EOSS 2024.pdf
Comparing Linux OS Image Update Models - EOSS 2024.pdf
 
Sending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdfSending Calendar Invites on SES and Calendarsnack.pdf
Sending Calendar Invites on SES and Calendarsnack.pdf
 
How to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion ApplicationHow to submit a standout Adobe Champion Application
How to submit a standout Adobe Champion Application
 
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving CarsSensoDat: Simulation-based Sensor Dataset of Self-driving Cars
SensoDat: Simulation-based Sensor Dataset of Self-driving Cars
 
SpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at RuntimeSpotFlow: Tracking Method Calls and States at Runtime
SpotFlow: Tracking Method Calls and States at Runtime
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTRO
 
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
Dealing with Cultural Dispersion — Stefano Lambiase — ICSE-SEIS 2024
 
Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)Recruitment Management Software Benefits (Infographic)
Recruitment Management Software Benefits (Infographic)
 
React Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief UtamaReact Server Component in Next.js by Hanief Utama
React Server Component in Next.js by Hanief Utama
 
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
Call Us🔝>༒+91-9711147426⇛Call In girls karol bagh (Delhi)
 
Post Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on IdentityPost Quantum Cryptography – The Impact on Identity
Post Quantum Cryptography – The Impact on Identity
 
VK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web DevelopmentVK Business Profile - provides IT solutions and Web Development
VK Business Profile - provides IT solutions and Web Development
 
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte GermanySuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
SuccessFactors 1H 2024 Release - Sneak-Peek by Deloitte Germany
 
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company OdishaBalasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
Balasore Best It Company|| Top 10 IT Company || Balasore Software company Odisha
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Xen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdfXen Safety Embedded OSS Summit April 2024 v4.pdf
Xen Safety Embedded OSS Summit April 2024 v4.pdf
 
PREDICTING RIVER WATER QUALITY ppt presentation
PREDICTING  RIVER  WATER QUALITY  ppt presentationPREDICTING  RIVER  WATER QUALITY  ppt presentation
PREDICTING RIVER WATER QUALITY ppt presentation
 
Salesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZSalesforce Implementation Services PPT By ABSYZ
Salesforce Implementation Services PPT By ABSYZ
 

Concurrency patterns