Architecture in Motion - How Adyen achieved 100x Bert Wolters - EVP Technology
←
→
Page content transcription
If your browser does not render page correctly, please read the page content below
$1B 80% On Singles’ Day in China, $1Billion was On Black Friday in the U.S., nearly 80% of retailers’ processed in 1 minute and 25 seconds online traffic took place on mobile.
Companies face a lack of functionality, flexibility and innovation Stuck with legacy technology that lead to poor user experience.
One modern platform
Merchant
Merchant Gateway
Gateway Risk
Riskmanagement
management Processing
Processing Schemes
Schemes Issuers
Issuers
Traditional
value chain
PSP
PSP Acquirer
AcquirerThis is Adyen ALL TECHNOLOGY DEVELOPED IN-HOUSE One platform, one contract, all sales channels 250+ payment methods 1200+ global employees 23 Global offices
“The company behind Facebook, Uber
and Netflix payments reveals huge
transaction growth”
Adyen’s total transaction volume in $ billion
300
225
"Adyen is the best fit for global merchants
150
that want to increase their overall
payments performance, reduce their
75
fraud rates and simplify their overall
payments operations”
0
2012 2013 2014 2015 2016 2017 2018 2019The Adyen Way of Engineering
We prioritize current merchant experience We all make mistakes, but we seek help
over future features as soon as we find out
To think like the merchant we You own when, where and how
go meet them your code goes live
Your code should be understandable
We design for 20x at 4am under stress
Expose your work early We embrace new technology
when it has clear benefits
We are all designers, architects,
Our tech stack is open source or built in-house
coders, testers, security officers
and operations engineersThe Adyen Way of Engineering
We prioritize current merchant experience We all make mistakes, but we seek help
over future features as soon as we find out
To think like the merchant we You own when, where and how
go meet them your code goes live
Your code should be understandable
We design for 20x at 4am under stress
Expose your work early We embrace new technology
when it has clear benefits
We are all designers, architects,
Our tech stack is open source or built in-house
coders, testers, security officers
and operations engineersThe Adyen Way of Engineering
We prioritize current merchant experience We all make mistakes, but we seek help
over future features as soon as we find out
To think like the merchant we You own when, where and how
go meet them your code goes live
Your code should be understandable
We design for 20x at 4am under stress
Expose your work early We embrace new technology
when it has clear benefits
We are all designers, architects,
Our tech stack is open source or built in-house
coders, testers, security officers
and operations engineersThe Adyen Way of Engineering
We prioritize current merchant experience We all make mistakes, but we seek help
over future features as soon as we find out
To think like the merchant we You own when, where and how
go meet them your code goes live
Your code should be understandable
We design for 20x at 4am under stress
Expose your work early We embrace new technology
when it has clear benefits
We are all designers, architects,
Our tech stack is open source or built in-house
coders, testers, security officers
and operations engineersThe Adyen Way of Engineering
We prioritize current merchant experience We all make mistakes, but we seek help
over future features as soon as we find out
To think like the merchant we You own when, where and how
go meet them your code goes live
Your code should be understandable
We design for 20x at 4am under stress
Expose your work early We embrace new technology
when it has clear benefits
We are all designers, architects,
Our tech stack is open source or built in-house
coders, testers, security officers
and operations engineersHigh-Level Architecture
(Bibit / pre-Adyen)
Public API app servers Shopper payment flow,
Risk analysis,
Payment authorization
Reconciliation,
DB Reporting
main accounting databaseHigh-Level Architecture
(pre-Adyen)
Public API app servers
???
DB ???
main accounting databaseHigh-Level Architecture
(pre-Adyen)
Public API app servers
Availability
DB Consistency
main accounting databaseDesign for Breakage
High-Level Architecture
(first years)
Public API app servers
Stateless
Asynch queues
accounting app servers
Statefull
DB main accounting databaseFront-end Maintenance
Database Maintenance
High-Level Architecture
(first years)
Public API app servers
Stateless
accounting app servers
Statefull
DB main accounting databaseConsequences of being Stateless
Statefull
Public API app servers
Stateless
Async
Notification
accounting app
Statefull
DB main accountingConsequences of being Stateless
Refunds
Request:
{
"merchantAccount" : "TestMerchant",
"modificationAmount" : {
"value" : 500,
"currency" : "EUR"
},
"originalReference" : "9313547924770610",
"reference" : "YourModificationReference"
}
Response:
{
"pspReference" : "8312534564722331",
"response" : "[refund-received]"
}Architecture Diagram – Authorisations
Notification
Risk Shopper DNA
PAL
Soap (XML) Recharge Vault
REST (HTTP POST or JSON)
Merchant
Soap ACM
(XML)
Acquiring Network
Accounting
HPP PSP
Data Warehouse
Customer
Notification
Banking NetworkThe Challenge
Public API app servers
accounting app servers
DB main accounting databaseGrowing Exponentially
over $100b processed annually
+Scalability Challenges API (micro)services designed to be highly redundant and stateless. Scale linearly with more hardware. However main payment accounting system was running > 70TB on a single PostgreSQL instance at up to 25k tps. At 2-4x, optimisation and/or bigger hardware solve the problem. At 20x this is no longer sufficient and requires re- architecting.
Marbles
Generating Reports/Batch Files
The Solution / The NEW Challenge
front end app servers (public API)
DB DB DB multiple accounting clustersMore jars…
PspReference
Refunds
Request:
{
"merchantAccount" : "TestMerchant",
"modificationAmount" : {
"value" : 500,
"currency" : "EUR"
},
"originalReference" : "9313547924770610",
"reference" : "YourModificationReference"
}
Response:
{
"pspReference" : "8312534564722331",
"response" : "[refund-received]"
}Streaming Framework Accounting DB’s should be insert only Reduce I/O and CPU in the main DB (cache thrashing / spilling to disk) Exactly once delivery (Kafka started to support this since 2017) Prevent multi-shard queries
1 "@type" : "com.adyen.protocol.stream.journalstream.JournalStreamItem",
2 "journalStreamItemType" : "Journal",
3 "journal" : {
4 "bookingDate" : 1493908683696,
5 "journalId" : 227274316270,
6 "postDate" : 1493908682341,
7 "lines" : [
Stream 8
9
10
{
"registerTypeId" : 23,
"quantity" : 10500,
Contents 11
12
13
"accountId" : 378293,
"batch" : {
"accountId" : 378293,
14 "periodEndDate" : 1493935200000,
15 "registerTypeId" : 23,
16 "batchId" : 506220414,
17 "periodBeginDate" : 1493848800000
18 },
19 "unitId" : 840,
20 "journalLineId" : 117964524937,
21 "batchId" : 506220414
22 },Streaming is an Idempotent Log
Sequence generated by stream on Value is a byte array
insert; identifies offset which contains the raw
data
StreamId Key Value
1 aa ba94c3…
Stream 2 ab 8d3ffc…
Unique key provided by
3 ad 457e18… producer to prevent
duplicates; allows
idempotency
4 ba cc78c2… (exactly once delivery)
… … …A stream consists of multiple partitions
Producer 1 Producer 2 Producer 3
Streaming
cluster
Partition 1 Partition 2 Partition 3
Consumer 1 Consumer 2 Consumer 3 Consumer 4Streamreader hides complexity of reading partitions
Streaming
cluster
Partition 1 Partition 2 Partition 3
Consumer Streamreader
Auto-discovery of partitions
by streamreader
Single stream
Partition readers
of records
Partitionreaders keep track of position
and deserialize items
consumerExtend AbstractConsumer to implement a new consumer
AbstractConsumer communicates with streamreader and keeps track of consumerState
Consumer
Streamreader
Consumer database
AbstractConsumer poll()
Consumer-
abstract void consume(records)
State
abstract boolean shouldPersist()
abstract PersistFunction
persistInternal() persist()
YourConsumer
(extends AbstractConsumer)
Does not block
consuming
(asynchronous)Implementation
• Built on PostgreSQL (ACID)
• Denormalised data consumes lots of
bandwidth/storage
• Very fast (de)serialisation and compact
serialised representation
• Using FastJSON (Alibaba) with Zstandard
(Facebook) compression achieves similar
performance/byte size
• Still produces > 200Gb/day!Putting it into Production
Results after Deployment First customers live on multi-cluster in January 2017 with no customer impact Streaming handles virtually all data functions which would have required multi-cluster queries. DB tps on primary cluster dropped from 25k to 8k in less than two months
Global Data Centers Leased lines: MPLS links
Amsterdam/Zwolle (3DC’s)
San Fransisco
Miami
Hong Kong
Singapore
Sydney
MelbourneImproving Latency and Resilience
• Multiple data centers per region to provide
resilience against internal and external issues
• Merchants connect into data center in their
own geographical region minimising latency
and hops over public internet
• Sysmon recovery and health-based rerouting
choose optimal path for each transactionArchitecture in Motion How Adyen achieved 100x
You can also read