SlideShare a Scribd company logo
1 of 143
Download to read offline
Don’t be Homer Simpson 

with your Reactor!
Sergei Egorov, Pivotal
@bsideup
https://simpsonswiki.com/wiki/File:Springfield_Nuclear_Power_Plant_6.png
• Staff Engineer at Pivotal

• Berlin Spring User Group co-organizer

• Testcontainers co-maintainer 🐳
About me
@bsideup
Remember Peter…
With great performance comes…
Remember Peter…
With great performance comes…

great PITA*.
Remember Peter…
* PITA - performance improvement to apps
My first experience with

reactive programming was like…
@bsideup
@bsideup
Mono.fromRunnable()
Mono.fromRunnable()
@bsideup
Mono.fromRunnable()
My code
@bsideup
Mono.fromRunnable()
My code My code
@bsideup
Mono.fromRunnable()
My code My code My code
Work!
@bsideup
Mono.fromRunnable().subscribe()
@bsideup
1 week later…
I agree with Heinrich Apfelmus that the essence
of functional reactive programming is to specify
the dynamic behavior of a value completely at
the time of declaration.
“Reactive Sir”
@bsideup
1 week of production later…
@bsideup
What could go wrong
Whoa #1: exceptions
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
java.lang.IndexOutOfBoundsException: Source emitted more than one item

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(MonoSingle.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:186)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:131)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:123)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
java.lang.IndexOutOfBoundsException: Source emitted more than one item

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(MonoSingle.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:186)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:131)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:123)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
java.lang.IndexOutOfBoundsException: Source emitted more than one item

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(MonoSingle.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:186)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:131)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:123)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Which source?
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
java.lang.IndexOutOfBoundsException: Source emitted more than one item

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(MonoSingle.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:186)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:131)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:123)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Which source?
Where is “com.example.demo” package?
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
java.lang.IndexOutOfBoundsException: Source emitted more than one item

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(MonoSingle.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(MonoSingle.java:94)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.trySchedule(MonoSubscribeOn.java:186)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.onSubscribe(MonoSubscribeOn.java:131)

	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(MonoSingle.java:114)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.run(MonoSubscribeOn.java:123)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Which source?
Where is “com.example.demo” package?
Why they closed Google Inbox? 😭
@bsideup
Assembly vs Subscription
Flux.range(0, 5)
Assembly
@bsideup
Flux.range(0, 5)
.filter(it -> it > 3)
Assembly
@bsideup
Flux.range(0, 5)
.filter(it -> it > 3)
.map(it -> it.toString())
Assembly
@bsideup
Flux.range(0, 5)
.filter(it -> it > 3)
.map(it -> it.toString())
.single()
Assembly
@bsideup
Flux.range(0, 5)
.filter(it -> it > 3)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
Assembly
@bsideup
Flux.range(0, 5)
.filter(it -> it > 3)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.subscribe()
Assembly
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
🐈
current thread parallel-1
* 🐈 = subscriber @bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐈
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐈
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐈
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐈
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐈.onSubscribe( 🐟)
* 🐟= subscription @bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Subscription
current thread parallel-1
🐟.request(max)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(0)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(0)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(0)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(0)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(0)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(1)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(1)
@bsideup
FluxRange
FluxFilter
FluxMap
MonoSingle
MonoSubscribeOn
Execution
current thread parallel-1
🐈.onNext(1)
💥java.lang.IndexOutOfBoundsException: Source emitted more than one item
	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onNext(Mono
	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(Flux
	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxR
	 at reactor.core.publisher.MonoSingle$SingleSubscriber.request(Mono
	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.
	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.
	 at reactor.core.publisher.MonoSingle$SingleSubscriber.onSubscribe(M
	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.MonoSingle.subscribe(MonoSingle.java:58)

	 at reactor.core.publisher.Mono.subscribe(Mono.java:3711)

	 at reactor.core.publisher.MonoSubscribeOn$SubscribeOnSubscriber.
@bsideup
Demo
http://eskipaper.com/homer-jay-simpson-cartoon.html
How ReactorDebugAgent works?
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
@bsideup
// com/example/demo/Example.java
Flux.range(0, 5)
.checkpoint("Example.java:16")
.single()
.checkpoint("Example.java:17")
.subscribeOn(Schedulers.parallel())
.checkpoint(“Example.java:18")
.subscribe();
@bsideup
Demo outcomes
• Use .checkpoint(“something”) to “mark” reactive “milestones”

• Read about Hooks.onOperatorDebug()…

• … but use reactor-tools’ ReactorDebugAgent 😅 (works in prod too)

• https://spring.io/blog/2019/03/06/flight-of-the-flux-1-assembly-vs-
subscription - great article from Simon Basle about the internals
@bsideup
Whoa #2: Blocking calls!
https://blog.tfd.co.uk/2010/10/15/jackrabbit-performance/ @bsideup
How Reactor schedules tasks
@bsideup
Default thread pools
Schedulers.parallel() - N threads, where N matches the CPUs count.

Schedulers.single() - 1 thread handling all submitted tasks

Schedulers.elastic() - dynamic, thread caching pool
@bsideup
Mono.delay(ofSeconds(1))
@bsideup
Mono.delay(ofSeconds(1))
Mono.delay(ofSeconds(1), Schedulers.parallel())
@bsideup
Mono.delay(ofSeconds(1))
Mono.delay(ofSeconds(1), Schedulers.parallel())
💡Every non-instant operation 

runs on the parallel scheduler

by default!
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Non-blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Non-blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Non-blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Non-blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
🤩
Non-blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
😭
Blocking execution
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
😭
Blocking execution
⚠ no more tasks scheduled 

until this task returns
@bsideup
How to fix?
Project Loom
@bsideup
@bsideup
Use non-blocking APIs, or…
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
@bsideup
parallel-1
parallel-2
parallel-3
parallel-4
Custom thread pool!
custom-1
custom-2
👍
@bsideup
Demo
http://eskipaper.com/homer-jay-simpson-cartoon.html
How BlockHound works?
@bsideup
public class Thread implements Runnable {
public static native void sleep(long millis);
}
@bsideup
public class Thread implements Runnable {
private static native void $$BlockHound$$_sleep(long millis);
public static void sleep(long millis) {
$$BlockHound$$_sleep(millis);
}
}
@bsideup
public class Thread implements Runnable {
private static native void $$BlockHound$$_sleep(long millis);
public static void sleep(long millis) {
reactor.BlockHoundRuntime.checkBlocking(
"java.lang.Thread",
"sleep",
/*method modifiers*/
);
$$BlockHound$$_sleep(millis);
}
}
@bsideup
public class Thread implements Runnable {
private static native void $$BlockHound$$_sleep(long millis);
public static void sleep(long millis) {
reactor.BlockHoundRuntime.checkBlocking(
"java.lang.Thread",
"sleep",
/*method modifiers*/
);
$$BlockHound$$_sleep(millis);
}
}
@bsideup
Blocking check
@bsideup
Blocking check
1. Get or tag the current thread

• JVMTI’s built-in mechanism to tag objects, calls nonBlockingThreadPredicate on
creation and caches the result forever
@bsideup
Blocking check
1. Get or tag the current thread

• JVMTI’s built-in mechanism to tag objects, calls nonBlockingThreadPredicate on
creation and caches the result forever
2. Is it non-blocking? (the predicate returns “true”)

• Very fast, O(1) check
@bsideup
Blocking check
1. Get or tag the current thread

• JVMTI’s built-in mechanism to tag objects, calls nonBlockingThreadPredicate on
creation and caches the result forever
2. Is it non-blocking? (the predicate returns “true”)

• Very fast, O(1) check
3. Walk the stacktrace until a frame marked with (dis)allowBlockingCallsInside
• Makes it possible to whitelist loggers and other non-harmful blocking calls
@bsideup
Stack
@bsideup
	 at sun.misc.Unsafe.park(Unsafe.java)

	 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)

	 at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)

	 at com.example.demo.BlockingCodeTest.lambda$testBlockingCode$1(BlockingCodeTest.java:24)

	 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onNext(FluxSubscribeOn.java:151)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.Flux.subscribe(Flux.java:7800)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)

	 at reactor.core.scheduler.ReactorBlockHoundIntegration$Wrapper.run(ReactorBlockHoundIntegration.java:56)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Stack
@bsideup
	 at sun.misc.Unsafe.park(Unsafe.java)

	 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)

	 at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)

	 at com.example.demo.BlockingCodeTest.lambda$testBlockingCode$1(BlockingCodeTest.java:24)

	 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onNext(FluxSubscribeOn.java:151)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.Flux.subscribe(Flux.java:7800)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)

	 at reactor.core.scheduler.ReactorBlockHoundIntegration$Wrapper.run(ReactorBlockHoundIntegration.java:56)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Stack
@bsideup
	 at sun.misc.Unsafe.park(Unsafe.java)

	 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)

	 at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)

	 at com.example.demo.BlockingCodeTest.lambda$testBlockingCode$1(BlockingCodeTest.java:24)

	 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onNext(FluxSubscribeOn.java:151)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.Flux.subscribe(Flux.java:7800)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)

	 at reactor.core.scheduler.ReactorBlockHoundIntegration$Wrapper.run(ReactorBlockHoundIntegration.java:56)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Stack
@bsideup
	 at sun.misc.Unsafe.park(Unsafe.java)

	 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)

	 at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)

	 at com.example.demo.BlockingCodeTest.lambda$testBlockingCode$1(BlockingCodeTest.java:24)

	 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onNext(FluxSubscribeOn.java:151)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.Flux.subscribe(Flux.java:7800)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)

	 at reactor.core.scheduler.ReactorBlockHoundIntegration$Wrapper.run(ReactorBlockHoundIntegration.java:56)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
Stack
@bsideup
	 at sun.misc.Unsafe.park(Unsafe.java)

	 at java.util.concurrent.locks.LockSupport.park(LockSupport.java:175)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.parkAndCheckInterrupt(AbstractQueuedSynchronizer.java:836)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.doAcquireSharedInterruptibly(AbstractQueuedSynchronizer.java:997)

	 at java.util.concurrent.locks.AbstractQueuedSynchronizer.acquireSharedInterruptibly(AbstractQueuedSynchronizer.java:1304)

	 at java.util.concurrent.CountDownLatch.await(CountDownLatch.java:231)

	 at com.example.demo.BlockingCodeTest.lambda$testBlockingCode$1(BlockingCodeTest.java:24)

	 at reactor.core.publisher.FluxMap$MapSubscriber.onNext(FluxMap.java:100)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onNext(FluxSubscribeOn.java:151)

	 at reactor.core.publisher.FluxRange$RangeSubscription.fastPath(FluxRange.java:129)

	 at reactor.core.publisher.FluxRange$RangeSubscription.request(FluxRange.java:107)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.requestUpstream(FluxSubscribeOn.java:131)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.onSubscribe(FluxSubscribeOn.java:124)

	 at reactor.core.publisher.FluxRange.subscribe(FluxRange.java:68)

	 at reactor.core.publisher.Flux.subscribe(Flux.java:7800)

	 at reactor.core.publisher.FluxSubscribeOn$SubscribeOnSubscriber.run(FluxSubscribeOn.java:194)

	 at reactor.core.scheduler.ReactorBlockHoundIntegration$Wrapper.run(ReactorBlockHoundIntegration.java:56)
	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:84)

	 at reactor.core.scheduler.WorkerTask.call(WorkerTask.java:37)

	 at java.util.concurrent.FutureTask.run(FutureTask.java:266)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$201(ScheduledThreadPoolExecutor.java:180)

	 at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:293)

	 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)

	 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)

	 at java.lang.Thread.run(Thread.java:748)
💥
Schedulers.onScheduleHook("BlockHound", Wrapper::new);
builder.disallowBlockingCallsInside(Wrapper.class.getName(), "run");
Stack
@bsideup
	 at java.io.FileOutputStream.writeBytes(FileOutputStream.java)
Stack
@bsideup
	 at java.io.FileOutputStream.writeBytes(FileOutputStream.java)

	 at java.io.FileOutputStream.write(FileOutputStream.java:326)

	 at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)

	 at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)

	 at java.io.PrintStream.write(PrintStream.java:482)

	 at java.io.FilterOutputStream.write(FilterOutputStream.java:97)
Stack
@bsideup
	 at java.io.FileOutputStream.writeBytes(FileOutputStream.java)

	 at java.io.FileOutputStream.write(FileOutputStream.java:326)

	 at java.io.BufferedOutputStream.flushBuffer(BufferedOutputStream.java:82)

	 at java.io.BufferedOutputStream.flush(BufferedOutputStream.java:140)

	 at java.io.PrintStream.write(PrintStream.java:482)

	 at java.io.FilterOutputStream.write(FilterOutputStream.java:97)

	 at ch.qos.logback.core.joran.spi.ConsoleTarget$1.write(ConsoleTarget.java:37)

	 at ch.qos.logback.core.OutputStreamAppender.writeBytes(OutputStreamAppender.java:199)

	 at ch.qos.logback.core.OutputStreamAppender.subAppend(OutputStreamAppender.java:231)

	 at ch.qos.logback.core.OutputStreamAppender.append(OutputStreamAppender.java:102)

	 at ch.qos.logback.core.UnsynchronizedAppenderBase.doAppend(UnsynchronizedAppenderBase.java:84)

	 at ch.qos.logback.core.spi.AppenderAttachableImpl.appendLoopOnAppenders(AppenderAttachableImpl.java:51)

	 at ch.qos.logback.classic.Logger.appendLoopOnAppenders(Logger.java:270)

	 at ch.qos.logback.classic.Logger.callAppenders(Logger.java:257)
👍
builder.allowBlockingCallsInside(
“ch.qos.logback.classic.Logger",
“callAppenders"
);
Demo outcomes
• Blocking calls are bad, m’kay?

• They may sneak into your production system
• Use https://github.com/reactor/BlockHound to detect them

• Supports multiple frameworks (Reactor, RxJava, etc)

• … and maybe even Kotlin: 

https://github.com/Kotlin/kotlinx.coroutines/issues/1031

• Use a dedicated pool for the necessary blocking calls, or schedule them on
the Schedulers.elastic() built-in pool if they happen rarely
@bsideup
“I use async APIs and I am safe!”
Yeah… sure.
Or…
Are you sure?
KafkaProducer#send(ProducerRecord,Callback)
@bsideup
KafkaProducer#send(ProducerRecord,Callback)
“Asynchronously send a record to a topic and invoke the provided
callback when the send has been acknowledged.” - Javadoc
@bsideup
KafkaProducer#send(ProducerRecord,Callback)
“Asynchronously send a record to a topic and invoke the provided
callback when the send has been acknowledged.” - Javadoc
java.lang.Error: Blocking call! java.lang.Object#wait

	 at reactor.BlockHound$Builder.lambda$new$0(BlockHound.java:154)

	 at reactor.BlockHound$Builder.lambda$install$8(BlockHound.java:254)

	 at reactor.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:43)

	 at java.lang.Object.wait(Object.java)

	 at org.apache.kafka.clients.Metadata.awaitUpdate(Metadata.java:181)

	 at org.apache.kafka.clients.producer.KafkaProducer.waitOnMetadata(KafkaProducer.java:938)

	 at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:823)

	 at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:803)
@bsideup
KafkaProducer#send(ProducerRecord,Callback)
“Asynchronously send a record to a topic and invoke the provided
callback when the send has been acknowledged.” - Javadoc
java.lang.Error: Blocking call! java.lang.Object#wait

	 at reactor.BlockHound$Builder.lambda$new$0(BlockHound.java:154)

	 at reactor.BlockHound$Builder.lambda$install$8(BlockHound.java:254)

	 at reactor.BlockHoundRuntime.checkBlocking(BlockHoundRuntime.java:43)

	 at java.lang.Object.wait(Object.java)

	 at org.apache.kafka.clients.Metadata.awaitUpdate(Metadata.java:181)

	 at org.apache.kafka.clients.producer.KafkaProducer.waitOnMetadata(KafkaProducer.java:938)

	 at org.apache.kafka.clients.producer.KafkaProducer.doSend(KafkaProducer.java:823)

	 at org.apache.kafka.clients.producer.KafkaProducer.send(KafkaProducer.java:803)
https://issues.apache.org/jira/browse/KAFKA-3539
@bsideup
long remainingWaitMs = maxWaitMs;
long elapsed;
// Issue metadata requests until we have metadata for the topic or maxWaitTimeMs is exceeded.
// In case we already have cached metadata for the topic, but the requested partition is greater
// than expected, issue an update request only once. This is necessary in case the metadata
// is stale and the number of partitions for this topic has increased in the meantime.
do {
log.trace("Requesting metadata update for topic {}.", topic);
metadata.add(topic);
int version = metadata.requestUpdate();
sender.wakeup();
try {
metadata.awaitUpdate(version, remainingWaitMs);
} catch (TimeoutException ex) {
// Rethrow with original maxWaitMs to prevent logging exception with remainingWaitMs
throw new TimeoutException("Failed to update metadata after " + maxWaitMs + " ms.");
}
cluster = metadata.fetch();
elapsed = time.milliseconds() - begin;
if (elapsed >= maxWaitMs)
throw new TimeoutException("Failed to update metadata after " + maxWaitMs + " ms.");
if (cluster.unauthorizedTopics().contains(topic))
throw new TopicAuthorizationException(topic);
remainingWaitMs = maxWaitMs - elapsed;
partitionsCount = cluster.partitionCountForTopic(topic);
} while (partitionsCount == null);
waitOnMetadata(record.topic(), record.partition(), maxBlockTimeMs);
Default is “60 seconds”
@bsideup
@bsideup
How to instrument Reactor
Schedulers.onScheduleHook(fn)
@bsideup
Schedulers.onScheduleHook(fn)
@bsideup
Schedulers.onScheduleHook("myHook", runnable -> {
println("Before every scheduled runnable");
return () -> {
println("Before execution");
runnable.run();
println("After execution");
};
});
Schedulers.onScheduleHook(fn)
@bsideup
Schedulers.onScheduleHook("mdc", runnable -> {
String userId = MDC.get("userId");
return () -> {
MDC.put("userId", userId);
try {
runnable.run();
} finally {
MDC.remove("userId");
}
};
});
Hooks.onEachOperator(fn)
@bsideup
Flux.range(0, 5)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
Hooks.onEachOperator(fn)
@bsideup
Flux.range(0, 5)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
Hooks.onEachOperator(fn)
@bsideup
Flux.range(0, 5)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
.transform(fn)
.transform(fn)
.transform(fn)
.transform(fn)
Hooks.onLastOperator(fn)
@bsideup
Flux.range(0, 5)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.subscribe();
Hooks.onLastOperator(fn)
@bsideup
Flux.range(0, 5)
.map(it -> it.toString())
.single()
.subscribeOn(Schedulers.parallel())
.transform(fn)
.subscribe();
Your Reactor should be like:
https://9gag.com/gag/aqKWPwY
Takeaways
• https://github.com/reactor/reactor-tools
• Flux#checkpoint() / Flux#log()
• Hooks class
• https://github.com/reactor/BlockHound
• Async APIs - trust, but verify
@bsideup
@bsideup
bsideup

More Related Content

What's hot

Apache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision TreeApache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision TreeSlim Baltagi
 
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...HostedbyConfluent
 
Common issues with Apache Kafka® Producer
Common issues with Apache Kafka® ProducerCommon issues with Apache Kafka® Producer
Common issues with Apache Kafka® Producerconfluent
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Heo Seungwook
 
Fifth Elephant Apache Atlas Talk
Fifth Elephant Apache Atlas TalkFifth Elephant Apache Atlas Talk
Fifth Elephant Apache Atlas TalkVimal Sharma
 
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くしたNginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くしたtoshi_pp
 
Understanding and programming the SharePoint REST API
Understanding and programming the SharePoint REST APIUnderstanding and programming the SharePoint REST API
Understanding and programming the SharePoint REST APIChris Beckett
 
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...HostedbyConfluent
 
Running Kafka as a Native Binary Using GraalVM with Ozan Günalp
Running Kafka as a Native Binary Using GraalVM with Ozan GünalpRunning Kafka as a Native Binary Using GraalVM with Ozan Günalp
Running Kafka as a Native Binary Using GraalVM with Ozan GünalpHostedbyConfluent
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsJonas Bonér
 
Kafka Intro With Simple Java Producer Consumers
Kafka Intro With Simple Java Producer ConsumersKafka Intro With Simple Java Producer Consumers
Kafka Intro With Simple Java Producer ConsumersJean-Paul Azar
 
KeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてKeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてHiroyuki Wada
 
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...HostedbyConfluent
 
Taking advantage of Prometheus relabeling
Taking advantage of Prometheus relabelingTaking advantage of Prometheus relabeling
Taking advantage of Prometheus relabelingJulien Pivotto
 

What's hot (20)

Apache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision TreeApache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
Apache Kafka vs RabbitMQ: Fit For Purpose / Decision Tree
 
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...
Highly Available Kafka Consumers and Kafka Streams on Kubernetes with Adrian ...
 
Common issues with Apache Kafka® Producer
Common issues with Apache Kafka® ProducerCommon issues with Apache Kafka® Producer
Common issues with Apache Kafka® Producer
 
Vertx
VertxVertx
Vertx
 
Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍Ipv6 소켓프로그래밍
Ipv6 소켓프로그래밍
 
Fifth Elephant Apache Atlas Talk
Fifth Elephant Apache Atlas TalkFifth Elephant Apache Atlas Talk
Fifth Elephant Apache Atlas Talk
 
OAuth 2.0のResource Serverの作り方
OAuth 2.0のResource Serverの作り方OAuth 2.0のResource Serverの作り方
OAuth 2.0のResource Serverの作り方
 
Modular Monoliths with Nx
Modular Monoliths with NxModular Monoliths with Nx
Modular Monoliths with Nx
 
Apache Kafka Security
Apache Kafka Security Apache Kafka Security
Apache Kafka Security
 
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くしたNginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
NginxとLuaを用いた動的なリバースプロキシでデプロイを 100 倍速くした
 
Machine Learning in the IoT with Apache NiFi
Machine Learning in the IoT with Apache NiFiMachine Learning in the IoT with Apache NiFi
Machine Learning in the IoT with Apache NiFi
 
Understanding and programming the SharePoint REST API
Understanding and programming the SharePoint REST APIUnderstanding and programming the SharePoint REST API
Understanding and programming the SharePoint REST API
 
NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話NGINXをBFF (Backend for Frontend)として利用した話
NGINXをBFF (Backend for Frontend)として利用した話
 
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...
Restoring Restoration's Reputation in Kafka Streams with Bruno Cadonna & Luca...
 
Running Kafka as a Native Binary Using GraalVM with Ozan Günalp
Running Kafka as a Native Binary Using GraalVM with Ozan GünalpRunning Kafka as a Native Binary Using GraalVM with Ozan Günalp
Running Kafka as a Native Binary Using GraalVM with Ozan Günalp
 
Scalability, Availability & Stability Patterns
Scalability, Availability & Stability PatternsScalability, Availability & Stability Patterns
Scalability, Availability & Stability Patterns
 
Kafka Intro With Simple Java Producer Consumers
Kafka Intro With Simple Java Producer ConsumersKafka Intro With Simple Java Producer Consumers
Kafka Intro With Simple Java Producer Consumers
 
KeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについてKeycloakのDevice Flow、CIBAについて
KeycloakのDevice Flow、CIBAについて
 
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
Building an Interactive Query Service in Kafka Streams With Bill Bejeck | Cur...
 
Taking advantage of Prometheus relabeling
Taking advantage of Prometheus relabelingTaking advantage of Prometheus relabeling
Taking advantage of Prometheus relabeling
 

Similar to Don’t be Homer Simpson 
with your Reactor!

The Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane MaldiniThe Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane MaldiniVMware Tanzu
 
How to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsHow to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsJarrod Overson
 
Code transformation With Spoon
Code transformation With SpoonCode transformation With Spoon
Code transformation With SpoonGérard Paligot
 
SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진VMware Tanzu Korea
 
Write code that writes code! A beginner's guide to Annotation Processing - Ja...
Write code that writes code! A beginner's guide to Annotation Processing - Ja...Write code that writes code! A beginner's guide to Annotation Processing - Ja...
Write code that writes code! A beginner's guide to Annotation Processing - Ja...DroidConTLV
 
Write code that writes code!
Write code that writes code!Write code that writes code!
Write code that writes code!Jason Feinstein
 
Drilling the Async Library
Drilling the Async LibraryDrilling the Async Library
Drilling the Async LibraryKnoldus Inc.
 
A new execution model for Nashorn in Java 9
A new execution model for Nashorn in Java 9A new execution model for Nashorn in Java 9
A new execution model for Nashorn in Java 9Marcus Lagergren
 
Being Reactive with Spring
Being Reactive with SpringBeing Reactive with Spring
Being Reactive with SpringKris Galea
 
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)Smash the Stack: Writing a Buffer Overflow Exploit (Win32)
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)Elvin Gentiles
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisRuslan Shevchenko
 
CPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolsCPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolscharsbar
 
Reactive programming with tracker
Reactive programming with trackerReactive programming with tracker
Reactive programming with trackerDesignveloper
 
Spark Summit EU talk by Nimbus Goehausen
Spark Summit EU talk by Nimbus GoehausenSpark Summit EU talk by Nimbus Goehausen
Spark Summit EU talk by Nimbus GoehausenSpark Summit
 
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"Daniel Bryant
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptJohn Stevenson
 
Python, async web frameworks, and MongoDB
Python, async web frameworks, and MongoDBPython, async web frameworks, and MongoDB
Python, async web frameworks, and MongoDBemptysquare
 
Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用Qiangning Hong
 

Similar to Don’t be Homer Simpson 
with your Reactor! (20)

The Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane MaldiniThe Value of Reactive Design - Stéphane Maldini
The Value of Reactive Design - Stéphane Maldini
 
How to Reverse Engineer Web Applications
How to Reverse Engineer Web ApplicationsHow to Reverse Engineer Web Applications
How to Reverse Engineer Web Applications
 
Code transformation With Spoon
Code transformation With SpoonCode transformation With Spoon
Code transformation With Spoon
 
SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진SpringOne Platform recap 정윤진
SpringOne Platform recap 정윤진
 
Write code that writes code! A beginner's guide to Annotation Processing - Ja...
Write code that writes code! A beginner's guide to Annotation Processing - Ja...Write code that writes code! A beginner's guide to Annotation Processing - Ja...
Write code that writes code! A beginner's guide to Annotation Processing - Ja...
 
Write code that writes code!
Write code that writes code!Write code that writes code!
Write code that writes code!
 
Drilling the Async Library
Drilling the Async LibraryDrilling the Async Library
Drilling the Async Library
 
A new execution model for Nashorn in Java 9
A new execution model for Nashorn in Java 9A new execution model for Nashorn in Java 9
A new execution model for Nashorn in Java 9
 
Being Reactive with Spring
Being Reactive with SpringBeing Reactive with Spring
Being Reactive with Spring
 
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)Smash the Stack: Writing a Buffer Overflow Exploit (Win32)
Smash the Stack: Writing a Buffer Overflow Exploit (Win32)
 
Why scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with thisWhy scala is not my ideal language and what I can do with this
Why scala is not my ideal language and what I can do with this
 
CPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its toolsCPANTS: Kwalitative website and its tools
CPANTS: Kwalitative website and its tools
 
Reactive programming with tracker
Reactive programming with trackerReactive programming with tracker
Reactive programming with tracker
 
Spark Summit EU talk by Nimbus Goehausen
Spark Summit EU talk by Nimbus GoehausenSpark Summit EU talk by Nimbus Goehausen
Spark Summit EU talk by Nimbus Goehausen
 
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"
J1 2015 "Debugging Java Apps in Containers: No Heavy Welding Gear Required"
 
Php resque
Php resquePhp resque
Php resque
 
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in ClojurescriptProgscon 2017: Taming the wild fronteer - Adventures in Clojurescript
Progscon 2017: Taming the wild fronteer - Adventures in Clojurescript
 
Wait, IPython can do that?
Wait, IPython can do that?Wait, IPython can do that?
Wait, IPython can do that?
 
Python, async web frameworks, and MongoDB
Python, async web frameworks, and MongoDBPython, async web frameworks, and MongoDB
Python, async web frameworks, and MongoDB
 
Python在豆瓣的应用
Python在豆瓣的应用Python在豆瓣的应用
Python在豆瓣的应用
 

More from VMware Tanzu

What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItVMware Tanzu
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023VMware Tanzu
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleVMware Tanzu
 
Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023VMware Tanzu
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductVMware Tanzu
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready AppsVMware Tanzu
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And BeyondVMware Tanzu
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023VMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023VMware Tanzu
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptxVMware Tanzu
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchVMware Tanzu
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishVMware Tanzu
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVMware Tanzu
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - FrenchVMware Tanzu
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023VMware Tanzu
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootVMware Tanzu
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerVMware Tanzu
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeVMware Tanzu
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsVMware Tanzu
 

More from VMware Tanzu (20)

What AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About ItWhat AI Means For Your Product Strategy And What To Do About It
What AI Means For Your Product Strategy And What To Do About It
 
Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023Make the Right Thing the Obvious Thing at Cardinal Health 2023
Make the Right Thing the Obvious Thing at Cardinal Health 2023
 
Enhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at ScaleEnhancing DevEx and Simplifying Operations at Scale
Enhancing DevEx and Simplifying Operations at Scale
 
Spring Update | July 2023
Spring Update | July 2023Spring Update | July 2023
Spring Update | July 2023
 
Platforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a ProductPlatforms, Platform Engineering, & Platform as a Product
Platforms, Platform Engineering, & Platform as a Product
 
Building Cloud Ready Apps
Building Cloud Ready AppsBuilding Cloud Ready Apps
Building Cloud Ready Apps
 
Spring Boot 3 And Beyond
Spring Boot 3 And BeyondSpring Boot 3 And Beyond
Spring Boot 3 And Beyond
 
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdfSpring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
Spring Cloud Gateway - SpringOne Tour 2023 Charles Schwab.pdf
 
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
Simplify and Scale Enterprise Apps in the Cloud | Boston 2023
 
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
Simplify and Scale Enterprise Apps in the Cloud | Seattle 2023
 
tanzu_developer_connect.pptx
tanzu_developer_connect.pptxtanzu_developer_connect.pptx
tanzu_developer_connect.pptx
 
Tanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - FrenchTanzu Virtual Developer Connect Workshop - French
Tanzu Virtual Developer Connect Workshop - French
 
Tanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - EnglishTanzu Developer Connect Workshop - English
Tanzu Developer Connect Workshop - English
 
Virtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - EnglishVirtual Developer Connect Workshop - English
Virtual Developer Connect Workshop - English
 
Tanzu Developer Connect - French
Tanzu Developer Connect - FrenchTanzu Developer Connect - French
Tanzu Developer Connect - French
 
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
Simplify and Scale Enterprise Apps in the Cloud | Dallas 2023
 
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring BootSpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
SpringOne Tour: Deliver 15-Factor Applications on Kubernetes with Spring Boot
 
SpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software EngineerSpringOne Tour: The Influential Software Engineer
SpringOne Tour: The Influential Software Engineer
 
SpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs PracticeSpringOne Tour: Domain-Driven Design: Theory vs Practice
SpringOne Tour: Domain-Driven Design: Theory vs Practice
 
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense SolutionsSpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
SpringOne Tour: Spring Recipes: A Collection of Common-Sense Solutions
 

Recently uploaded

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
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesŁukasz Chruściel
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceBrainSell Technologies
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmSujith Sukumaran
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfFerryKemperman
 
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
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWave PLM
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作qr0udbr0
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commercemanigoyal112
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based projectAnoyGreter
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptrcbcrtm
 
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
 
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
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样umasea
 
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
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfkalichargn70th171
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Cizo Technology Services
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Natan Silnitsky
 

Recently uploaded (20)

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
 
Unveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New FeaturesUnveiling the Future: Sylius 2.0 New Features
Unveiling the Future: Sylius 2.0 New Features
 
CRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. SalesforceCRM Contender Series: HubSpot vs. Salesforce
CRM Contender Series: HubSpot vs. Salesforce
 
Intelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalmIntelligent Home Wi-Fi Solutions | ThinkPalm
Intelligent Home Wi-Fi Solutions | ThinkPalm
 
Introduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdfIntroduction Computer Science - Software Design.pdf
Introduction Computer Science - Software Design.pdf
 
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
 
What is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need ItWhat is Fashion PLM and Why Do You Need It
What is Fashion PLM and Why Do You Need It
 
英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作英国UN学位证,北安普顿大学毕业证书1:1制作
英国UN学位证,北安普顿大学毕业证书1:1制作
 
Cyber security and its impact on E commerce
Cyber security and its impact on E commerceCyber security and its impact on E commerce
Cyber security and its impact on E commerce
 
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort ServiceHot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
Hot Sexy call girls in Patel Nagar🔝 9953056974 🔝 escort Service
 
MYjobs Presentation Django-based project
MYjobs Presentation Django-based projectMYjobs Presentation Django-based project
MYjobs Presentation Django-based project
 
cpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.pptcpct NetworkING BASICS AND NETWORK TOOL.ppt
cpct NetworkING BASICS AND NETWORK TOOL.ppt
 
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
 
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...
 
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
办理学位证(UQ文凭证书)昆士兰大学毕业证成绩单原版一模一样
 
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
 
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdfExploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
Exploring Selenium_Appium Frameworks for Seamless Integration with HeadSpin.pdf
 
Odoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting ServiceOdoo Development Company in India | Devintelle Consulting Service
Odoo Development Company in India | Devintelle Consulting Service
 
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
Global Identity Enrolment and Verification Pro Solution - Cizo Technology Ser...
 
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
Taming Distributed Systems: Key Insights from Wix's Large-Scale Experience - ...
 

Don’t be Homer Simpson 
with your Reactor!