This document summarizes Jessica Tai's presentation about Airbnb's migration from a monolithic Ruby on Rails application to a microservices architecture. Some key points:
1) Airbnb initially used a monolithic architecture but encountered scalability issues as traffic grew such as slower deployments and more incidents.
2) They migrated to a service-oriented architecture with loosely coupled services organized by domain and request lifecycle.
3) Migrating involved incrementally moving pieces of the monolith like data models, business logic, and views to standalone services over time.
4) They employed techniques like dual writes, response comparisons, and replaying production traffic to migrate services safely while minimizing risk.
30. MIDDLE TIER
Shared business logic
Servicetypes
STRICT FLOW OF DEPENDENCIES
PRESENTATION
Synthesize
DERIVED DATA
Shared context, multiple sources
DATA
Entity read and writes
@jessicamtai
31. MIDDLE TIER
Shared business logic
PRESENTATION
Synthesize
DERIVED DATA
Shared context, multiple sources
DATA
Entity read and writes
Servicetypes
STRICT FLOW OF DEPENDENCIES
@jessicamtai
32. MIDDLE TIER
Shared business logic
PRESENTATION
Synthesize
DERIVED DATA
Shared context, multiple sources
DATA
Entity read and writes
Servicetypes
STRICT FLOW OF DEPENDENCIES
@jessicamtai
33. MIDDLE TIER
Shared business logic
DERIVED DATA
Shared context, multiple sources
DATA
Entity read and writes
PRESENTATION
Synthesize
Servicetypes
STRICT FLOW OF DEPENDENCIES
@jessicamtai
38. Homes data
service
Shared
database
Monorail
Data access query
Business logic
3.Migratingcoreproductviews
Presentation view
Homes
database
Pricing derived
data service
Pricing trends
data store
Checkout
presentation
service
@jessicamtai
39. Homes data
service
Shared
database
Monorail
Data access query
Business logic
4.Migratingcoreproductwrites
Presentation view
Homes
database
Homes
validation
middle-tier
Pricing derived
data service
Pricing trends
data store
Checkout
presentation
service
@jessicamtai
55. Writecomparison
SHADOW DATA SERVICES
Presentation service
Write validation
middle tier service
Write path A
Write path B
Data service
(production)
Data service
(shadow)
Consumer +
offline comparison
framework
Monorail
Payload A Payload B
@jessicamtai
56. s
Writecomparison
DUAL WRITE TO SEPARATE DATABASES
Presentation service
Write validation
middle tier service
The only write path
Data service
(shadow)
Monorail
@jessicamtai
60. ! Production traffic with partially complete service
○ e.g. batch API /loadUsers
○ Fetch users only by user id
! Unblock clients
Migratebyendpoint
@jessicamtai
67. Service
Service&clientsetup
Business logic
Server metrics
Server
diagnostics
Startup /
teardown
Endpoint logic
Metrics
Data
validation
Server
transport
Server
resilience
Java client
Ruby client
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Type
checking
@jessicamtai
68. Service
Endpoint logic
Service&clientsetup
Business logic
Server metrics
Server
diagnostics
Startup /
teardown
Dashboard
Dashboard
Alert
Alert
Alert
Runbook
documentation
Metrics
Data
validation
Server
transport
Server
resilience
Java client
Ruby client
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Type
checking
@jessicamtai
69. Service
Endpoint logic
Service&clientsetup
Business logic
Server metrics
Server
diagnostics
Startup /
teardown
Dashboard
Dashboard
Alert
Alert
Alert
Runbook
documentation
Metrics
Data
validation
Server
transport
Server
resilience
Java client
Ruby client
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Type
checking
@jessicamtai
71. IDL
Service
Endpoint logic
Business logic
Server metrics
Server
diagnostics
Startup /
teardown
Dashboard
Dashboard
Alert
Alert
Alert
Runbook
documentation
Metrics
Data
validation
Server
transport
Server
resilience
Java client
Ruby client
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Metrics
Client
transport
Data
validation
Error
handling
Resilience
Type
checking
@jessicamtai
72. ThriftIDL
API FRAMEWORK
/** Batch request for demo data */
struct LoadSomeDataRequest {
1: optional set<i64> ids
/** Some extra context baz */
2: optional bool fooBar (personal_data)
}
@jessicamtai
73. ThriftIDL
API FRAMEWORK
/** id to data response */
struct LoadSomeDataResponse {
1: optional map<i64, SomeData> data
}
@jessicamtai
/** Batch request for demo data */
struct LoadSomeDataRequest {
1: optional set<i64> ids (personal)
/** Some extra context baz */
2: optional bool fooBar
}
102. ! Prepare for a long commitment
! Define service building principles
! Decompose incrementally
! Scale with auto-generating frameworks, tools
SOAmigration
TAKEAWAYS
@jessicamtai