Timelines @ Twitter
QCon London 2012 Arya Asemanfar
Thursday, March 8, 2012
Timelines @ Twitter QCon London 2012 Arya Asemanfar Thursday, - - PowerPoint PPT Presentation
Timelines @ Twitter QCon London 2012 Arya Asemanfar Thursday, March 8, 2012 Poll-based Timeline Thursday, March 8, 2012 Poll-based Timeline Thursday, March 8, 2012 Search Thursday, March 8, 2012 Streaming (aka Push) Thursday, March 8,
QCon London 2012 Arya Asemanfar
Thursday, March 8, 2012⇢200K QPS ⇢latency* 1ms median, 4ms @ p99
⇢30K QPS
* to determine which tweets you should see
Thursday, March 8, 2012⇢3K/sec - daily average ⇢5k/sec - daily peak ⇢10K+/sec - several large events in February
Thursday, March 8, 2012new tweet users’ home timelines
Thursday, March 8, 2012⇢18 million per minute
⇢3.5 seconds average ⇢or 285K per second
Thursday, March 8, 2012HTTP Proxy
Thursday, March 8, 2012HTTP Proxy tweet API
Thursday, March 8, 2012HTTP Proxy tweet API queue
Thursday, March 8, 2012HTTP Proxy tweet API tweet daemon queue
Thursday, March 8, 2012HTTP Proxy tweet API tweet daemon queue fanout
Thursday, March 8, 2012HTTP Proxy tweet API tweet daemon queue fanout delivery
Thursday, March 8, 2012fanout
Pipelined Delivery
Thursday, March 8, 2012fanout delivery 1st to 4000th followers
Pipelined Delivery
Thursday, March 8, 2012fanout delivery 1st to 4000th followers delivery 4001st to 8000th followers
Pipelined Delivery
Thursday, March 8, 2012fanout delivery 1st to 4000th followers delivery 4001st to 8000th followers delivery 8001st to 12000th followers
Pipelined Delivery
Thursday, March 8, 2012HTTP Proxy tweet API tweet daemon queue fanout delivery
Thursday, March 8, 2012HTTP Proxy tweet API tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012HTTP Proxy tweet API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012redis redis redis redis tweet ID RPUSHX to timeline ID user ID bitfield 8 bytes 8 bytes 4 bytes
Thursday, March 8, 2012tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield Redis list structure:
Thursday, March 8, 2012retweet ID tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield Redis list structure: retweet ID
Thursday, March 8, 2012retweet ID tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield tweet ID user ID bitfield Redis list structure: retweet ID retweet bit set
Thursday, March 8, 2012HTTP Proxy tweet API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012HTTP Proxy tweet API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012HTTP Proxy tweet API timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012⇢timeline ⇢tweets ⇢users
⇢timeline ⇢tweets ⇢users
⇢timeline ⇢tweets ⇢users
HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012tweet service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012users timelines
Thursday, March 8, 2012users timelines @diarioas timeline
Thursday, March 8, 2012users timelines
Thursday, March 8, 2012World
users timelines
Thursday, March 8, 2012timeline service large sustained QPS for a single timeline
Thursday, March 8, 2012timeline service timeline service timeline service timeline service
Thursday, March 8, 2012timeline service timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
partitioning layer
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
partitioning layer
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
Thursday, March 8, 2012timeline service redis redis redis redis timeline cache timeline cache timeline cache timeline cache timeline service timeline service timeline service
in-process cache
Thursday, March 8, 2012timeline service
Thursday, March 8, 2012timeline cache timeline service
Thursday, March 8, 2012timeline cache timeline service
Thursday, March 8, 2012timeline cache timeline service
Thursday, March 8, 2012timeline cache timeline service
detects high-frequency requests
Thursday, March 8, 2012timeline cache timeline service in-proc cache
detects high-frequency requests
Thursday, March 8, 2012HTTP Proxy
Thursday, March 8, 2012HTTP Proxy tweet API
Thursday, March 8, 2012HTTP Proxy tweet API queue
Thursday, March 8, 2012HTTP Proxy tweet API queue ingester
Thursday, March 8, 2012HTTP Proxy tweet API queue search index search index search index search index search index ingester
Thursday, March 8, 2012HTTP Proxy tweet API queue search index search index search index search index search index ingester
Thursday, March 8, 2012search API HTTP Proxy tweet API queue search index search index search index search index search index ingester
Thursday, March 8, 2012search API search blender HTTP Proxy tweet API queue search index search index search index search index search index ingester
Thursday, March 8, 2012search API search blender HTTP Proxy tweet API queue search index search index search index search index search index ingester user service
Thursday, March 8, 2012search index search index search index search index search index
Thursday, March 8, 2012search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index
Thursday, March 8, 2012search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index
New Tweet
Thursday, March 8, 2012search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search blender
Thursday, March 8, 2012search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search index search blender search blender search blender search blender
Thursday, March 8, 2012search index search index search index search index search blender search blender search blender search blender
Thursday, March 8, 2012search index search index search index search index search blender search blender search blender search blender
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Durable Stores
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
URL expansion
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
URL expansion
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
URL expansion
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
URL expansion
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Geo
Durable Stores
URL expansion
Thursday, March 8, 2012⇢connection management ⇢protocol codecs ⇢transient error handling ⇢distributed tracing ⇢service discovery ⇢observability
HTTP Proxy timeline API
Thursday, March 8, 2012⇢connection management ⇢protocol codecs ⇢transient error handling ⇢distributed tracing ⇢service discovery ⇢observability
HTTP Proxy timeline API
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012ClientBuilder() .cluster(TimelineServiceCluster) .hostConnectionCoresize(5) .hostConnectionLimit(10) .hostConnectionIdleTime(5.seconds) .failureAccrualParams(5, 10.seconds) .retries(3) .timeout(500.milliseconds)
Thursday, March 8, 2012⇢connection management ⇢protocol codecs ⇢transient error handling ⇢distributed tracing ⇢service discovery ⇢observability
HTTP Proxy timeline API
Thursday, March 8, 2012⇢connection management ⇢protocol codecs ⇢transient error handling ⇢distributed tracing ⇢service discovery ⇢observability
HTTP Proxy timeline API
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache HTTP
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache HTTP Thrift
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache HTTP Thrift Thrift
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache HTTP Thrift Thrift Redis
Thursday, March 8, 2012⇢connection management ⇢protocol codecs ⇢transient error handling ⇢distributed tracing ⇢service discovery ⇢observability
HTTP Proxy timeline API
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Thursday, March 8, 2012tweet service user service HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache
Thursday, March 8, 2012search API search blender HTTP Proxy tweet API queue search index search index search index search index search index ingester user service
Thursday, March 8, 2012Aggregate
Thursday, March 8, 2012hello world
Redis Lucene
@sam @frank
@joe: hello world
Thursday, March 8, 2012Redis Lucene
@sam hello
1726371 1615234 1371241 1012357 1726371 1415044 1056831 98124
Thursday, March 8, 2012"QCon London" @sam's home timeline User Intent
Thursday, March 8, 2012"QCon London"
"QCon" AND "London"
@sam's home timeline User Intent Query Expansion
Thursday, March 8, 2012"QCon London"
"QCon" AND "London"
@sam's home timeline
"home_timeline:@sam"
User Intent Query Expansion
Thursday, March 8, 2012"QCon London"
"QCon" AND "London"
Search Index
@sam's home timeline
"home_timeline:@sam"
Redis
User Intent Query Expansion
Thursday, March 8, 2012"QCon London"
"QCon" AND "London"
Search Index
@sam's home timeline
"user_timeline:@joe" OR "user_timeline:@frank"
Redis
User Intent Query Expansion
union of timelines
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Fan-in ???
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Fan-in ???
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in ???
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in Low to High O(N) ???
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in Low to High O(N) Low O(1) ???
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in Low to High O(N) Low O(1) Hybrid
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in Low to High O(N) Low O(1) Hybrid Low
Thursday, March 8, 2012Delivery Type Read-time Cost Write-time Cost
Fan-out Low O(1) Low to High O(N) Fan-in Low to High O(N) Low O(1) Hybrid Low Low to Medium
Thursday, March 8, 2012@sam's home timeline
"home_timeline:@sam"
Redis
Thursday, March 8, 2012@sam's home timeline
"home_timeline:@sam" OR "user_timeline:@barackobama"
Redis
Thursday, March 8, 2012search API search blender tweet API queue search index search index search index search index search index ingester
Thursday, March 8, 2012search API search blender tweet API queue search index search index search index search index search index ingester high-freq searches redis
Thursday, March 8, 2012"Super Bowl"
"Super" AND "Bowl"
Search Index
Thursday, March 8, 2012"Super Bowl"
"Super Bowl"
Redis
Thursday, March 8, 2012home_timeline:12512351 home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
home_timeline:12512351 home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
home_timeline:12512351 home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
home_timeline:12512351 home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
home_timeline:12512351 home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
home_timeline:14653230 home_tiimeline:6014086 home_timeline:15123512
hello QCon London world
hello QCon London world
hello QCon London world
hello QCon London world
hello QCon London world
HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Thursday, March 8, 2012HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search API search blender search index search index search index search index search index ingester
Thursday, March 8, 2012ingester search blender search API HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search index search index search index search index search index
Thursday, March 8, 2012ingester search blender search API HTTP Proxy tweet API timeline service timeline API redis redis redis redis tweet daemon queue fanout delivery timeline cache search index search index search index search index search index
Thursday, March 8, 2012