SlideShare una empresa de Scribd logo
1 de 24
Descargar para leer sin conexión
COORDINATING
NON-BLOCKING IO
AND
ASYNC HTTP RESPONSES
WHAT IS THE WEB STACK

•
•
•

HttpKit as web server
Compojure for routing
HttpKit for non-blocking http requests
REACTIVE APPROACH
PREFERRED

We are not using either Functional Reactive Programming or
Reactive Programming libraries. Eg. Rx.java
• May satisfy other more broad definitions of reactive
• Are making better use of threads than traditional approaches
•
Make a payment on a bill	

- Not necessarily a full payment	

!

POST /bills/:bill-id/payments
Session: user-id
Post Data: amount
!

1. Get credit card token for user	

1.1. Send request to payment gateway	

2. Find how much was left to be payed	

!

If payment is success: render amount remaining on bill	

If payment fails: render error
CANDIDATES
• Synchronous

promises	


• core.async	


• Promise

monad let/do	


• Lamina

• Promise

monad chain/lift-

• Meltdown

m-2	


pipeline	


(LMAX
Disrupter)	


• Raw

promises	


• Pulsar

promises	


• Raw

callbacks	


• Pulsar Actors
SOLUTION 0:
SYNCHRONOUS
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  (let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  @token)]	
  
	
  	
  	
  	
  (if	
  (success?	
  @transaction)	
  
	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  @details	
  amount)	
  
	
  	
  	
  	
  	
  	
  error-­‐response)))	
  
SOLUTION 1:
PROMISE MONAD LET/DO
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (let	
  [token-­‐req	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details-­‐req	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  (do	
  [token	
  	
  	
  	
  	
  	
  	
  token-­‐req	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  token)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  details-­‐req]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (return	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  details	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response)))))
SOLUTION 1.1:
PROMISE MONAD LET/DO/DO
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (let	
  [token-­‐req	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details-­‐req	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  (do	
  [token	
  	
  	
  	
  	
  	
  	
  token-­‐req	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  token)]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (do	
  [details	
  details-­‐req]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (return	
  (render-­‐remaining-­‐response	
  details	
  amount)))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (return	
  error-­‐response)))))
SOLUTION 1.2:
PROMISE MONAD DO
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (do	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  token)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  (return	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  details	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response))))
SOLUTION 1.3:
PROMISE + ERROR MONADS
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (do	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  token)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  (return	
  (render-­‐remaining-­‐response	
  details	
  amount))))
SOLUTION 2:
PROMISE CHAIN AND LIFT-M-2
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (let	
  [transaction-­‐req	
  (chain	
  (promise	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  auth/card-­‐token	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (partial	
  payment/bill	
  bill-­‐id	
  amount))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details-­‐req	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  (lift-­‐m-­‐2	
  (fn	
  [transaction	
  details]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  details	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response)))	
  
	
  	
  	
  	
  	
  	
  	
  transaction-­‐req	
  details-­‐req))	
  
SOLUTION 3:
RAW PROMISES
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (let	
  [transaction-­‐req	
  (-­‐>	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (then	
  (partial	
  payment/bill	
  bill-­‐id	
  amount)))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details-­‐req	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  (when	
  transaction-­‐req	
  details-­‐req	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  (fn	
  [transaction	
  details]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  details	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response)))))
SOLUTION 4:
RAW CALLBACKS

Not	
  Viable
SOLUTION 5:
CORE.ASYNC
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (go	
  (let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  (<!	
  token))]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  (<!	
  transaction))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  (<!	
  details)	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response))))
SOLUTION 6:
LAMINA PIPELINE
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  	
  	
  	
  (let	
  [details-­‐req	
  (bill/details	
  bill-­‐id)]	
  
	
  	
  	
  	
  	
  	
  	
  (pipeline	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (partial	
  payment/bill	
  bill-­‐id	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (fn	
  [transaction]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  transaction)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (on-­‐realized	
  details-­‐req	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (fn	
  [details]	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  details	
  amount)))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response)))))
SOLUTION 7:
MELTDOWN

No	
  point
SOLUTION 8:
PULSAR PROMISES
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  #(let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth-­‐card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill-­‐details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment-­‐bill	
  bill-­‐id	
  amount	
  @token)]	
  
	
  	
  	
  	
  (if	
  (success?	
  @transaction)	
  
	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  @details	
  amount)	
  
	
  	
  	
  	
  	
  	
  error-­‐response)))
SOLUTION 9:
PULSAR ACTORS

Not	
  Appropriate
(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  (let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  @token)]	
  
	
  	
  	
  	
  (if	
  (success?	
  @transaction)	
  
	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  @details	
  amount)	
  
	
  	
  	
  	
  	
  	
  error-­‐response)))

Synchronous

(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  (go	
  (let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth/card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill/details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment/bill	
  bill-­‐id	
  amount	
  (<!	
  token))]	
  
	
  	
  	
  	
  	
  	
  	
  	
  (if	
  (success?	
  (<!	
  transaction))	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  (<!	
  details)	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  	
  error-­‐response))))

core.async

(GET	
  "/bills/:bill-­‐id/payments"	
  [bill-­‐id	
  user-­‐id	
  amount]	
  
	
  	
  #(let	
  [token	
  	
  	
  	
  	
  	
  	
  (auth-­‐card-­‐token	
  user-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  details	
  	
  	
  	
  	
  (bill-­‐details	
  bill-­‐id)	
  
	
  	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  (payment-­‐bill	
  bill-­‐id	
  amount	
  @token)]	
  
	
  	
  	
  	
  	
  (if	
  (success?	
  @transaction)	
  
	
  	
  	
  	
  	
  	
  	
  (render-­‐remaining-­‐response	
  @details	
  amount)	
  
	
  	
  	
  	
  	
  	
  	
  (error-­‐response))))

Pulsar
SCALA
	
  	
  def	
  payBill(billId:	
  Integer,	
  userId:	
  Integer,	
  amount:	
  Integer):Future[Option[Json]]	
  =	
  {
	
  	
  	
  	
  val	
  seq	
  =	
  for	
  {
	
  	
  	
  	
  	
  	
  token	
  <-­‐	
  Auth.cardToken(userId)
	
  	
  	
  	
  	
  	
  tr	
  <-­‐	
  Payment.bill(token)
	
  	
  	
  	
  }	
  yield	
  tr
	
  
	
  	
  	
  	
  async	
  {
	
  	
  	
  	
  	
  	
  val	
  transactionProcess	
  =	
  await(seq.run)
	
  	
  	
  	
  	
  	
  val	
  detailProcess	
  =	
  await(BillOps.details(billId))
	
  	
  	
  	
  	
  	
  for	
  {
	
  	
  	
  	
  	
  	
  	
  	
  transaction	
  <-­‐	
  transactionProcess
	
  	
  	
  	
  	
  	
  	
  	
  detail	
  <-­‐	
  detailProcess
	
  	
  	
  	
  	
  	
  }	
  yield	
  renderRemainingResponse(amount,	
  detail)
	
  	
  	
  	
  }
	
  	
  }
REQUESTS PER SECOND
HELLO WORLD
• Single

C1-Medium	


• 7GB
•8

Ram	


Cores	


• 313,852

Concurrent Users	


• 4756.79

Requests Per

Second	


• More

meaningful results
once in SVT with full
implementation
ALL DONE AT	

AUSTRALIA POST	

DIGITAL MAILBOX
They're hiring.	

Send your CV to	

APDMRecruitment@auspost.com.au

Más contenido relacionado

Similar a Coordinating non blocking io melb-clj

7 client-state manipulation
7   client-state manipulation7   client-state manipulation
7 client-state manipulation
drewz lin
 
The atm system
The atm systemThe atm system
The atm system
Lê Đức
 
BizSmart Corporate Back Office Guide
BizSmart Corporate Back Office GuideBizSmart Corporate Back Office Guide
BizSmart Corporate Back Office Guide
AllianceBankMY
 
Barcelona Developers Conference 2011
Barcelona Developers Conference 2011Barcelona Developers Conference 2011
Barcelona Developers Conference 2011
PayPal
 
DEMATERIALISATION:MODES & PROCEDURE
DEMATERIALISATION:MODES & PROCEDUREDEMATERIALISATION:MODES & PROCEDURE
DEMATERIALISATION:MODES & PROCEDURE
Ravi kumar
 

Similar a Coordinating non blocking io melb-clj (20)

7 client-state manipulation
7   client-state manipulation7   client-state manipulation
7 client-state manipulation
 
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
 
Open web payments
Open web paymentsOpen web payments
Open web payments
 
Shangz R Brown Presentation
Shangz R Brown PresentationShangz R Brown Presentation
Shangz R Brown Presentation
 
Payments On Rails
Payments On RailsPayments On Rails
Payments On Rails
 
Payment Request API with a React high order component
Payment Request API with a React high order componentPayment Request API with a React high order component
Payment Request API with a React high order component
 
The atm system
The atm systemThe atm system
The atm system
 
The atm system
The atm systemThe atm system
The atm system
 
eZ Publish Workflows and Payment Gateways
eZ Publish Workflows and Payment GatewayseZ Publish Workflows and Payment Gateways
eZ Publish Workflows and Payment Gateways
 
SQL Server 2008 Portfolio
SQL Server 2008 PortfolioSQL Server 2008 Portfolio
SQL Server 2008 Portfolio
 
Payment create a ppr for multiple legal entities (eft)
Payment create a ppr for multiple legal entities (eft)Payment create a ppr for multiple legal entities (eft)
Payment create a ppr for multiple legal entities (eft)
 
BizSmart Corporate Back Office Guide
BizSmart Corporate Back Office GuideBizSmart Corporate Back Office Guide
BizSmart Corporate Back Office Guide
 
Integration of payment gateways using Paypal account
Integration of payment gateways using Paypal account Integration of payment gateways using Paypal account
Integration of payment gateways using Paypal account
 
Barcelona Developers Conference 2011
Barcelona Developers Conference 2011Barcelona Developers Conference 2011
Barcelona Developers Conference 2011
 
Monetize your idea! - Pay Pal
Monetize your idea! - Pay PalMonetize your idea! - Pay Pal
Monetize your idea! - Pay Pal
 
Banking Database
Banking DatabaseBanking Database
Banking Database
 
2012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML52012 SVCodeCamp: In App Payments with HTML5
2012 SVCodeCamp: In App Payments with HTML5
 
Look Who's Talking
Look Who's TalkingLook Who's Talking
Look Who's Talking
 
DEMATERIALISATION:MODES & PROCEDURE
DEMATERIALISATION:MODES & PROCEDUREDEMATERIALISATION:MODES & PROCEDURE
DEMATERIALISATION:MODES & PROCEDURE
 

Último

The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai KuwaitThe Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
daisycvs
 
Mckinsey foundation level Handbook for Viewing
Mckinsey foundation level Handbook for ViewingMckinsey foundation level Handbook for Viewing
Mckinsey foundation level Handbook for Viewing
Nauman Safdar
 
Challenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
Challenges and Opportunities: A Qualitative Study on Tax Compliance in PakistanChallenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
Challenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
vineshkumarsajnani12
 

Último (20)

Phases of Negotiation .pptx
 Phases of Negotiation .pptx Phases of Negotiation .pptx
Phases of Negotiation .pptx
 
The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai KuwaitThe Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
The Abortion pills for sale in Qatar@Doha [+27737758557] []Deira Dubai Kuwait
 
New 2024 Cannabis Edibles Investor Pitch Deck Template
New 2024 Cannabis Edibles Investor Pitch Deck TemplateNew 2024 Cannabis Edibles Investor Pitch Deck Template
New 2024 Cannabis Edibles Investor Pitch Deck Template
 
Dr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdfDr. Admir Softic_ presentation_Green Club_ENG.pdf
Dr. Admir Softic_ presentation_Green Club_ENG.pdf
 
Escorts in Nungambakkam Phone 8250092165 Enjoy 24/7 Escort Service Enjoy Your...
Escorts in Nungambakkam Phone 8250092165 Enjoy 24/7 Escort Service Enjoy Your...Escorts in Nungambakkam Phone 8250092165 Enjoy 24/7 Escort Service Enjoy Your...
Escorts in Nungambakkam Phone 8250092165 Enjoy 24/7 Escort Service Enjoy Your...
 
Mckinsey foundation level Handbook for Viewing
Mckinsey foundation level Handbook for ViewingMckinsey foundation level Handbook for Viewing
Mckinsey foundation level Handbook for Viewing
 
Buy gmail accounts.pdf buy Old Gmail Accounts
Buy gmail accounts.pdf buy Old Gmail AccountsBuy gmail accounts.pdf buy Old Gmail Accounts
Buy gmail accounts.pdf buy Old Gmail Accounts
 
WheelTug Short Pitch Deck 2024 | Byond Insights
WheelTug Short Pitch Deck 2024 | Byond InsightsWheelTug Short Pitch Deck 2024 | Byond Insights
WheelTug Short Pitch Deck 2024 | Byond Insights
 
Chennai Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Av...
Chennai Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Av...Chennai Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Av...
Chennai Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Av...
 
Berhampur Call Girl Just Call 8084732287 Top Class Call Girl Service Available
Berhampur Call Girl Just Call 8084732287 Top Class Call Girl Service AvailableBerhampur Call Girl Just Call 8084732287 Top Class Call Girl Service Available
Berhampur Call Girl Just Call 8084732287 Top Class Call Girl Service Available
 
Getting Real with AI - Columbus DAW - May 2024 - Nick Woo from AlignAI
Getting Real with AI - Columbus DAW - May 2024 - Nick Woo from AlignAIGetting Real with AI - Columbus DAW - May 2024 - Nick Woo from AlignAI
Getting Real with AI - Columbus DAW - May 2024 - Nick Woo from AlignAI
 
Durg CALL GIRL ❤ 82729*64427❤ CALL GIRLS IN durg ESCORTS
Durg CALL GIRL ❤ 82729*64427❤ CALL GIRLS IN durg ESCORTSDurg CALL GIRL ❤ 82729*64427❤ CALL GIRLS IN durg ESCORTS
Durg CALL GIRL ❤ 82729*64427❤ CALL GIRLS IN durg ESCORTS
 
Challenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
Challenges and Opportunities: A Qualitative Study on Tax Compliance in PakistanChallenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
Challenges and Opportunities: A Qualitative Study on Tax Compliance in Pakistan
 
Cannabis Legalization World Map: 2024 Updated
Cannabis Legalization World Map: 2024 UpdatedCannabis Legalization World Map: 2024 Updated
Cannabis Legalization World Map: 2024 Updated
 
PARK STREET 💋 Call Girl 9827461493 Call Girls in Escort service book now
PARK STREET 💋 Call Girl 9827461493 Call Girls in  Escort service book nowPARK STREET 💋 Call Girl 9827461493 Call Girls in  Escort service book now
PARK STREET 💋 Call Girl 9827461493 Call Girls in Escort service book now
 
Berhampur 70918*19311 CALL GIRLS IN ESCORT SERVICE WE ARE PROVIDING
Berhampur 70918*19311 CALL GIRLS IN ESCORT SERVICE WE ARE PROVIDINGBerhampur 70918*19311 CALL GIRLS IN ESCORT SERVICE WE ARE PROVIDING
Berhampur 70918*19311 CALL GIRLS IN ESCORT SERVICE WE ARE PROVIDING
 
Katrina Personal Brand Project and portfolio 1
Katrina Personal Brand Project and portfolio 1Katrina Personal Brand Project and portfolio 1
Katrina Personal Brand Project and portfolio 1
 
Ooty Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Avail...
Ooty Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Avail...Ooty Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Avail...
Ooty Call Gril 80022//12248 Only For Sex And High Profile Best Gril Sex Avail...
 
GUWAHATI 💋 Call Girl 9827461493 Call Girls in Escort service book now
GUWAHATI 💋 Call Girl 9827461493 Call Girls in  Escort service book nowGUWAHATI 💋 Call Girl 9827461493 Call Girls in  Escort service book now
GUWAHATI 💋 Call Girl 9827461493 Call Girls in Escort service book now
 
UAE Bur Dubai Call Girls ☏ 0564401582 Call Girl in Bur Dubai
UAE Bur Dubai Call Girls ☏ 0564401582 Call Girl in Bur DubaiUAE Bur Dubai Call Girls ☏ 0564401582 Call Girl in Bur Dubai
UAE Bur Dubai Call Girls ☏ 0564401582 Call Girl in Bur Dubai
 

Coordinating non blocking io melb-clj

  • 2.
  • 3. WHAT IS THE WEB STACK • • • HttpKit as web server Compojure for routing HttpKit for non-blocking http requests
  • 4. REACTIVE APPROACH PREFERRED We are not using either Functional Reactive Programming or Reactive Programming libraries. Eg. Rx.java • May satisfy other more broad definitions of reactive • Are making better use of threads than traditional approaches •
  • 5. Make a payment on a bill - Not necessarily a full payment ! POST /bills/:bill-id/payments Session: user-id Post Data: amount ! 1. Get credit card token for user 1.1. Send request to payment gateway 2. Find how much was left to be payed ! If payment is success: render amount remaining on bill If payment fails: render error
  • 6. CANDIDATES • Synchronous promises • core.async • Promise monad let/do • Lamina • Promise monad chain/lift- • Meltdown m-2 pipeline (LMAX Disrupter) • Raw promises • Pulsar promises • Raw callbacks • Pulsar Actors
  • 7. SOLUTION 0: SYNCHRONOUS (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]      (let  [token              (auth/card-­‐token  user-­‐id)                  details          (bill/details  bill-­‐id)                  transaction  (payment/bill  bill-­‐id  amount  @token)]          (if  (success?  @transaction)              (render-­‐remaining-­‐response  @details  amount)              error-­‐response)))  
  • 8. SOLUTION 1: PROMISE MONAD LET/DO (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (let  [token-­‐req      (auth/card-­‐token  user-­‐id)                        details-­‐req  (bill/details  bill-­‐id)]                (do  [token              token-­‐req                          transaction  (payment/bill  bill-­‐id  amount  token)                          details          details-­‐req]                        (return                            (if  (success?  transaction)                                (render-­‐remaining-­‐response  details  amount)                                error-­‐response)))))
  • 9. SOLUTION 1.1: PROMISE MONAD LET/DO/DO (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (let  [token-­‐req      (auth/card-­‐token  user-­‐id)                        details-­‐req  (bill/details  bill-­‐id)]                (do  [token              token-­‐req                          transaction  (payment/bill  bill-­‐id  amount  token)]                        (if  (success?  transaction)                            (do  [details  details-­‐req]                                    (return  (render-­‐remaining-­‐response  details  amount)))                            (return  error-­‐response)))))
  • 10. SOLUTION 1.2: PROMISE MONAD DO (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (do  [token              (auth/card-­‐token  user-­‐id)                      transaction  (payment/bill  bill-­‐id  amount  token)                      details          (bill/details  bill-­‐id)]                    (return                        (if  (success?  transaction)                            (render-­‐remaining-­‐response  details  amount)                            error-­‐response))))
  • 11. SOLUTION 1.3: PROMISE + ERROR MONADS (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (do  [token              (auth/card-­‐token  user-­‐id)                      transaction  (payment/bill  bill-­‐id  amount  token)                      details          (bill/details  bill-­‐id)]                    (return  (render-­‐remaining-­‐response  details  amount))))
  • 12. SOLUTION 2: PROMISE CHAIN AND LIFT-M-2 (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (let  [transaction-­‐req  (chain  (promise  user-­‐id)                                                                      auth/card-­‐token                                                                      (partial  payment/bill  bill-­‐id  amount))                        details-­‐req          (bill/details  bill-­‐id)]                (lift-­‐m-­‐2  (fn  [transaction  details]                                        (if  (success?  transaction)                                            (render-­‐remaining-­‐response  details  amount)                                            error-­‐response)))                transaction-­‐req  details-­‐req))  
  • 13. SOLUTION 3: RAW PROMISES (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (let  [transaction-­‐req  (-­‐>  (auth/card-­‐token  user-­‐id)                                                                (then  (partial  payment/bill  bill-­‐id  amount)))                        details-­‐req          (bill/details  bill-­‐id)]                (when  transaction-­‐req  details-­‐req                    (fn  [transaction  details]                        (if  (success?  transaction)                            (render-­‐remaining-­‐response  details  amount)                            error-­‐response)))))
  • 15. SOLUTION 5: CORE.ASYNC (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (go  (let  [token              (auth/card-­‐token  user-­‐id)                                details          (bill/details  bill-­‐id)                                transaction  (payment/bill  bill-­‐id  amount  (<!  token))]                        (if  (success?  (<!  transaction))                            (render-­‐remaining-­‐response  (<!  details)  amount)                            error-­‐response))))
  • 16. SOLUTION 6: LAMINA PIPELINE (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]            (let  [details-­‐req  (bill/details  bill-­‐id)]                (pipeline  (auth/card-­‐token  user-­‐id)                                    (partial  payment/bill  bill-­‐id  amount)                                    (fn  [transaction]                                        (if  (success?  transaction)                                            (on-­‐realized  details-­‐req                                                                      (fn  [details]                                                                          (render-­‐remaining-­‐response  details  amount)))                                            error-­‐response)))))
  • 18. SOLUTION 8: PULSAR PROMISES (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]      #(let  [token              (auth-­‐card-­‐token  user-­‐id)                    details          (bill-­‐details  bill-­‐id)                    transaction  (payment-­‐bill  bill-­‐id  amount  @token)]          (if  (success?  @transaction)              (render-­‐remaining-­‐response  @details  amount)              error-­‐response)))
  • 20. (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]      (let  [token              (auth/card-­‐token  user-­‐id)                  details          (bill/details  bill-­‐id)                  transaction  (payment/bill  bill-­‐id  amount  @token)]          (if  (success?  @transaction)              (render-­‐remaining-­‐response  @details  amount)              error-­‐response))) Synchronous (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]      (go  (let  [token              (auth/card-­‐token  user-­‐id)                          details          (bill/details  bill-­‐id)                          transaction  (payment/bill  bill-­‐id  amount  (<!  token))]                  (if  (success?  (<!  transaction))                      (render-­‐remaining-­‐response  (<!  details)  amount)                      error-­‐response)))) core.async (GET  "/bills/:bill-­‐id/payments"  [bill-­‐id  user-­‐id  amount]      #(let  [token              (auth-­‐card-­‐token  user-­‐id)                    details          (bill-­‐details  bill-­‐id)                    transaction  (payment-­‐bill  bill-­‐id  amount  @token)]            (if  (success?  @transaction)                (render-­‐remaining-­‐response  @details  amount)                (error-­‐response)))) Pulsar
  • 21. SCALA    def  payBill(billId:  Integer,  userId:  Integer,  amount:  Integer):Future[Option[Json]]  =  {        val  seq  =  for  {            token  <-­‐  Auth.cardToken(userId)            tr  <-­‐  Payment.bill(token)        }  yield  tr          async  {            val  transactionProcess  =  await(seq.run)            val  detailProcess  =  await(BillOps.details(billId))            for  {                transaction  <-­‐  transactionProcess                detail  <-­‐  detailProcess            }  yield  renderRemainingResponse(amount,  detail)        }    }
  • 23. HELLO WORLD • Single C1-Medium • 7GB •8 Ram Cores • 313,852 Concurrent Users • 4756.79 Requests Per Second • More meaningful results once in SVT with full implementation
  • 24. ALL DONE AT AUSTRALIA POST DIGITAL MAILBOX They're hiring. Send your CV to APDMRecruitment@auspost.com.au