Cache, Workers, and Queues

56
Cache, Workers, and Queues

Transcript of Cache, Workers, and Queues

Page 1: Cache, Workers, and Queues

Cache, Workers, and Queues

Page 2: Cache, Workers, and Queues

JMac@gonedark

Page 3: Cache, Workers, and Queues

Tools for your application at scale

Page 4: Cache, Workers, and Queues

JMac != expert

Page 5: Cache, Workers, and Queues
Page 6: Cache, Workers, and Queues
Page 7: Cache, Workers, and Queues

– @gonedark

“Increasing the timeout is not a solution.”

Page 8: Cache, Workers, and Queues

Things that don’t scale

• Repeated, Expensive Operations: queries, calculations, etc…

• Ancillary Operations: sending email, processing uploads, etc…

• Notifications

Page 9: Cache, Workers, and Queues
Page 10: Cache, Workers, and Queues

Optimization

Page 11: Cache, Workers, and Queues

“At some point, optimization doesn’t scale.”

Page 12: Cache, Workers, and Queues

#1 Repeated, Expensive Operations

Page 13: Cache, Workers, and Queues

Queries

Page 14: Cache, Workers, and Queues

“The average WordPress page executes 35 queries.”

Page 15: Cache, Workers, and Queues

– The Audience

“So, what do we do?”

Page 16: Cache, Workers, and Queues
Page 17: Cache, Workers, and Queues

Cache?

Page 18: Cache, Workers, and Queues

Cache == Datastore

Page 19: Cache, Workers, and Queues
Page 20: Cache, Workers, and Queues

Caches

• memcached

• redis

• NCache

• Amazon ElastiCache

• Azure Shared Cache

Page 21: Cache, Workers, and Queues

class User { public getAllUsers() { sql = ‘SELECT * FROM users’ users = datastore.query(sql)

return users } }

Page 22: Cache, Workers, and Queues

class User { public getAllUsers() { users = cache.get(‘alluserkey’) if (users) { return users; }

sql = ‘SELECT * FROM users’ users = datastore.query(sql)

cache.set(‘alluserkey’, users)

return users } }

Page 23: Cache, Workers, and Queues

class UserCache { public getAllUsers() { users = cache.get(‘alluserkey’) if (users) { return users; }

users = super.getAllUsers() cache.set(‘alluserkey’, users)

return users } }

Page 24: Cache, Workers, and Queues

Common Architectures

• together: better utilization of resources, but individual and smaller caches

• standalone: larger, shared cache, but requires additional resources

Page 25: Cache, Workers, and Queues

Considerations

• data size limits per key

• expiration

• stale data

• replication/consistency

Page 26: Cache, Workers, and Queues

#2 Ancillary Operations

Page 27: Cache, Workers, and Queues

Examples

• sending email

• processing images

• recalculations

• system interactions

Page 28: Cache, Workers, and Queues

– The Audience

“So, what do we do?”

Page 29: Cache, Workers, and Queues
Page 30: Cache, Workers, and Queues

Workers

Page 31: Cache, Workers, and Queues

Asynchronous Processes

Page 32: Cache, Workers, and Queues

Workers

• Gearman

• Beanstalkd

• Amazon Simple Queue

• Azure Webjobs?

• You can create a job queue with a datastore…

Page 33: Cache, Workers, and Queues

handleProfileImageUpload(file) { moveFile(file, PROFILE_IMAGE_DIR) createThumbnails(file) }

Page 34: Cache, Workers, and Queues

handleProfileImageUpload(file) { moveFile(file, PROFILE_IMAGE_DIR) createThumbnails(file) }

Page 35: Cache, Workers, and Queues

handleProfileImageUpload(file) { moveFile(file, PROFILE_IMAGE_DIR) JobQueue.push( ‘createThumbnails’, $file ) }

Page 36: Cache, Workers, and Queues

class ProcessImages extends Job { public createThumbnails($file) { // do work } }

Page 37: Cache, Workers, and Queues

Common Architectures

• together: shared resources, but might be risky resource intensive jobs

• standalone: separate resources, but requires additional resources

Page 38: Cache, Workers, and Queues

Considerations• complexity

• asynchronicity

• idempotency

• failure

• additional resources

• environmental difference

Page 39: Cache, Workers, and Queues

#2 Notifications

Page 40: Cache, Workers, and Queues

Examples

• system

• in-app

• user

• third-party

Page 41: Cache, Workers, and Queues
Page 42: Cache, Workers, and Queues

– The Audience

“So, what do we do?”

Page 43: Cache, Workers, and Queues

Message Queues

Page 44: Cache, Workers, and Queues

Pub/Sub

Page 45: Cache, Workers, and Queues
Page 46: Cache, Workers, and Queues

Publish/Subscribe

Page 47: Cache, Workers, and Queues

Broadcasting

Page 48: Cache, Workers, and Queues

Messaging Queues

• RabbitMQ

• ActiveMQ

• *MQ

• redis

Page 49: Cache, Workers, and Queues
Page 50: Cache, Workers, and Queues
Page 51: Cache, Workers, and Queues

getNotifications() { notifications = []

// [‘user134.*’, ‘user567.birthday’] foreach(user.channels as channel) { messages = MQ.read(channel)

if (messages) { notifications.push(messages) } }

return notifications }

Page 52: Cache, Workers, and Queues

Common Architectures

• together: shared resources, but might be a single point of failure

• standalone: redundancy, but requires additional resources

Page 53: Cache, Workers, and Queues

Considerations• additional resources, environmental concerns,

complexity

• protocols

• data coupling

• message delivery

• “broadcast storms”

• redundancy

Page 54: Cache, Workers, and Queues

Cache, Workers, and Queues

Page 55: Cache, Workers, and Queues

Questions

Page 56: Cache, Workers, and Queues

Thanks!@gonedark