SlideShare a Scribd company logo
1 of 78
AKKA.NET STREAMS
AND REACTIVE STREAMS
INTRODUCTION
Bartosz Sypytkowski
▪ @Horusiath
▪ b.sypytkowski@gmail.com
▪ bartoszsypytkowski.com
 Observables, AsyncEnumerable
 Reactive Streams
 Akka.Streams for building workflows
 Doing I/O
 Evensourcing with Akka.Streams
 Future?
AGENDA
OBSERVABLES
public interface IObserver<in T>
{
void OnNext(T item);
void OnError(Exception e);
void OnCompleted();
}
public interface IObservable<out T>
{
IDisposable Subscribe(
IObserver<T> observer);
}
OBSERVABLES STAGESTAGE
OnNext(T)
PROBLEM
NO BACKPRESSURE
OBSERVABLES STAGESTAGE
OnNext(T)
100 RPS 10 RPS
ASYNC
ENUMERABLES
public interface IAsyncEnumerable<out T>
{
IAsyncEnumerator<T> GetAsyncEnumerator();
}
public interface IAsyncEnumerator<out T> :
IAsyncDisposable
{
T Current { get; }
ValueTask<bool> MoveNextAsync();
}
public interface IAsyncDisposable
{
ValueTask DisposeAsync();
}
ASYNC
ENUMERABLE
PULLING
STAGESTAGE
MoveNext
(Value)Task<T>
WHAT IF REQUESTS ARE
EXPENSIVE?
ASYNC
ENUMERABLE
OVER I/O
STAGESTAGE
I/O
JUST USE BUFFERING
ASYNC
ENUMERABLE
OVER I/O
STAGESTAGE
I/O
BUFFER
BUFFER
PROBLEM
THIS SH**T DOES NOT COMPOSE
ASYNC
ENUMERABLE
PROBLEM WITH CAPACITY
PROPAGATION
STAGE
Buffer[M]
STAGE
Buffer[N]
STAGE
Buffer[K]
What is the M?
REACTIVE
STREAMS
public interface ISubscription
{
void Request(long demand);
void Cancel();
}
public interface ISubscriber<in T>
{
void OnSubscribe(ISubscription s);
void OnNext(T item);
void OnError(Exception e);
void OnComplete();
}
public interface IPublisher<out T>
{
void Subscribe(ISubscriber<T> s);
}
public interface IProcessor<in TIn, out TOut> :
ISubscriber<TIn>, IPublisher<TOut>
{ }
REACTIVE
STREAMS
DEMAND AS PART OF
PROTOCOL
STAGE
Buffer[M]
STAGE
Buffer[N]
Demand(M)
Send(X)
REACTIVE
STREAMS
DEMAND PROPAGATION
STAGE
50 RPS
Req(30)
STAGE
20 RPS
STAGE
30 RPS
Req(20)
REACTIVE
STREAMS
DEMAND COMPOSITION
SCALLING
30 RPS
30 RPS
50 RPS
50 RPS
50 RPS
Req(30)
Req(30)
Req(20)
Req(20)
Req(20)
REACTIVE STREAMS ARE
UNIVERSALLY COMPOSABLE
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
OnNext
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
OnNext
Request(2)
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
OnNext
Request(2)
OnNext
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
OnNext
Request(2)
OnNext
OnNext
REACTIVE
STREAMS
Publisher Subscriber
Subscribe
OnSubscribe
Request(3)
OnNext
OnNext
Request(2)
OnNext
OnNext
OnComplete
OBSERVABLES
AS REACTIVE STREAMS
AS REACTIVE STREAMS
OBSERVABLES
Publisher Subscriber
Subscribe
OnSubscribe
Request(long.MaxValue)
OnNext
OnNext
OnNext
OnNext
OnComplete
ASYNC ENUMERABLES
AS REACTIVE STREAMS
AS REACTIVE STREAMS
ASYNC
ENUMERABLES
Publisher Subscriber
Subscribe
OnSubscribe
Request(1)
OnNext
OnNext
OnComplete
Request(1)
Request(1)
BUT… WE COULD IMPLEMENT
THIS SOLUTION USING TASKS
WE COULD IMPLEMENT
TASKS USING THIS SOLUTION
AS REACTIVE STREAMS
TASKS
Publisher Subscriber
Subscribe
OnSubscribe
Request(1)
OnNext
OnComplete
RSOCKET
REACTIVE STREAMS OVER THE NETWORK
REACTIVE.STREAMS.TCK
TEST COMPATIBILITY KIT
AKKA.NET STREAMS
WHERE ACTORS AND STREAMS COLLIDE
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
Producer of events
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
Consumer of events
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
Materialized values aka. results
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
Graph evaluation
AKKA.NET STREAMS
CORE CONCEPTS
Source<TIn, M> Flow<TIn, TOut, M> Sink<TOut, M>
AKKA.NET STREAMS
CORE CONCEPTS
Source<TIn, M> Flow<TIn, TOut, M> Sink<TOut, M>
Only produces data
AKKA.NET STREAMS
CORE CONCEPTS
Source<TIn, M> Flow<TIn, TOut, M> Sink<TOut, M>
Transforms data
AKKA.NET STREAMS
CORE CONCEPTS
Source<TIn, M> Flow<TIn, TOut, M> Sink<TOut, M>
Only consumes data
AKKA.NET STREAMS
CORE CONCEPTS
Source<TIn, M> Flow<TIn, TOut, M> Sink<TOut, M>
RunnableGraph<M>
AKKA.NET
STREAMS
101 Source<Seller, NotUsed> source = GetSource(ConnectionString);
Sink<Tuple<string, long>, Task> sink =
Sink.ForEach<Tuple<string, long>>(x =>
Console.WriteLine($"{x.Item2}t{x.Item1}"));
await source
.Collect(seller => seller.name)
.ZipWithIndex()
.ToMaterialized(sink, Keep.Right)
.Run(materializer);
RunnableGraph<Task>
MATERIALIZATION
USING AKKA.NET INTERFACES
RunnableGraph<M>
+
IMaterializer
=>
Materialized Value
MATERIALIZATION
USING .NET INTERFACES
IQueryable<T>
+
QueryProvider
=>
Materialized Value
PROBLEMS WITH
QUERYABLE
MATERIALIZATION
1. Implicit query provider =
accidental materialization
var sellerPage = (
from seller in dbContext.Sellers
orderby seller.SellerId
select seller)
.ToList()
.Skip(page * PageSize).Take(PageSize);
PROBLEMS WITH
QUERYABLE
MATERIALIZATION
1. Implicit query provider =
accidental materialization
2. No materialized value = hard
to get multiple results
var sellerPage = await (
from seller in dbContext.Sellers
orderby seller.SellerId
select seller)
.Skip(page * PageSize).Take(PageSize)
.ToListAsync();
var total = await
dbContext.Sellers.CountAsync();
WHY USE THAT INSTEAD OF
TPL DATAFLOW?
1. Imperative
2. Most common composition
primitives.
AKKA.NET
STREAMS
TPL DATAFLOW
1. Declarative (like LINQ)
2. Ton of utility functions
(batching, rate limiting etc.)
3. Universal abstraction
BUT IS IT FAST?
ALSO REMEMBER
THERE ARE LIES, BIG LIES AND BENCHMARKS
WANT TO BE SURE? TRY IT FOR YOURSELF
AKKA.NET
STREAMS
TESTING
public class PulseSpec : Akka.TestKit.Xunit2.TestKit
{
private readonly TimeSpan _pulseInterval = TimeSpan.FromMilliseconds(20);
[Fact]
public async Task Pulse_should_signal_demand_once_every_interval()
{
var (probe, task) = this.SourceProbe<int>()
.Via(new Pulse<int>(_pulseInterval))
.ToMaterialized(Sink.Seq<int>(), Keep.Both)
.Run(Sys.Materializer());
probe.SendNext(1);
probe.ExpectNoMsg(_pulseInterval);
probe.SendNext(2);
probe.ExpectNoMsg(_pulseInterval);
probe.SendComplete();
var result = await task;
result.ShouldBeEquivalentTo(new[] {1, 2}, o => o.WithStrictOrdering());
}
}
AKKA.NET
STREAMS
TESTING
public class PulseSpec : Akka.TestKit.Xunit2.TestKit
{
private readonly TimeSpan _pulseInterval = TimeSpan.FromMilliseconds(20);
[Fact]
public async Task Pulse_should_signal_demand_once_every_interval()
{
var (probe, task) = this.SourceProbe<int>()
.Via(new Pulse<int>(_pulseInterval))
.ToMaterialized(Sink.Seq<int>(), Keep.Both)
.Run(Sys.Materializer());
probe.SendNext(1);
probe.ExpectNoMsg(_pulseInterval);
probe.SendNext(2);
probe.ExpectNoMsg(_pulseInterval);
probe.SendComplete();
var result = await task;
result.ShouldBeEquivalentTo(new[] {1, 2}, o => o.WithStrictOrdering());
}
}
Manages Akka.NET runtime for testing purposes
AKKA.NET
STREAMS
TESTING
public class PulseSpec : Akka.TestKit.Xunit2.TestKit
{
private readonly TimeSpan _pulseInterval = TimeSpan.FromMilliseconds(20);
[Fact]
public async Task Pulse_should_signal_demand_once_every_interval()
{
var (probe, task) = this.SourceProbe<int>()
.Via(new Pulse<int>(_pulseInterval))
.ToMaterialized(Sink.Seq<int>(), Keep.Both)
.Run(Sys.Materializer());
probe.SendNext(1);
probe.ExpectNoMsg(_pulseInterval);
probe.SendNext(2);
probe.ExpectNoMsg(_pulseInterval);
probe.SendComplete();
var result = await task;
result.ShouldBeEquivalentTo(new[] {1, 2}, o => o.WithStrictOrdering());
}
}
Feed stream in controlled fashion
AKKA.NET
STREAMS
TESTING
public class PulseSpec : Akka.TestKit.Xunit2.TestKit
{
private readonly TimeSpan _pulseInterval = TimeSpan.FromMilliseconds(20);
[Fact]
public async Task Pulse_should_signal_demand_once_every_interval()
{
var (probe, task) = this.SourceProbe<int>()
.Via(new Pulse<int>(_pulseInterval))
.ToMaterialized(Sink.Seq<int>(), Keep.Both)
.Run(Sys.Materializer());
probe.SendNext(1);
probe.ExpectNoMsg(_pulseInterval);
probe.SendNext(2);
probe.ExpectNoMsg(_pulseInterval);
probe.SendComplete();
var result = await task;
result.ShouldBeEquivalentTo(new[] {1, 2}, o => o.WithStrictOrdering());
}
}
Close the stream
LET’S BUILD SOMETHING
MAYBE A TCP SERVER?
AKKA.NET
STREAMS
TCP
SERVER
var prefix = ByteString.FromString("Hello, ");
Flow<ByteString, ByteString, NotUsed> handler =
Framing.Delimiter(ByteString.FromString("n"), 4000, true)
.Select(message => prefix + message);
var binding = await
system.TcpStream()
.Bind(“127.0.0.1", 5000)
.To(Sink.ForEach<Tcp.IncomingConnection>(incoming =>
{
Console.WriteLine($"Client connected: {incoming.RemoteAddress}");
incoming.Flow.Join(handler).Run(materializer);
}))
.Run(materializer);
// Shutdown server
await binding.Unbind();
var prefix = ByteString.FromString("Hello, ");
Flow<ByteString, ByteString, NotUsed> handler =
Framing.Delimiter(ByteString.FromString("n"), 4000, true)
.Select(message => prefix + message);
var binding = await
system.TcpStream()
.Bind(“127.0.0.1", 5000)
.To(Sink.ForEach<Tcp.IncomingConnection>(incoming =>
{
Console.WriteLine($"Client connected: {incoming.RemoteAddress}");
incoming.Flow.Join(handler).Run(materializer);
}))
.Run(materializer);
// Shutdown server
await binding.Unbind();
AKKA.NET
STREAMS
TCP
SERVER
Bind server to IP endpoint
var prefix = ByteString.FromString("Hello, ");
Flow<ByteString, ByteString, NotUsed> handler =
Framing.Delimiter(ByteString.FromString("n"), 4000, true)
.Select(message => prefix + message);
var binding = await
system.TcpStream()
.Bind(“127.0.0.1", 5000)
.To(Sink.ForEach<Tcp.IncomingConnection>(incoming =>
{
Console.WriteLine($"Client connected: {incoming.RemoteAddress}");
incoming.Flow.Join(handler).Run(materializer);
}))
.Run(materializer);
// Shutdown server
await binding.Unbind();
AKKA.NET
STREAMS
TCP
SERVER
Source<Tcp.IncomingConnection, Task<Tcp.ServerBinding>>
var prefix = ByteString.FromString("Hello, ");
Flow<ByteString, ByteString, NotUsed> handler =
Framing.Delimiter(ByteString.FromString("n"), 4000, true)
.Select(message => prefix + message);
var binding = await
system.TcpStream()
.Bind(“127.0.0.1", 5000)
.To(Sink.ForEach<Tcp.IncomingConnection>(incoming =>
{
Console.WriteLine($"Client connected: {incoming.RemoteAddress}");
incoming.Flow.Join(handler).Run(materializer);
}))
.Run(materializer);
// Shutdown server
await binding.Unbind();
AKKA.NET
STREAMS
TCP
SERVER
Connection handler logic
var prefix = ByteString.FromString("Hello, ");
Flow<ByteString, ByteString, NotUsed> handler =
Framing.Delimiter(ByteString.FromString("n"), 4000, true)
.Select(message => prefix + message);
var binding = await
system.TcpStream()
.Bind(“127.0.0.1", 5000)
.To(Sink.ForEach<Tcp.IncomingConnection>(incoming =>
{
Console.WriteLine($"Client connected: {incoming.RemoteAddress}");
incoming.Flow.Join(handler).Run(materializer);
}))
.Run(materializer);
// Shutdown server
await binding.Unbind();
AKKA.NET
STREAMS
TCP
SERVER
Efficient byte management
BYTESTRING
1. Low-alloc byte manipulation
API.
2. Immutable, indexable and
composable sequence of bytes.
3. Internally a collection of
chunks of bytes.
ByteString
0110010 0111110 010111011
0100110010000001 010
AKKA.NET
STREAMS
EVENT
SOURCING
Actor
A B C D E F G H I
Event log
Source SourceSource
J
STREAM REFS
MAKE STREAM CONSTRUCTION DISTRIBUTED
AND TRANSPARENT
AKKA.NET
STREAM
REFS
NODE 1
CREATE SOURCE
REF ON ONE SIDE
RunnableGraph<SourceRef<T>>
NODE 2
AKKA.NET
STREAM
REFS
NODE 1
MATERIALIZE
STREAM
NODE 2
SourceRef<T>
AKKA.NET
STREAM
REFS
NODE 1
SEND SOURCE REF
OVER THE NETWORK
NODE 2
AKKA.NET
STREAM
REFS
NODE 1
MATERIALIZE AS
PART OF GRAPH ON
ANOTHER NODE
NODE 2
WHAT WE
HAVEN’T
TALKED
ABOUT
1. Building graphs with GraphDSL
2. Creating custom stages
3. Bidirectional flows
 RSocket site: http://rsocket.io/
 Akka.NET Streams documentation: https://getakka.net/articles/streams/introduction.html
 Alpakka – Akka.NET connectors: https://github.com/AkkaNetContrib/Alpakka
REFERENCES
THANK YOU

More Related Content

What's hot

Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureJosé Paumard
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQAraf Karsh Hamid
 
Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?confluent
 
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Matt Raible
 
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! Michel Schudel
 
Microservices Architecture - Bangkok 2018
Microservices Architecture - Bangkok 2018Microservices Architecture - Bangkok 2018
Microservices Architecture - Bangkok 2018Araf Karsh Hamid
 
Logging, Serilog, Structured Logging, Seq
Logging, Serilog, Structured Logging, SeqLogging, Serilog, Structured Logging, Seq
Logging, Serilog, Structured Logging, SeqDoruk Uluçay
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Chris Richardson
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyVMware Tanzu
 
A Microservices approach with Cassandra and Quarkus | DevNation Tech Talk
A Microservices approach with Cassandra and Quarkus | DevNation Tech TalkA Microservices approach with Cassandra and Quarkus | DevNation Tech Talk
A Microservices approach with Cassandra and Quarkus | DevNation Tech TalkRed Hat Developers
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSam Brannen
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxParadigma Digital
 
Batch and Stream Graph Processing with Apache Flink
Batch and Stream Graph Processing with Apache FlinkBatch and Stream Graph Processing with Apache Flink
Batch and Stream Graph Processing with Apache FlinkVasia Kalavri
 
Streaming with Spring Cloud Stream and Apache Kafka - Soby Chacko
Streaming with Spring Cloud Stream and Apache Kafka - Soby ChackoStreaming with Spring Cloud Stream and Apache Kafka - Soby Chacko
Streaming with Spring Cloud Stream and Apache Kafka - Soby ChackoVMware Tanzu
 
Testing Microservices
Testing MicroservicesTesting Microservices
Testing MicroservicesAnil Allewar
 

What's hot (20)

Asynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFutureAsynchronous API in Java8, how to use CompletableFuture
Asynchronous API in Java8, how to use CompletableFuture
 
Event Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQEvent Sourcing & CQRS, Kafka, Rabbit MQ
Event Sourcing & CQRS, Kafka, Rabbit MQ
 
Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?Kafka Streams: What it is, and how to use it?
Kafka Streams: What it is, and how to use it?
 
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
Java REST API Comparison: Micronaut, Quarkus, and Spring Boot - jconf.dev 2020
 
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition! Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
Battle Of The Microservice Frameworks: Micronaut versus Quarkus edition!
 
Microservices Architecture - Bangkok 2018
Microservices Architecture - Bangkok 2018Microservices Architecture - Bangkok 2018
Microservices Architecture - Bangkok 2018
 
Logging, Serilog, Structured Logging, Seq
Logging, Serilog, Structured Logging, SeqLogging, Serilog, Structured Logging, Seq
Logging, Serilog, Structured Logging, Seq
 
Springboot Microservices
Springboot MicroservicesSpringboot Microservices
Springboot Microservices
 
Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)Developing event-driven microservices with event sourcing and CQRS (phillyete)
Developing event-driven microservices with event sourcing and CQRS (phillyete)
 
Spring Boot Tutorial
Spring Boot TutorialSpring Boot Tutorial
Spring Boot Tutorial
 
How to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor NettyHow to Avoid Common Mistakes When Using Reactor Netty
How to Avoid Common Mistakes When Using Reactor Netty
 
Introduction to Microservices
Introduction to MicroservicesIntroduction to Microservices
Introduction to Microservices
 
Node.js Basics
Node.js Basics Node.js Basics
Node.js Basics
 
A Microservices approach with Cassandra and Quarkus | DevNation Tech Talk
A Microservices approach with Cassandra and Quarkus | DevNation Tech TalkA Microservices approach with Cassandra and Quarkus | DevNation Tech Talk
A Microservices approach with Cassandra and Quarkus | DevNation Tech Talk
 
Spring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. RESTSpring Web Services: SOAP vs. REST
Spring Web Services: SOAP vs. REST
 
Mutiny + quarkus
Mutiny + quarkusMutiny + quarkus
Mutiny + quarkus
 
Programación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFluxProgramación Reactiva con Spring WebFlux
Programación Reactiva con Spring WebFlux
 
Batch and Stream Graph Processing with Apache Flink
Batch and Stream Graph Processing with Apache FlinkBatch and Stream Graph Processing with Apache Flink
Batch and Stream Graph Processing with Apache Flink
 
Streaming with Spring Cloud Stream and Apache Kafka - Soby Chacko
Streaming with Spring Cloud Stream and Apache Kafka - Soby ChackoStreaming with Spring Cloud Stream and Apache Kafka - Soby Chacko
Streaming with Spring Cloud Stream and Apache Kafka - Soby Chacko
 
Testing Microservices
Testing MicroservicesTesting Microservices
Testing Microservices
 

Similar to Akka.NET Streams Reactive Programming

Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomáš Kypta
 
Evolution of asynchrony in (ASP).NET
Evolution of asynchrony in (ASP).NETEvolution of asynchrony in (ASP).NET
Evolution of asynchrony in (ASP).NETAliaksandr Famin
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for AndroidTomáš Kypta
 
Understanding reactive programming with microsoft reactive extensions
Understanding reactive programming  with microsoft reactive extensionsUnderstanding reactive programming  with microsoft reactive extensions
Understanding reactive programming with microsoft reactive extensionsOleksandr Zhevzhyk
 
Ft10 de smet
Ft10 de smetFt10 de smet
Ft10 de smetnkaluva
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSAdam L Barrett
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaRick Warren
 
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamGDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamImre Nagi
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниStfalcon Meetups
 
A Playful Introduction to Rx
A Playful Introduction to RxA Playful Introduction to Rx
A Playful Introduction to RxAndrey Cheptsov
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMMario Fusco
 
Writing Domain-Specific Languages for BeepBeep
Writing Domain-Specific Languages for BeepBeepWriting Domain-Specific Languages for BeepBeep
Writing Domain-Specific Languages for BeepBeepSylvain Hallé
 
Rx for Android & iOS by Harin Trivedi
Rx for Android & iOS  by Harin TrivediRx for Android & iOS  by Harin Trivedi
Rx for Android & iOS by Harin Trivediharintrivedi
 

Similar to Akka.NET Streams Reactive Programming (20)

Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Evolution of asynchrony in (ASP).NET
Evolution of asynchrony in (ASP).NETEvolution of asynchrony in (ASP).NET
Evolution of asynchrony in (ASP).NET
 
Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
Saving lives with rx java
Saving lives with rx javaSaving lives with rx java
Saving lives with rx java
 
Understanding reactive programming with microsoft reactive extensions
Understanding reactive programming  with microsoft reactive extensionsUnderstanding reactive programming  with microsoft reactive extensions
Understanding reactive programming with microsoft reactive extensions
 
Ft10 de smet
Ft10 de smetFt10 de smet
Ft10 de smet
 
2 презентация rx java+android
2 презентация rx java+android2 презентация rx java+android
2 презентация rx java+android
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
Building Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJavaBuilding Scalable Stateless Applications with RxJava
Building Scalable Stateless Applications with RxJava
 
Rx workshop
Rx workshopRx workshop
Rx workshop
 
Akka
AkkaAkka
Akka
 
Rxjs marble-testing
Rxjs marble-testingRxjs marble-testing
Rxjs marble-testing
 
Reactive Extensions
Reactive ExtensionsReactive Extensions
Reactive Extensions
 
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache BeamGDG Jakarta Meetup - Streaming Analytics With Apache Beam
GDG Jakarta Meetup - Streaming Analytics With Apache Beam
 
RxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камниRxJava и Android. Плюсы, минусы, подводные камни
RxJava и Android. Плюсы, минусы, подводные камни
 
A Playful Introduction to Rx
A Playful Introduction to RxA Playful Introduction to Rx
A Playful Introduction to Rx
 
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STMConcurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
Concurrency, Scalability & Fault-tolerance 2.0 with Akka Actors & STM
 
Writing Domain-Specific Languages for BeepBeep
Writing Domain-Specific Languages for BeepBeepWriting Domain-Specific Languages for BeepBeep
Writing Domain-Specific Languages for BeepBeep
 
Rx for Android & iOS by Harin Trivedi
Rx for Android & iOS  by Harin TrivediRx for Android & iOS  by Harin Trivedi
Rx for Android & iOS by Harin Trivedi
 

More from Bartosz Sypytkowski

Postgres indexes: how to make them work for your application
Postgres indexes: how to make them work for your applicationPostgres indexes: how to make them work for your application
Postgres indexes: how to make them work for your applicationBartosz Sypytkowski
 
How do databases perform live backups and point-in-time recovery
How do databases perform live backups and point-in-time recoveryHow do databases perform live backups and point-in-time recovery
How do databases perform live backups and point-in-time recoveryBartosz Sypytkowski
 
Scaling connections in peer-to-peer applications
Scaling connections in peer-to-peer applicationsScaling connections in peer-to-peer applications
Scaling connections in peer-to-peer applicationsBartosz Sypytkowski
 
Rich collaborative data structures for everyone
Rich collaborative data structures for everyoneRich collaborative data structures for everyone
Rich collaborative data structures for everyoneBartosz Sypytkowski
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitivesBartosz Sypytkowski
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitivesBartosz Sypytkowski
 
Living in eventually consistent reality
Living in eventually consistent realityLiving in eventually consistent reality
Living in eventually consistent realityBartosz Sypytkowski
 
Virtual machines - how they work
Virtual machines - how they workVirtual machines - how they work
Virtual machines - how they workBartosz Sypytkowski
 
GraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageGraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageBartosz Sypytkowski
 

More from Bartosz Sypytkowski (14)

Postgres indexes: how to make them work for your application
Postgres indexes: how to make them work for your applicationPostgres indexes: how to make them work for your application
Postgres indexes: how to make them work for your application
 
How do databases perform live backups and point-in-time recovery
How do databases perform live backups and point-in-time recoveryHow do databases perform live backups and point-in-time recovery
How do databases perform live backups and point-in-time recovery
 
Scaling connections in peer-to-peer applications
Scaling connections in peer-to-peer applicationsScaling connections in peer-to-peer applications
Scaling connections in peer-to-peer applications
 
Rich collaborative data structures for everyone
Rich collaborative data structures for everyoneRich collaborative data structures for everyone
Rich collaborative data structures for everyone
 
Postgres indexes
Postgres indexesPostgres indexes
Postgres indexes
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitives
 
Collaborative eventsourcing
Collaborative eventsourcingCollaborative eventsourcing
Collaborative eventsourcing
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitives
 
Living in eventually consistent reality
Living in eventually consistent realityLiving in eventually consistent reality
Living in eventually consistent reality
 
Virtual machines - how they work
Virtual machines - how they workVirtual machines - how they work
Virtual machines - how they work
 
Short story of time
Short story of timeShort story of time
Short story of time
 
Collaborative text editing
Collaborative text editingCollaborative text editing
Collaborative text editing
 
The last mile from db to disk
The last mile from db to diskThe last mile from db to disk
The last mile from db to disk
 
GraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized ageGraphQL - an elegant weapon... for more civilized age
GraphQL - an elegant weapon... for more civilized age
 

Recently uploaded

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsAlberto González Trastoy
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...ICS
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...kellynguyen01
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio, Inc.
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...MyIntelliSource, Inc.
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideChristina Lin
 
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
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackVICTOR MAESTRE RAMIREZ
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfPower Karaoke
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about usDynamic Netsoft
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...MyIntelliSource, Inc.
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataBradBedford3
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...gurkirankumar98700
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝soniya singh
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfkalichargn70th171
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityNeo4j
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...Christina Lin
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - InfographicHr365.us smith
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantAxelRicardoTrocheRiq
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...stazi3110
 

Recently uploaded (20)

Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time ApplicationsUnveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
Unveiling the Tech Salsa of LAMs with Janus in Real-Time Applications
 
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
The Real-World Challenges of Medical Device Cybersecurity- Mitigating Vulnera...
 
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
Short Story: Unveiling the Reasoning Abilities of Large Language Models by Ke...
 
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed DataAlluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
Alluxio Monthly Webinar | Cloud-Native Model Training on Distributed Data
 
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
Try MyIntelliAccount Cloud Accounting Software As A Service Solution Risk Fre...
 
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop SlideBuilding Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
Building Real-Time Data Pipelines: Stream & Batch Processing workshop Slide
 
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
 
Cloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStackCloud Management Software Platforms: OpenStack
Cloud Management Software Platforms: OpenStack
 
The Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdfThe Evolution of Karaoke From Analog to App.pdf
The Evolution of Karaoke From Analog to App.pdf
 
DNT_Corporate presentation know about us
DNT_Corporate presentation know about usDNT_Corporate presentation know about us
DNT_Corporate presentation know about us
 
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
Steps To Getting Up And Running Quickly With MyTimeClock Employee Scheduling ...
 
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer DataAdobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
Adobe Marketo Engage Deep Dives: Using Webhooks to Transfer Data
 
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
(Genuine) Escort Service Lucknow | Starting ₹,5K To @25k with A/C 🧑🏽‍❤️‍🧑🏻 89...
 
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
Call Girls in Naraina Delhi 💯Call Us 🔝8264348440🔝
 
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdfThe Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
The Essentials of Digital Experience Monitoring_ A Comprehensive Guide.pdf
 
EY_Graph Database Powered Sustainability
EY_Graph Database Powered SustainabilityEY_Graph Database Powered Sustainability
EY_Graph Database Powered Sustainability
 
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
ODSC - Batch to Stream workshop - integration of Apache Spark, Cassandra, Pos...
 
Asset Management Software - Infographic
Asset Management Software - InfographicAsset Management Software - Infographic
Asset Management Software - Infographic
 
Salesforce Certified Field Service Consultant
Salesforce Certified Field Service ConsultantSalesforce Certified Field Service Consultant
Salesforce Certified Field Service Consultant
 
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
Building a General PDE Solving Framework with Symbolic-Numeric Scientific Mac...
 

Akka.NET Streams Reactive Programming