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 mongodbMongoDB
 
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)François Sarradin
 
Answer key chapter 4
Answer key chapter 4Answer key chapter 4
Answer key chapter 4Phannith Met
 
TensorFlow in Practice
TensorFlow in PracticeTensorFlow in Practice
TensorFlow in Practiceindico data
 
Processing Collections with Java8 Stream APIs
Processing Collections with Java8 Stream APIsProcessing Collections with Java8 Stream APIs
Processing Collections with Java8 Stream APIsZameer Ahmed Shaik
 
C++ L02-Conversion+enum+Operators
C++ L02-Conversion+enum+OperatorsC++ L02-Conversion+enum+Operators
C++ L02-Conversion+enum+OperatorsMohammad Shaker
 
Intermediate Microeconomic Theory Cheat Sheet 3
Intermediate Microeconomic Theory Cheat Sheet 3Intermediate Microeconomic Theory Cheat Sheet 3
Intermediate Microeconomic Theory Cheat Sheet 3Laurel Ayuyao
 
F# Presentation
F# PresentationF# Presentation
F# Presentationmrkurt
 
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 CMohammad Imam Hossain
 
C tech questions
C tech questionsC tech questions
C tech questionsvijay00791
 
Fat Arrow (ES6)
Fat Arrow (ES6)Fat Arrow (ES6)
Fat Arrow (ES6)Ryan Ewing
 

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

Comunicación digital
Comunicación digitalComunicación digital
Comunicación digitalIreneitorres
 
Double page spread analysis complete
Double page spread analysis completeDouble page spread analysis complete
Double page spread analysis completematt_roberts
 
Verklighetsuppfattning
VerklighetsuppfattningVerklighetsuppfattning
Verklighetsuppfattningmyranfyran
 
Hotel Cafezal em Vitoria da Conquista
Hotel Cafezal em Vitoria da ConquistaHotel Cafezal em Vitoria da Conquista
Hotel Cafezal em Vitoria da ConquistaYuri Bispo
 
Matemáticas
MatemáticasMatemáticas
MatemáticasIriste
 
Estetisk verksamhet
Estetisk verksamhetEstetisk verksamhet
Estetisk verksamhetmyranfyran
 
Ciencias sociales
Ciencias socialesCiencias sociales
Ciencias socialesIriste
 
Entrepreneurs Roadmap by BPlanExperts
Entrepreneurs Roadmap by BPlanExpertsEntrepreneurs Roadmap by BPlanExperts
Entrepreneurs Roadmap by BPlanExpertsPresentationGFX
 
левитин цели и задачи научной журналистики из книги научная журналистика фи...
левитин цели и задачи научной журналистики   из книги научная журналистика фи...левитин цели и задачи научной журналистики   из книги научная журналистика фи...
левитин цели и задачи научной журналистики из книги научная журналистика фи...Ecolife Journal
 
Equinox waters edge brochure1040 Favista Real Estate
Equinox waters edge brochure1040 Favista Real Estate Equinox waters edge brochure1040 Favista Real Estate
Equinox waters edge brochure1040 Favista Real Estate Favista Real Estate
 
Somer final presentation (evaluation)
Somer final presentation (evaluation)Somer final presentation (evaluation)
Somer final presentation (evaluation)Sunshine97
 
Proceso induccion sena
Proceso induccion senaProceso induccion sena
Proceso induccion senagwallens
 

Destaque (20)

Comunicación digital
Comunicación digitalComunicación digital
Comunicación digital
 
Quotes of Pestec IPM
Quotes of Pestec IPM Quotes of Pestec IPM
Quotes of Pestec IPM
 
Rap affects
Rap affectsRap affects
Rap affects
 
Double page spread analysis complete
Double page spread analysis completeDouble page spread analysis complete
Double page spread analysis complete
 
Verklighetsuppfattning
VerklighetsuppfattningVerklighetsuppfattning
Verklighetsuppfattning
 
Hotel Cafezal em Vitoria da Conquista
Hotel Cafezal em Vitoria da ConquistaHotel Cafezal em Vitoria da Conquista
Hotel Cafezal em Vitoria da Conquista
 
Descontraindo
DescontraindoDescontraindo
Descontraindo
 
Audicity
AudicityAudicity
Audicity
 
Matemáticas
MatemáticasMatemáticas
Matemáticas
 
Digicel Surinam: Ahorros inteligentes
Digicel Surinam: Ahorros inteligentesDigicel Surinam: Ahorros inteligentes
Digicel Surinam: Ahorros inteligentes
 
Estetisk verksamhet
Estetisk verksamhetEstetisk verksamhet
Estetisk verksamhet
 
Ciencias sociales
Ciencias socialesCiencias sociales
Ciencias sociales
 
Audacity
AudacityAudacity
Audacity
 
Entrepreneurs Roadmap by BPlanExperts
Entrepreneurs Roadmap by BPlanExpertsEntrepreneurs Roadmap by BPlanExperts
Entrepreneurs Roadmap by BPlanExperts
 
левитин цели и задачи научной журналистики из книги научная журналистика фи...
левитин цели и задачи научной журналистики   из книги научная журналистика фи...левитин цели и задачи научной журналистики   из книги научная журналистика фи...
левитин цели и задачи научной журналистики из книги научная журналистика фи...
 
A blessed day
A blessed dayA blessed day
A blessed day
 
Equinox waters edge brochure1040 Favista Real Estate
Equinox waters edge brochure1040 Favista Real Estate Equinox waters edge brochure1040 Favista Real Estate
Equinox waters edge brochure1040 Favista Real Estate
 
Motorik
MotorikMotorik
Motorik
 
Somer final presentation (evaluation)
Somer final presentation (evaluation)Somer final presentation (evaluation)
Somer final presentation (evaluation)
 
Proceso induccion sena
Proceso induccion senaProceso induccion sena
Proceso induccion sena
 

Semelhante a POC d'une architecture distribuee de calculs financiers

Adopting F# at SBTech
Adopting F# at SBTechAdopting F# at SBTech
Adopting F# at SBTechAntya Dev
 
Code quailty metrics demystified
Code quailty metrics demystifiedCode quailty metrics demystified
Code quailty metrics demystifiedJeroen Resoort
 
Introducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event ProcessorIntroducing the WSO2 Complex Event Processor
Introducing the WSO2 Complex Event ProcessorWSO2
 
Akka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAkka: Actor Design & Communication Technics
Akka: Actor Design & Communication TechnicsAlex Fruzenshtein
 
Very basic functional design patterns
Very basic functional design patternsVery basic functional design patterns
Very basic functional design patternsTomasz Kowal
 
Small pieces loosely joined
Small pieces loosely joinedSmall pieces loosely joined
Small pieces loosely joinedennui2342
 
Reactive programming every day
Reactive programming every dayReactive programming every day
Reactive programming every dayVadym Khondar
 
Rajeev oops 2nd march
Rajeev oops 2nd marchRajeev oops 2nd march
Rajeev oops 2nd marchRajeev Sharan
 
12th CBSE Practical File
12th CBSE Practical File12th CBSE Practical File
12th CBSE Practical FileAshwin Francis
 
Type safe embedded domain-specific languages
Type safe embedded domain-specific languagesType safe embedded domain-specific languages
Type safe embedded domain-specific languagesArthur Xavier
 
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 ConversionSvetlin Nakov
 
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
 
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 TypedRoland Kuhn
 
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 TypedJ On The Beach
 

Semelhante a POC d'une architecture distribuee de calculs financiers (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
 

Último

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slidevu2urc
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUK Journal
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking MenDelhi Call girls
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel Araújo
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountPuma Security, LLC
 

Último (20)

Histor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slideHistor y of HAM Radio presentation slide
Histor y of HAM Radio presentation slide
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdfUnderstanding Discord NSFW Servers A Guide for Responsible Users.pdf
Understanding Discord NSFW Servers A Guide for Responsible Users.pdf
 
How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men08448380779 Call Girls In Greater Kailash - I Women Seeking Men
08448380779 Call Girls In Greater Kailash - I Women Seeking Men
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Breaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path MountBreaking the Kubernetes Kill Chain: Host Path Mount
Breaking the Kubernetes Kill Chain: Host Path Mount
 

POC d'une architecture distribuee de calculs financiers