SlideShare ist ein Scribd-Unternehmen logo
1 von 24
Downloaden Sie, um offline zu lesen
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

Weitere ähnliche Inhalte

Ähnlich wie 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
 

Ähnlich wie 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
 

Kürzlich hochgeladen

Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
lizamodels9
 
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
dlhescort
 
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
daisycvs
 
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
amitlee9823
 
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
amitlee9823
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
dollysharma2066
 
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
dlhescort
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
amitlee9823
 

Kürzlich hochgeladen (20)

Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
Call Girls From Pari Chowk Greater Noida ❤️8448577510 ⊹Best Escorts Service I...
 
It will be International Nurses' Day on 12 May
It will be International Nurses' Day on 12 MayIt will be International Nurses' Day on 12 May
It will be International Nurses' Day on 12 May
 
Phases of Negotiation .pptx
 Phases of Negotiation .pptx Phases of Negotiation .pptx
Phases of Negotiation .pptx
 
Falcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investorsFalcon Invoice Discounting: The best investment platform in india for investors
Falcon Invoice Discounting: The best investment platform in india for investors
 
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
Call Girls in Delhi, Escort Service Available 24x7 in Delhi 959961-/-3876
 
Falcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to ProsperityFalcon's Invoice Discounting: Your Path to Prosperity
Falcon's Invoice Discounting: Your Path to Prosperity
 
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
Quick Doctor In Kuwait +2773`7758`557 Kuwait Doha Qatar Dubai Abu Dhabi Sharj...
 
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service BangaloreCall Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
Call Girls Hebbal Just Call 👗 7737669865 👗 Top Class Call Girl Service Bangalore
 
Malegaon Call Girls Service ☎ ️82500–77686 ☎️ Enjoy 24/7 Escort Service
Malegaon Call Girls Service ☎ ️82500–77686 ☎️ Enjoy 24/7 Escort ServiceMalegaon Call Girls Service ☎ ️82500–77686 ☎️ Enjoy 24/7 Escort Service
Malegaon Call Girls Service ☎ ️82500–77686 ☎️ Enjoy 24/7 Escort Service
 
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
The Path to Product Excellence: Avoiding Common Pitfalls and Enhancing Commun...
 
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
Nelamangala Call Girls: 🍓 7737669865 🍓 High Profile Model Escorts | Bangalore...
 
Cheap Rate Call Girls In Noida Sector 62 Metro 959961乂3876
Cheap Rate Call Girls In Noida Sector 62 Metro 959961乂3876Cheap Rate Call Girls In Noida Sector 62 Metro 959961乂3876
Cheap Rate Call Girls In Noida Sector 62 Metro 959961乂3876
 
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
Call Girls Service In Old Town Dubai ((0551707352)) Old Town Dubai Call Girl ...
 
BAGALUR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
BAGALUR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRLBAGALUR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
BAGALUR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
 
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
 
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
(Anamika) VIP Call Girls Napur Call Now 8617697112 Napur Escorts 24x7
 
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
FULL ENJOY Call Girls In Mahipalpur Delhi Contact Us 8377877756
 
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
Call Girls In Majnu Ka Tilla 959961~3876 Shot 2000 Night 8000
 
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
Call Girls Jp Nagar Just Call 👗 7737669865 👗 Top Class Call Girl Service Bang...
 
JAYNAGAR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
JAYNAGAR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRLJAYNAGAR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
JAYNAGAR CALL GIRL IN 98274*61493 ❤CALL GIRLS IN ESCORT SERVICE❤CALL GIRL
 

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