SlideShare ist ein Scribd-Unternehmen logo
1 von 47
Downloaden Sie, um offline zu lesen
Concurrency	Patterns	
In	Kotlin
Huynh	Quang	Thao	
Trusting		Social	
Google	Developer	Expert
Myself
- Nationality:	Vietnam	
- Company:	Trusting	Social	-	Eintech	company	provided	credit	score	for	unbanked	users.	
- Working:	Backend,	Infrastructure,	and	Mobile	(side	project)	
- Member	of	GDE	(Google	Developer	expert)	
- Blog:	https://medium.com/@huynhquangthao		
- StackOverFlow:	https://stackoverElow.com/users/1192728/hqt	(24,000	points	til	now)
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads	
- Threads	are	spawn	from	the	process	that	they	share	the	same	memory	
space.
Operating		System	threads
- Process	is	the	instance	of	a	computer	program	that	is	being	executed	
by	one	or	many	threads	
- Threads	are	spawn	from	the	process	that	they	share	the	same	memory	
space.	
Context	Switching
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)	
- Coroutines	are	cooperatively	multitasked.	This	means	that	coroutines	
provide	concurrency	but	not	parallelism.
Coroutines	
- Coroutines	are	very	similar	to	threads.		(100_000	coroutines	easily)	
- Coroutines	are	cooperatively	multitasked.	This	means	that	coroutines	
provide	concurrency	but	not	parallelism.	
- Switching	between	coroutines	need	not	involve	any	system	calls	or	
any	blocking	calls	whatsoever.
fun spawnThreads() {
repeat(100_000) {
thread {
sleep(1000)
print(".")
}
}
}
fun spawnCoroutine() = runBlocking {
repeat(100_000) {
// launch a lot of coroutines
launch {
delay(1000L)
print(".")
}
}
}
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	1:	Sequential	Execution	
- passport	ofEice	for	2	hours	
- wait	in	the	line	for	4	hours	get	the	task	done	
- drive	back	2	hours,	go	home		
- stay	awake	5	more	hours	and	get	presentation	done.	
Cost:	13	hours.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	2:	Concurrency	Execution	
- passport	ofEice	for	2	hours	
- wait	in	the	line	for	4	hours.	Start	working	on	the	presentation.	
- drive	back	2	hours,	go	home		
- stay	awake	1	more	hours	and	get	presentation	done.	
Cost:	9	hours
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	3:	Parallel	Execution	
- passport	ofEice	for	2	hours	
- In	them	same	time,	assistant	works	on	the	presentation.	
- wait	in	the	line	for	4	hours.		
- drive	back	2	hours,	go	home		
- stay	awake	1	more	hours	and	get	presentation	done.	
Cost:	9	hours
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Solution	4:	Concurrent	and	Parallel	
- passport	ofEice	for	2	hours	
- In	them	same	time,	assistant	works	on	the	presentation.	
- wait	in	the	line	for	4	hours.	Check	the	Eirst	draft	and	give	comments.	
- drive	back	2	hours,	go	home		
- stay	awake	15	minutes	more	hours	and	get	presentation	done.	
Cost:	6	hours	15	minutes
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	a	presentation	done
Looking	back:	
- Get	a	passport	and	get	a	presentation	are	jobs.	
- Waiting	at	the	line	is	I/O	time.	
- Manager	and	Secretary	are	CPU	computational	resources.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Solution:	
- Get	a	passport	on	one	coroutine.	
- Each	presentation	work	is	on	one	coroutine.	
- Communication	between	coroutines	using	channel.
Concurrency	not	parallelism	
Scenario:	We	have	2	very	important	tasks	in	one	day:	
1.Get	a	passport	
2.Get	10	presentations	done
Solution:	
- Get	a	passport	on	one	coroutine.	
- Each	presentation	work	is	on	one	coroutine.	
- Communication	between	coroutines	using	channel.
Environment:	
- CPU	with	1	core.	
- CPU	with	2	cores.	
- CPU	with	multiple	cores.	
-->	Abstract	the		thread	handling	behind.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.	
Concurrency	provides	a	way	to	structure	a	solution	to	solve	a	problem	
that	may	(but	not	necessarily)	be	parallelizable.
Concurrency	not	parallelism	
Concurrency	is	about	dealing	with	lots	of	things	at	once.	
Parallelism	is	about	doing	lots	of	things	at	once.	
-->	Concurrency	is	about	structure,	parallelism	is	about	execution.	
Concurrency	provides	a	way	to	structure	a	solution	to	solve	a	problem	
that	may	(but	not	necessarily)	be	parallelizable.	
Coroutine/channel	open	a	lot	of	chance	to	solve	concurrency	
problems.
Concurrency	Patterns
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelines
- A	pipeline	is	a	pattern	where	one	coroutine	is	producing,	possibly	inEinite,	
stream	of	values	
- A	pipeline	is	a	great	way	to	break	a	long	process	into	smaller	steps.
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
fun CoroutineScope.square(numbers: ReceiveChannel<Int>): ReceiveChannel<Int> = produce {
for (x in numbers) send(x * x)
}
Pipelinesfun CoroutineScope.produceNumbers() = produce<Int> {
var x = 1
while (true) send(x++) // infinite stream of integers starting from 1
}
fun CoroutineScope.square(numbers: ReceiveChannel<Int>): ReceiveChannel<Int> = produce {
for (x in numbers) send(x * x)
}
fun pipeline() = runBlocking {
val numbers = produceNumbers() // produces integers from 1 and on
val squares = square(numbers) // squares integers
for (i in 1..5) println(squares.receive()) // print first five
println("Done!") // we are done
coroutineContext.cancelChildren() // cancel children coroutines
}
Select	Expression
Select	expression	makes	it	possible	to	await	multiple	suspending	
functions	simultaneously	and	select	the	Eirst	one	that	becomes	available.	
Select	expressions	are	an	experimental	features.
Select	Expressionsuspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>) {
while (true) {
select<Unit> {
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-second -> 'second'
stream-one -> 'one'
stream-one -> 'one'
stream-one -> 'one'
Unbiased	Select
Select	is	inherently	biased.	If	two	events	happen	at	the	same	time,	it	
will	select	the	Eirst	clause.
val repeats = 10_000
val p1 = producer("A", repeats)
val p2 = producer("B", repeats)
val p3 = producer("C", repeats)
val results = ConcurrentHashMap<String, Int>()
repeat(repeats) {
val result = select<String> {
p1.onReceive { it }
p2.onReceive { it }
p3.onReceive { it }
}
results.compute(result) { k, v ->
if (v == null) {
1
} else {
v + 1
}
}
}
println(results)
{A=8235, B=1620, C=145}
{A=7850, B=2062, C=88}
{A=7878, B=2002, C=120}
{A=8260, B=1648, C=92}
{A=7927, B=2011, C=62}
val repeats = 10_000
val p1 = producer("A", repeats)
val p2 = producer("B", repeats)
val p3 = producer("C", repeats)
val results = ConcurrentHashMap<String, Int>()
repeat(repeats) {
val result = selectUnbiased<String> {
p1.onReceive { it }
p2.onReceive { it }
p3.onReceive { it }
}
results.compute(result) { k, v ->
if (v == null) {
1
} else {
v + 1
}
}
}
println(results)
{A=3336, B=3327, C=3337}
{A=3330, B=3332, C=3338}
{A=3334, B=3333, C=3333}
{A=3334, B=3336, C=3330}
{A=3332, B=3335, C=3333}
Selecting	on	close
val p1 = produce {
repeat(10) {
send("A")
}
}
val p2 = produce {
repeat(5) {
send("B")
}
}
runBlocking {
repeat(15) {
val result = selectUnbiased<String> {
p1.onReceive {
it
}
p2.onReceive {
it
}
}
println(result)
}
}
Selecting	on	close
val p1 = produce {
repeat(10) {
send("A")
}
}
val p2 = produce {
repeat(5) {
send("B")
}
}
runBlocking {
repeat(15) {
val result = selectUnbiased<String> {
p1.onReceiveOrNull {
it
}
p2.onReceiveOrNull {
it
}
}
println(result)
}
}
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Close	()
Close	()
Close	()
app.Close	()
Solution	1	
Add	the	close	
function		to	
every	object
Done	Channel
When	parent	objects	are		closed	and	they	don't	have	coroutine	objects	
which	stored	in	the	children	layer.
App
Scheduler
Jobs		Manager
List	Coroutines
Solution	2	
send	the	close	
signal	directly	to	
all	coroutines
Please	close	for	me	:	)
Done	Channel
suspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>) {
while (true) {
selectUnbiased<Unit> {
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
suspend fun processJob(
streamOne: ReceiveChannel<String>,
streamSecond: ReceiveChannel<String>,
done: Channel<Boolean>
) {
var run = true
while (run) {
selectUnbiased<Unit> {
done.onReceive {
run = false
}
streamOne.onReceive { value ->
println("stream-one -> '$value'")
}
streamSecond.onReceive { value ->
println("stream-second -> '$value'")
}
}
}
println("End")
}
val done = Channel<Boolean>()
val streamOne = streamOne()
val streamSecond = streamSecond()
val job = launch {
processJob(streamOne, streamSecond, done)
}
delay(2000)
println("Stop the job")
done.send(true)
streamOne.cancel()
streamSecond.cancel()
Tee	channel
Sometimes	we	may	want	to	split	values	coming	in	from	a	channel	so	that	
you	can	send	them	off	into	two	separate	areas	of	your	codebase.	
	Example:	we	want	to	take	in	a	stream	of	user	commands	on	a	channel,	
send	them	to	something	that	executes	them,	and	also	send	them	to	
something	that	logs	the	commands	for	later	auditing.
suspend fun tee(
stream: ReceiveChannel<String>,
done: Channel<Boolean>
): Pair<ReceiveChannel<String>, ReceiveChannel<String>> {
val out1 = Channel<String>()
val out2 = Channel<String>()
launch {
var run = true
try {
while (run) {
done.poll()?.let {
run = false
} ?: stream.poll()?.let {
out1.send(it)
out2.send(it)
}
}
} finally {
out1.close()
out2.close()
}
}
return Pair(out1, out2)
}
Others
Fan-in	Fan-out	pattern	
OrDone	channel	
Bridge	channel	
Mutex	
....
Summary
- Coroutine	provides	the	concurrency.	
- We	compose	small	patterns	into	the	larger	one.	
- Reusable	and	composable.
Q&A

Weitere ähnliche Inhalte

Ähnlich wie Concurrency pattern in Kotlin

Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShellBoulos Dib
 
Back to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationBack to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationManuel Bernhardt
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitVaclav Pech
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomyDongmin Yu
 
Full Stack Reactive In Practice
Full Stack Reactive In PracticeFull Stack Reactive In Practice
Full Stack Reactive In PracticeLightbend
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryQConLondon2008
 
Getting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamGetting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamSteve Lee
 
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Fwdays
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS DeobfuscationMinded Security
 
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducePolyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducethumbtacktech
 
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyTues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyAnton Yazovskiy
 
Code is Cool - Products are Better
Code is Cool - Products are BetterCode is Cool - Products are Better
Code is Cool - Products are Betteraaronheckmann
 
Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Eric Sammer
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013aleks-f
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기NAVER D2
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteLeonardo Proietti
 

Ähnlich wie Concurrency pattern in Kotlin (20)

Introduction to PowerShell
Introduction to PowerShellIntroduction to PowerShell
Introduction to PowerShell
 
Back to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migrationBack to the futures, actors and pipes: using Akka for large-scale data migration
Back to the futures, actors and pipes: using Akka for large-scale data migration
 
Pick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruitPick up the low-hanging concurrency fruit
Pick up the low-hanging concurrency fruit
 
Presto anatomy
Presto anatomyPresto anatomy
Presto anatomy
 
Java Annotations and Pre-processing
Java  Annotations and Pre-processingJava  Annotations and Pre-processing
Java Annotations and Pre-processing
 
Full Stack Reactive In Practice
Full Stack Reactive In PracticeFull Stack Reactive In Practice
Full Stack Reactive In Practice
 
Om nom nom nom
Om nom nom nomOm nom nom nom
Om nom nom nom
 
The Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J QueryThe Dom Scripting Toolkit J Query
The Dom Scripting Toolkit J Query
 
Performance tests - it's a trap
Performance tests - it's a trapPerformance tests - it's a trap
Performance tests - it's a trap
 
Getting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstreamGetting Reactive with Cycle.js and xstream
Getting Reactive with Cycle.js and xstream
 
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
Andrii Dembitskyi "Events in our applications Event bus and distributed systems"
 
Advanced JS Deobfuscation
Advanced JS DeobfuscationAdvanced JS Deobfuscation
Advanced JS Deobfuscation
 
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReducePolyglot Persistence in the Real World: Cassandra + S3 + MapReduce
Polyglot Persistence in the Real World: Cassandra + S3 + MapReduce
 
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiyTues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
Tues 115pm cassandra + s3 + hadoop = quick auditing and analytics_yazovskiy
 
Code is Cool - Products are Better
Code is Cool - Products are BetterCode is Cool - Products are Better
Code is Cool - Products are Better
 
Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...Building a system for machine and event-oriented data - Velocity, Santa Clara...
Building a system for machine and event-oriented data - Velocity, Santa Clara...
 
Broadleaf Presents Thymeleaf
Broadleaf Presents ThymeleafBroadleaf Presents Thymeleaf
Broadleaf Presents Thymeleaf
 
Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013Dynamic C++ ACCU 2013
Dynamic C++ ACCU 2013
 
[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기[245] presto 내부구조 파헤치기
[245] presto 내부구조 파헤치기
 
Symfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il clienteSymfony2, creare bundle e valore per il cliente
Symfony2, creare bundle e valore per il cliente
 

Mehr von Thao Huynh Quang

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdfThao Huynh Quang
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed SystemThao Huynh Quang
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Thao Huynh Quang
 
Kotlin Introduction with Android applications
Kotlin Introduction with Android applicationsKotlin Introduction with Android applications
Kotlin Introduction with Android applicationsThao Huynh Quang
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrationsThao Huynh Quang
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence libraryThao Huynh Quang
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh applicationThao Huynh Quang
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to knowThao Huynh Quang
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its applicationThao Huynh Quang
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse EngineeringThao Huynh Quang
 

Mehr von Thao Huynh Quang (16)

2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf2021-03-08-telegram-vs-signal.pdf
2021-03-08-telegram-vs-signal.pdf
 
Consensus and Raft Algorithm in Distributed System
Consensus and  Raft Algorithm in Distributed SystemConsensus and  Raft Algorithm in Distributed System
Consensus and Raft Algorithm in Distributed System
 
Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)Consensus and Raft algorithm (Vietnamese version)
Consensus and Raft algorithm (Vietnamese version)
 
Kotlin Introduction with Android applications
Kotlin Introduction with Android applicationsKotlin Introduction with Android applications
Kotlin Introduction with Android applications
 
Git Introduction with illustrations
Git Introduction with illustrationsGit Introduction with illustrations
Git Introduction with illustrations
 
Android Jetpack: Room persistence library
Android Jetpack: Room persistence libraryAndroid Jetpack: Room persistence library
Android Jetpack: Room persistence library
 
Android Performance Tips
Android Performance TipsAndroid Performance Tips
Android Performance Tips
 
Kubernetes and service mesh application
Kubernetes  and service mesh applicationKubernetes  and service mesh application
Kubernetes and service mesh application
 
Kafka: All an engineer needs to know
Kafka: All an engineer needs to knowKafka: All an engineer needs to know
Kafka: All an engineer needs to know
 
Blockchain introduction
Blockchain introductionBlockchain introduction
Blockchain introduction
 
Observability and its application
Observability and its applicationObservability and its application
Observability and its application
 
GraphQL in Android
GraphQL in AndroidGraphQL in Android
GraphQL in Android
 
Android GRPC
Android GRPCAndroid GRPC
Android GRPC
 
Android Reverse Engineering
Android Reverse EngineeringAndroid Reverse Engineering
Android Reverse Engineering
 
nosql
nosqlnosql
nosql
 
android deep linking
android deep linkingandroid deep linking
android deep linking
 

Kürzlich hochgeladen

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
 
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
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...OnePlan Solutions
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringHironori Washizaki
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureDinusha Kumarasiri
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEEVICTOR MAESTRE RAMIREZ
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsAhmed Mohamed
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfYashikaSharma391629
 
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
 
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
 
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
 
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
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfMarharyta Nedzelska
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfAlina Yurenko
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Matt Ray
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...Akihiro Suda
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROmotivationalword821
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Mater
 
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
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxAndreas Kunz
 

Kürzlich hochgeladen (20)

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
 
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
 
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
Maximizing Efficiency and Profitability with OnePlan’s Professional Service A...
 
Machine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their EngineeringMachine Learning Software Engineering Patterns and Their Engineering
Machine Learning Software Engineering Patterns and Their Engineering
 
Implementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with AzureImplementing Zero Trust strategy with Azure
Implementing Zero Trust strategy with Azure
 
Cloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEECloud Data Center Network Construction - IEEE
Cloud Data Center Network Construction - IEEE
 
Unveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML DiagramsUnveiling Design Patterns: A Visual Guide with UML Diagrams
Unveiling Design Patterns: A Visual Guide with UML Diagrams
 
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdfInnovate and Collaborate- Harnessing the Power of Open Source Software.pdf
Innovate and Collaborate- Harnessing the Power of Open Source Software.pdf
 
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
 
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
 
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
 
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
 
A healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdfA healthy diet for your Java application Devoxx France.pdf
A healthy diet for your Java application Devoxx France.pdf
 
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdfGOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
GOING AOT WITH GRAALVM – DEVOXX GREECE.pdf
 
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
Open Source Summit NA 2024: Open Source Cloud Costs - OpenCost's Impact on En...
 
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
20240415 [Container Plumbing Days] Usernetes Gen2 - Kubernetes in Rootless Do...
 
How To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTROHow To Manage Restaurant Staff -BTRESTRO
How To Manage Restaurant Staff -BTRESTRO
 
Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)Ahmed Motair CV April 2024 (Senior SW Developer)
Ahmed Motair CV April 2024 (Senior SW Developer)
 
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
 
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptxUI5ers live - Custom Controls wrapping 3rd-party libs.pptx
UI5ers live - Custom Controls wrapping 3rd-party libs.pptx
 

Concurrency pattern in Kotlin