SlideShare uma empresa Scribd logo
1 de 109
Baixar para ler offline
Système distribué de
calculs financiers
Par Xavier Bucchiotty
ME
@xbucchiotty

https://github.com/xbucchiotty

http://blog.xebia.fr/author/xbucchiotty
Build a
testable,
composable and
scalable
cash-flow system
Step 1

Step 2

Step 3

Step 4

Stream API

Iteratees

Akka actor

Akka cluster
Use case
Financial debt management
CAUTION
initial = 1000 €
duration = 5 years
fixed interets rate = 5%
Date

1000 €
Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €
initial = 1000 €
duration = 5 years
fixed interets rate = 5%
Date

1000 €
Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €

date = last date + (1 year)
initial = 1000 €
duration = 5 years
fixed interets rate = 5%
Date

1000 €
Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €

amort = initial / duration
initial = 1000 €
duration = 5 years
fixed interets rate = 5%
Date

1000 €
Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €

outstanding = last oustanding - amort
initial = 1000 €
duration = 5 years
fixed interets rate = 5%
Date

1000 €
Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €

interests = last outstanding * rate
val f = (last: Row) => new Row {
def date =
last.date + (1 year)
def amortization =
last amortization
def outstanding =
last.outstanding - amortization
def interests =
last.outstanding * fixedRate
}
Step 1
Stream API
Date

Amort

Interests

Outstanding

2013-01-01

200 €

50 €

800 €

2014-01-01

200 €

40 €

600 €

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €
Date

Amort

Interests

Outstanding

first

2013-01-01

200 €

50 €

800 €

f(first)

2014-01-01

200 €

40 €

600 €

f(f(first))

2015-01-01

200 €

30 €

400 €

2016-01-01

200 €

20 €

200 €

2017-01-01

200 €

10 €

0 €
case class Loan( ... ) {
def first: Row
def f:(Row => Row)
def rows =
Stream.iterate(first)(f)
.take(duration)
}
case class Portfolio(loans: Seq[Loan]) {
def rows =
loans.stream.flatMap(_.rows)
}
Date

Amort

Interests

Total paid

2013-01-01

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

200 €

20 €

220 €

2017-01-01

200 €

10 €

210 €

2013-01-01

200 €

50 €

250 €

2014-01-01

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

2016-01-01

200 €

20 €

220 €

2017-01-01

200 €

10 €

210 €

2013-01-01

200 €

50 €

250 €

2014-01-01
Loan 3

250 €

2016-01-01

Loan 2

50 €

2014-01-01
Loan 1

200 €

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

2016-01-01

200 €

20 €

220 €

2017-01-01

200 €

10 €

210 €

Total

3450 €
// Produce rows
val totalPaid = portfolio.rows
// Transform rows to amount
.map(row => row.interests + row.amortization)
//Consume amount
.foldLeft(0 EUR)(_ + _)
// Produce rows
val totalPaid = portfolio.rows
// Transform rows to amount
.map(row => row.interests + row.amortization)
type RowProducer = Iterable[Row]
type RowTransformer[T] = (Row=>T)
//Consume amount
.foldLeft(0 EUR)(_ + _)
type AmountConsumer[T] = (Iterable[Amount]=>T)
RowProducer
(Iterable[Row])

//Loan
Stream.iterate(first)(f) take duration
//Porfolio
loans => loans flatMap (loan => loan.rows)

+ on demand computation
- sequential computation
RowTransformer
(Row => T)

object RowTransformer {
val totalPaid = (row: Row) =>
row.interests + row.amortization
}

+ function composition
- type limited to «map»
AmountConsumer
(Iterable[Amount] => T)

object AmountConsumer {
def sum = (rows: Iterable[Amount]) =>
rows.foldLeft(Amount(0, EUR))(_ + _)
}

+ function composition
- synchronism
Step 1

Stream API
5000 loans
50 rows

~ 560 ms
Pros

Cons

On demand computation

Sequential computation

Function composition

Synchronism
Transformation limited to «map»
Step 2
Iteratees
Integrating Play iteratees
libraryDependencies ++= Seq(
"com.typesafe.play" %%
"play-iteratees" %
"2.2.0-RC2"
)
Producer
Enumerator

Input

Status

Iteratee
Consumer
Enumerator
Iteratees are immutable
Input

Status

Asynchronous by design
Type safe
Iteratee
Enumerator
enumerate and interleave
case class Loan(initial: Amount,
duration: Int,
rowIt: RowIt) {
def rows(implicit ctx: ExecutionContext) =
Enumerator.enumerate(
Stream.iterate(first)(f).take(duration)
)
}

Data producer
case class Portfolio(loans: Seq[Loansan]) {
def rows(implicit ctx: ExecutionContext) =
Enumerator.interleave(loans.map(_.rows))
}

producers can be
combined
Date

Amort

Interests

Total paid

2013-01-01

200 €

50 €

250 €

2014-01-01

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

2016-01-01

200 €

20 €

220 €

2017-01-01

200 €

10 €

2013-01-01

200 €

50 €

210 €
250 €

2014-01-01

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

2016-01-01

200 €

20 €

220 €

2017-01-01

200 €

10 €

210 €

2013-01-01

200 €

50 €

250 €

2014-01-01

200 €

40 €

240 €

2015-01-01

200 €

30 €

230 €

2016-01-01

200 €

20 €

220 €

2017-01-01

200 €

10 €

210 €
3450 €

Total
Iteratee
Consumer as a state machine
Iteratees consume
Input
object Input {
case class El[+E](e: E)
case object Empty
case object EOF
}
and propagates a
state
object Step {
case class Done[+A, E]
(a: A, remaining: Input[E])
case class Cont[E, +A]
(k: Input[E] => Iteratee[E, A])
case class Error[E]
(msg: String, input: Input[E])
}
Enumerator

Status

Continue

Iteratee

Input

El(...)

def step = ...
val count = 1

computes

Iteratee
def step = ...
val count = 0
Enumerator

Status

Done

Iteratee

Input

def step = ...
val count = 1

EOF

computes

Iteratee
def step = ...
val count = 1
Enumerator

Status

Error

Input

Iteratee

El(...)

def step = ...
val error = "Runtime Error"

computes

Iteratee
def step = ...
val count = 1
val last: RowConsumer[Option[Row]] = {
def step(last: Option[Row]): K[Row,Option[Row]]= {
case Input.Empty => Cont(step(last))
case Input.EOF => Done(last, Input.EOF)
case Input.El(e) => Cont(step(Some(e)))
}
Cont(step(Option.empty[Row]))
}
object AmountConsumer {
val sum: AmountConsumer[Amount] =
(rows: Iterable[Amount]) =>
rows.foldLeft(Amount(0, EUR))(_ + _)
}
object AmountConsumer {
val sum: AmountConsumer[Amount] =
Iteratee.fold[Amount, Amount]
(Amount(0, EUR))(_ + _)
}
import RowTransformer.totalPaid
import AmountConsumer.sum
val totalPaidComputation: Future[Amount] =
portfolio.rows.run(sum)
import RowTransformer.totalPaid
import AmountConsumer.sum
val totalPaidComputation: Future[Amount] =
portfolio.rows |>>> sum
Enumeratee
map and filter
Producer
Enumerator

Input

Status

Iteratee
Consumer
Producer
Enumerator
Input[A]

Transformation
Enumeratee

Status

Input[B]

Iteratee
Consumer
object RowTransformer {
val totalPaid =
Enumeratee.map[Row](row =>
row.interests + row.amortization
)
}

Data transformation
def until(date: DateMidnight) =
Enumeratee.filter[Row](
row => !row.date.isAfter(date)
)

Data filtering
type RowProducer

= Iterable[Row]

type RowTransformer[T]

= (Row=>T)

type AmountConsumer[T]

= (Iterable[Amount]=>T)

type RowProducer

= Enumerator[Row]

type RowTransformer[T]

= Enumeratee[Row, T]

type AmountConsumer[T]

= Iteratee[Amount, T]
Futures are
composable
map, flatMap, filter
onComplete, onSuccess, onError, recover
// Produce rows
val totalPaidComputation: Future[Amount] =
portfolio.rows &> totalPaid |>>> sum
// Blocking the thread to wait for the result
val totalPaid =
Await.result(
totalPaidComputation,
atMost = defaultTimeout)
totalPaid should equal(3480 EUR)
We still have function composition
and prepares the code for asynchronism
RowProducer
//Loan
Enumerator.enumerate(
Stream.iterate(first)(f).take(duration)
)
//Porfolio
Enumerator.interleave(loans.map(_.rows))

+ on demand computation
+ parallel computation
RowTransformer
val totalPaid = Enumeratee.map[Row](row =>
row.interests + row.amortization
)

+ Function composition
+ map, filter, ...
AmountConsumer
def sum = Iteratee.fold[Amount, Amount]
(Amount(0, EUR))(_ + _)

+ Function composition
+ Asynchronism
Step 1

Step 2

Stream API

Iteratees

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 3500 ms

?
simple test
complex test
Thread.sleep((Math.random() * 1000) % 2) toLong)
Step 1

Step 2

Stream API

Iteratees

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 3500 ms

with pause

with pause

~ 144900 ms

~ 157285 ms

?
Cost of using this
implementation of iteratees
is greater than gain of
interleaving for such small
operations
Bulk interleaving
//Portfolio
val split =
loans.map(_.stream)
.grouped(loans.size / 4)
Step 1

Step 2

Stream API

Iteratees

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 4571 ms

with pause

with pause

~ 144900 ms

~ 39042 ms
Pros

Cons

On demand computation

Sequential computation

Function composition

Synchronism
Transformation limited to «map»
Pros
On demand computation
Function composition
Sequential computation
Synchronism

Cons
Pros

Cons

On demand computation

No error management

Function composition

No elasticity

Parallel computation

No resilience

Asynchronism
Step 3
Akka actor
Integrating Akka
libraryDependencies ++= Seq(
"com.typesafe.akka" %%
"akka-actor" %
"2.2.0"
)
Actors are objects
They communicate with each other by
messages
asynchronously
class Backend extends Actor {
def receive = {
case Compute(loan) =>
sender.tell(
msg = loan.stream.toList,
sender = self)
}
}
case class Compute(loan: Loan)
case class Loan
def rows(implicit calculator: ActorRef,
ctx: ExecutionContext) = {
val responseFuture =
ask(calculator,Compute(this))
val rowsFuture = responseFuture
.mapTo[List[Row]]
rowsFuture.map(Enumerator.enumerate(_))
)
}
}
val system =
ActorSystem.create("ScalaIOSystem")
val calculator = system.actorOf(Props[Backend]
.withRouter(
RoundRobinRouter(nrOfInstances = 10)
)
,"calculator")
}
Supervision
val simpleStrategy = OneForOneStrategy() {
case _: AskTimeoutException => Resume
case _: RuntimeException => Escalate
}
system.actorOf(Props[Backend]
...
.withSupervisorStrategy(simpleStrategy)),
"calculator")
Routee 1

Compute

Router

Routee 2

Routee 3
Routee 1

AskTimeoutException

Router

Routee 2
Resume

Routee 3
Actor System
Routee 1

Router

Routee 2

Routee 3
RowProducer
//Loan
ask(calculator,Compute(this))
.mapTo[List[Row]]
.map(Enumerator.enumerate(_))
//Porfolio
Enumerator.interleave(loans.map(_.rows))

+ parallel computation
- on demand computation
RowTransformer
val totalPaid = Enumeratee.map[Row](row =>
row.interests + row.amortization
)

+ Nothing changed
AmountConsumer
def sum = Iteratee.fold[Amount, Amount]
(Amount(0, EUR))(_ + _)

+ Nothing changed
Step 1

Step 2

Step 3

Stream API

Iteratees

Akka actor

5000 loans
50 rows

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 4571 ms

~ 4271 ms

with pause

with pause

with pause

~ 144900 ms

~ 39042 ms

~ 40882 ms
Pros

Cons

On demand computation

No error management

Function composition

No elasticity

Parallel computation

No resilience

Asynchronism
Pros

Cons

No error management

On demand computation

Function composition

No elasticity

Parallel computation

No resilience

Asynchronism
Pros

Cons

Error management

No on demand computation

Function composition

No elasticity

Parallel computation

No resilience

Asynchronism
Step 4
Akka cluster
Integrating Akka Cluster
libraryDependencies ++= Seq(
"com.typesafe.akka" %%
"akka-cluster" %
"2.2.0"
)
Cluster Router
ClusterRouterConfig

Can create actors on different nodes of the cluster
Role
Local actors or not
Control number of actors per node per system
Cluster Router
AdaptiveLoadBalancingRouter

Collect metrics (CPU, HEAP, LOAD) via JMX or Hyperic Sigar
and make load balancing
val calculator = system.actorOf(Props[Backend]
.withRouter(
RoundRobinRouter(nrOfInstances = 10)
)
,"calculator")
}
val calculator = system.actorOf(Props[Backend]
.withRouter(ClusterRouterConfig(
local = localRouter,
settings = clusterSettings)
)
, "calculator")
}
Actor System
Routee 3

Actor System
Routee 1

Routee 4

Elasticity

Router

Routee 5

Routee 3

Routee 6

Actor System
application.conf
cluster {
seed-nodes = [
"akka.tcp://ScalaIOSystem@127.0.0.1:2551",
"akka.tcp://ScalaIOSystem@127.0.0.1:2552"
]
auto-down = on
}
Actor System
Routee 3

Actor System
Routee 1

Routee 4

Resilience

Router

Routee 5

Routee 3

Routee 6

Actor System
RowProducer
//Loan
ask(calculator,Compute(this))
.mapTo[List[Row]]
.map(Enumerator.enumerate(_))
//Porfolio
Enumerator.interleave(loans.map(_.rows))

+ Nothing changed
RowTransformer
val totalPaid = Enumeratee.map[Row](row =>
row.interests + row.amortization
)

+ Nothing changed
AmountConsumer
def sum = Iteratee.fold[Amount, Amount]
(Amount(0, EUR))(_ + _)

+ Nothing changed
Pros

Cons

Error management

No on demand computation

Function composition

No elasticity

Parallel computation

No resilience

Asynchronism
Pros
Error management
Function composition
Parallel computation
Asynchronism
No elasticity
No resilience

Cons
No on demand computation
Pros

Cons

Error management

No on demand computation

Function composition

Network serialization

Parallel computation
Asynchronism
Elasticity
Resilience
Step 1

Step 2

Step 3

Step 4

Stream API

Iteratees

Akka actor

Akka cluster

5000 loans
50 rows

5000 loans
50 rows

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 4571 ms

~ 4271 ms

~ 6213 ms

with pause

with pause

with pause

with pause

~ 144900 ms

~ 39042 ms

~ 40882 ms

~ 77957 ms
1 node / 2 actors
Step 1

Step 2

Step 3

Step 4

Stream API

Iteratees

Akka actor

Akka cluster

5000 loans
50 rows

5000 loans
50 rows

5000 loans
50 rows

5000 loans
50 rows

~ 560 ms

~ 4571 ms

~ 4271 ms

~ 5547 ms

with pause

with pause

with pause

with pause

~ 144900 ms

~ 39042 ms

~ 40882 ms

~ 39695 ms
2 nodes / 4 actors
Conclusion
Step 1

Step 2

Step 3

Step 4

Stream API

Iteratees

Akka actor

Akka cluster

powerful library

elegant API

error
management

elasticity

low memory

enable
asynchronism
and parallelism

control on
parallel execution
via configuration

resilience

performance
when single
threaded

monitoring
It’s all about trade-off
But do you really need
distribution?
Hot subject
Recet blog post from «Mandubian» for Scalaz stream machines and
iteratees [1]
Recent presentation from «Heather Miller» for spores (distribuables
closures) [2]
Recent release of Scala 2.10.3 and performance optimization of Promise
Release candidate of play-iteratee module with performance optimization
Lots of stuff in the roadmap of Akka cluster 2.3.0
Hot subject

[1] : http://mandubian.com/2013/08/21/playztream/

[2] : https://speakerdeck.com/heathermiller/on-pickles-and-sporesimproving-support-for-distributed-programming-in-scala
THANK
YOU

FOR watching

Merci!

Mais conteúdo relacionado

Mais procurados

Migrating one of the most popular e commerce platforms to mongodb
Migrating one of the most popular e commerce platforms to mongodbMigrating one of the most popular e commerce platforms to mongodb
Migrating one of the most popular e commerce platforms to mongodb
MongoDB
 
Answer key chapter 4
Answer key chapter 4Answer key chapter 4
Answer key chapter 4
Phannith Met
 
F# Presentation
F# PresentationF# Presentation
F# Presentation
mrkurt
 

Mais procurados (18)

Migrating one of the most popular e commerce platforms to mongodb
Migrating one of the most popular e commerce platforms to mongodbMigrating one of the most popular e commerce platforms to mongodb
Migrating one of the most popular e commerce platforms to mongodb
 
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
FLATMAP ZAT SHIT : les monades expliquées aux geeks (Devoxx France 2013)
 
C++ L11-Polymorphism
C++ L11-PolymorphismC++ L11-Polymorphism
C++ L11-Polymorphism
 
Day 1
Day 1Day 1
Day 1
 
Answer key chapter 4
Answer key chapter 4Answer key chapter 4
Answer key chapter 4
 
informatics practices practical file
informatics practices practical fileinformatics practices practical file
informatics practices practical file
 
TensorFlow in Practice
TensorFlow in PracticeTensorFlow in Practice
TensorFlow in Practice
 
C++ L10-Inheritance
C++ L10-InheritanceC++ L10-Inheritance
C++ L10-Inheritance
 
Processing Collections with Java8 Stream APIs
Processing Collections with Java8 Stream APIsProcessing Collections with Java8 Stream APIs
Processing Collections with Java8 Stream APIs
 
Quality Python Homework Help
Quality Python Homework HelpQuality Python Homework Help
Quality Python Homework Help
 
Vcs5
Vcs5Vcs5
Vcs5
 
C++ L02-Conversion+enum+Operators
C++ L02-Conversion+enum+OperatorsC++ L02-Conversion+enum+Operators
C++ L02-Conversion+enum+Operators
 
Intermediate Microeconomic Theory Cheat Sheet 3
Intermediate Microeconomic Theory Cheat Sheet 3Intermediate Microeconomic Theory Cheat Sheet 3
Intermediate Microeconomic Theory Cheat Sheet 3
 
F# Presentation
F# PresentationF# Presentation
F# Presentation
 
SPL 6.1 | Advanced problems on Operators and Math.h function in C
SPL 6.1 | Advanced problems on Operators and Math.h function in CSPL 6.1 | Advanced problems on Operators and Math.h function in C
SPL 6.1 | Advanced problems on Operators and Math.h function in C
 
C Language Lecture 17
C Language Lecture 17C Language Lecture 17
C Language Lecture 17
 
C tech questions
C tech questionsC tech questions
C tech questions
 
Fat Arrow (ES6)
Fat Arrow (ES6)Fat Arrow (ES6)
Fat Arrow (ES6)
 

Destaque (7)

Accenture: Video-over-internet-consumer-survey-May 2013
Accenture: Video-over-internet-consumer-survey-May 2013Accenture: Video-over-internet-consumer-survey-May 2013
Accenture: Video-over-internet-consumer-survey-May 2013
 
Babelfish Articles #12 Jan-June 2015
Babelfish Articles #12 Jan-June 2015Babelfish Articles #12 Jan-June 2015
Babelfish Articles #12 Jan-June 2015
 
Babelfish Articles July-Dec 2015 10-12-15
Babelfish Articles July-Dec 2015 10-12-15Babelfish Articles July-Dec 2015 10-12-15
Babelfish Articles July-Dec 2015 10-12-15
 
Comscore Global+future+in+focus por2
Comscore Global+future+in+focus por2Comscore Global+future+in+focus por2
Comscore Global+future+in+focus por2
 
Babelfish Articles Jan-Sep 2016 12-09-16 final
Babelfish Articles Jan-Sep 2016  12-09-16 finalBabelfish Articles Jan-Sep 2016  12-09-16 final
Babelfish Articles Jan-Sep 2016 12-09-16 final
 
JWT The future-100-­-trends-and-change-to-watch-in-2016
JWT The future-100-­-trends-and-change-to-watch-in-2016JWT The future-100-­-trends-and-change-to-watch-in-2016
JWT The future-100-­-trends-and-change-to-watch-in-2016
 
eBit Web shoppers 32a edição
eBit Web shoppers 32a ediçãoeBit Web shoppers 32a edição
eBit Web shoppers 32a edição
 

Semelhante a Open XKE - POC d'une architecture distribuée de calculs financiers par Xavier Bucchiotty

Introducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event ProcessorIntroducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event Processor
WSO2
 
Rajeev oops 2nd march
Rajeev oops 2nd marchRajeev oops 2nd march
Rajeev oops 2nd march
Rajeev Sharan
 
Complex Event Processor 3.0.0 - An overview of upcoming features
Complex Event Processor 3.0.0 - An overview of upcoming features Complex Event Processor 3.0.0 - An overview of upcoming features
Complex Event Processor 3.0.0 - An overview of upcoming features
WSO2
 

Semelhante a Open XKE - POC d'une architecture distribuée de calculs financiers par Xavier Bucchiotty (20)

Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTech
 
F sharp - an overview
F sharp - an overviewF sharp - an overview
F sharp - an overview
 
Code quailty metrics demystified
Code quailty metrics demystifiedCode quailty metrics demystified
Code quailty metrics demystified
 
Introducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event ProcessorIntroducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event Processor
 
Intro to Akka Streams
Intro to Akka StreamsIntro to Akka Streams
Intro to Akka Streams
 
Akka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAkka: Actor Design & Communication Technics
Akka: Actor Design & Communication Technics
 
Time for Functions
Time for FunctionsTime for Functions
Time for Functions
 
Very basic functional design patterns
Very basic functional design patternsVery basic functional design patterns
Very basic functional design patterns
 
web3j Overview
web3j Overviewweb3j Overview
web3j Overview
 
Object Oriented Programming with C++
Object Oriented Programming with C++Object Oriented Programming with C++
Object Oriented Programming with C++
 
Small pieces loosely joined
Small pieces loosely joinedSmall pieces loosely joined
Small pieces loosely joined
 
Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every day
 
Rajeev oops 2nd march
Rajeev oops 2nd marchRajeev oops 2nd march
Rajeev oops 2nd march
 
12th CBSE Practical File
12th CBSE Practical File12th CBSE Practical File
12th CBSE Practical File
 
operators.ppt
operators.pptoperators.ppt
operators.ppt
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languages
 
Java Foundations: Data Types and Type Conversion
Java Foundations: Data Types and Type ConversionJava Foundations: Data Types and Type Conversion
Java Foundations: Data Types and Type Conversion
 
Complex Event Processor 3.0.0 - An overview of upcoming features
Complex Event Processor 3.0.0 - An overview of upcoming features Complex Event Processor 3.0.0 - An overview of upcoming features
Complex Event Processor 3.0.0 - An overview of upcoming features
 
Taming Distribution: Formal Protocols for Akka Typed
Taming Distribution: Formal Protocols for Akka TypedTaming Distribution: Formal Protocols for Akka Typed
Taming Distribution: Formal Protocols for Akka Typed
 
aming distribution: formal protocols for Akka Typed
aming distribution: formal protocols for Akka Typedaming distribution: formal protocols for Akka Typed
aming distribution: formal protocols for Akka Typed
 

Mais de Publicis Sapient Engineering

Mais de Publicis Sapient Engineering (20)

XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humainXebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
XebiCon'18 - L'algorithme de reconnaissance de formes par le cerveau humain
 
Xebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to CloudXebicon'18 - IoT: From Edge to Cloud
Xebicon'18 - IoT: From Edge to Cloud
 
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveurXebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
Xebicon'18 - Spark in jail : conteneurisez vos traitements data sans serveur
 
XebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern InfrastructureXebiCon'18 - Modern Infrastructure
XebiCon'18 - Modern Infrastructure
 
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
XebiCon'18 - La Web App d'aujourd'hui et de demain : état de l'art et bleedin...
 
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
XebiCon'18 - Des notebook pour le monitoring avec Zeppelin
 
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
XebiCon'18 - Event Sourcing et RGPD, incompatibles ?
 
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
XebiCon'18 - Deno, le nouveau NodeJS qui inverse la tendance ?
 
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribuéXebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
XebiCon'18 - Boostez vos modèles avec du Deep Learning distribué
 
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
XebiCon'18 - Comment j'ai développé un jeu vidéo avec des outils de développe...
 
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
XebiCon'18 - Les utilisateurs finaux, les oubliés de nos produits !
 
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des datavizXebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
XebiCon'18 - Comment fausser l'interprétation de vos résultats avec des dataviz
 
XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture XebiCon'18 - Le développeur dans la Pop Culture
XebiCon'18 - Le développeur dans la Pop Culture
 
XebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilitéXebiCon'18 - Architecturer son application mobile pour la durabilité
XebiCon'18 - Architecturer son application mobile pour la durabilité
 
XebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID ConnectXebiCon'18 - Sécuriser son API avec OpenID Connect
XebiCon'18 - Sécuriser son API avec OpenID Connect
 
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
XebiCon'18 - Structuration du Temps et Dynamique de Groupes, Théorie organisa...
 
XebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an aprèsXebiCon'18 - Spark NLP, un an après
XebiCon'18 - Spark NLP, un an après
 
XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018XebiCon'18 - La sécurité, douce illusion même en 2018
XebiCon'18 - La sécurité, douce illusion même en 2018
 
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
XebiCon'18 - Utiliser Hyperledger Fabric pour la création d'une blockchain pr...
 
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
XebiCon'18 - Ce que l'histoire du métro Parisien m'a enseigné sur la création...
 

Último

+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
?#DUbAI#??##{{(☎️+971_581248768%)**%*]'#abortion pills for sale in dubai@
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Victor Rentea
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
WSO2
 

Último (20)

MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..Understanding the FAA Part 107 License ..
Understanding the FAA Part 107 License ..
 
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
+971581248768>> SAFE AND ORIGINAL ABORTION PILLS FOR SALE IN DUBAI AND ABUDHA...
 
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
Biography Of Angeliki Cooney | Senior Vice President Life Sciences | Albany, ...
 
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
Apidays New York 2024 - Accelerating FinTech Innovation by Vasa Krishnan, Fin...
 
Artificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : UncertaintyArtificial Intelligence Chap.5 : Uncertainty
Artificial Intelligence Chap.5 : Uncertainty
 
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ..."I see eyes in my soup": How Delivery Hero implemented the safety system for ...
"I see eyes in my soup": How Delivery Hero implemented the safety system for ...
 
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
Modular Monolith - a Practical Alternative to Microservices @ Devoxx UK 2024
 
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
Apidays New York 2024 - Passkeys: Developing APIs to enable passwordless auth...
 
Corporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptxCorporate and higher education May webinar.pptx
Corporate and higher education May webinar.pptx
 
Six Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal OntologySix Myths about Ontologies: The Basics of Formal Ontology
Six Myths about Ontologies: The Basics of Formal Ontology
 
[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf[BuildWithAI] Introduction to Gemini.pdf
[BuildWithAI] Introduction to Gemini.pdf
 
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost SavingRepurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
Repurposing LNG terminals for Hydrogen Ammonia: Feasibility and Cost Saving
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
MS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectorsMS Copilot expands with MS Graph connectors
MS Copilot expands with MS Graph connectors
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
Connector Corner: Accelerate revenue generation using UiPath API-centric busi...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
Apidays New York 2024 - The Good, the Bad and the Governed by David O'Neill, ...
 

Open XKE - POC d'une architecture distribuée de calculs financiers par Xavier Bucchiotty