Top Banner
Breaking the Monolith Microservice Extraction at SoundCloud
56

Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Jun 26, 2020

Download

Documents

dariahiddleston
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Breaking the Monolith

Microservice Extraction at SoundCloud

Page 2: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Soundcloud● 11 hours uploaded every minute● 150 million tracks● 300 million users

2

Page 3: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

History● Rails 2.3● MySQL● S3

3

Page 4: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

What happened then?

4

Page 5: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Success!

5

Page 6: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

History● Rails 2.3● MySQL● AWS● Cassandra● Hadoop● SolR● RabbitMQ

https://developers.soundcloud.com/blog/evolution-of-soundclouds-architecture

6

Page 7: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Still not enough● More servers● Add caching layer● Defer long running tasks to workers

7

Page 8: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Still not enough● Optimize database schema● Introduce read slaves● Dedicated databases for some models

8

Page 9: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Monolith

9

Page 10: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Major pain points● Testing, building and deploying● Dependency hell● “I’d rather not touch this”

10

Page 11: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Rails problems I - No service layer

11

<% Category.all.each do |cat| %> <li><%= cat.name %></li> <% end %>

Page 12: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Rails problems I - No service layer

⇒ Tight coupling with storage layer!

12

<% Category.all.each do |cat| %> <li><%= cat.name %></li> <% end %>

Page 13: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Rails problems II - Active Record Magic

13

class User < ActiveRecord::Base

validates_length_of :username, :within => 2..64 before_save :encrypt_password, :accept_terms_of_use has_many :comments, :dependent => :destroy # ...end

Page 14: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Rails problems II - Active Record Magic

⇒ Easy to write, hard to maintain

14

class User < ActiveRecord::Base

validates_length_of :username, :within => 2..64 before_save :encrypt_password, :accept_terms_of_use has_many :comments, :dependent => :destroy # ...end

Page 15: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Ruby Problems● GIL● Native extensions● Dependency management can be painful

15

Page 16: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3
Page 17: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Extract features as Services● Less painful to maintain● Easy to replace● Fun to build

17

Page 18: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

An Example: Messages● 200 million messages● MySQL database on shared host● Features:

○ embedded sounds○ email notifications○ spam detection

18

Page 19: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Migration Requirements● New schema to support upcoming features● Dedicated database● Zero downtime

19

Page 20: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Chapter 1The Database

Page 21: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Migrating the Schema

21

Page 22: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Migrating the Schema

22

Page 23: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Migrating the Schema

Convenient Dependency Management with @Grapes

23

#!/usr/bin/env groovy

@Grapes([ @Grab(group='org.yaml', module='snakeyaml', version='1.12'), @Grab(group='mysql', module='mysql-connector-java', version='5.1.24')])import groovy.sql.Sqlimport org.yaml.snakeyaml.Yaml

Page 24: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Strategy● Import all messages● Setup cron job to get new messages● Listen to events for updates

24

Page 25: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Chapter 2The Application

Page 26: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Creating a new service

26

Page 27: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Convo● Scala● Twitter Finagle● Scalatra Framework

27

Page 28: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Convo architecture

28

Page 29: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala● Functional● OOP● Static but inferred typing

29

Page 30: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala Joy = Options I

Good bye NullPointerException

30

val opt: Option[String] = params.get("id")

val id: Int = opt.map(id => id.toInt).getOrElse(10)

Page 31: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala Joy = Options II

Safe chaining with for comprehensions

31

for { id <- params.get("id") user <- users.lookup(id) count <- counts.forUser(user) } yield count

Page 32: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala Joy = Pattern Matching

Expressive code with decomposition

32

Urn("soundcloud:users:20") match { case Urn(_, "tracks", _) => None, case Urn(_, "messages", "20") => None, case Urn(_, "users", id) => Some(id) }

Page 33: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala Joy = Functional Goodness

Function arguments and references

33

delete("/playlist/:urn/likes")(destroy)

def destroy(request: Request) = write(request, 200)(repo.deleteLike)

def write (request: Request, statusCode: Int) (f: (UserSession, Urn) => Future[Like]) = { // ...}

Page 34: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Futures!

Page 35: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Finagle● Twitter rpc library on top of Netty● Support for multiple protocols● Future composition

35

Page 36: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Futures

Instance API (excerpt)

36

class Future[A] { def get(): A def map[B](f: A => B): Future[B] def flatMap[B](f: A => Future[B]]): Future[B] def onSuccess(f : A => Unit): Future[A]}

Page 37: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Futures

Object API (excerpt)

37

object Future { def value[A](a: A): Future[A] def exception[A](e: Throwable): Future[A] def collect[A](fs : Seq[Future[A]]): Future[Seq[A]]}

Page 38: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Futures - Examples

Multiple transformations - The ugly way

38

service.getUsers().flatMap { users => service.tracksFor(users).flatMap { tracks => asJson(tracks) }}.onSuccess(json => log(s"found $json"))

Page 39: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Futures - Example

Multiple transformations - The nice way

39

val response = for { users <- service.getUsers() tracks <- service.tracksFor(users) json <- asJson(tracks) } yield json

response.onSuccess(json => log(s"found $json"))

Page 40: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Scala Problems● Implicit conversions● Binary compatibility of libraries● Tooling still not perfect

40

Page 41: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

SBT

Page 42: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

IntelliJ● Code inspection● Debugging● SBT support

42

Page 43: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Chapter 3The Cutover

Page 44: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Integrate Service

44

Page 45: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Integration Risks● Service failure● Data loss after rolling back● Data loss caused by stale clients

45

Page 46: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Integration Risks● Service failure → load testing, A/B testing ● Data loss after rolling back● Data loss caused by stale clients

46

Page 47: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Integration Risks● Service failure → load testing, A/B testing ● Data loss after rolling back → prepare scripts, practice● Data loss caused by stale clients

47

Page 48: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Integration Risks● Service failure → load testing, A/B testing ● Data loss after rolling back → prepare scripts, practice● Data loss caused by stale clients → keep migration running

48

Page 49: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Enable Feature

49

Page 50: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Retire Old Database

50

Page 51: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Convo● 500 million requests per day● 1000 qps during peak time● 5 instances

51

Page 52: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Microservice Problems● Event bus dependency● Maintenance overhead● Distributed tracing

52

Page 53: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Microservices→ Not a silver bullet

53

Page 54: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3
Page 55: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Questions?

Page 56: Microservice Extraction at SoundCloud · Microservice Extraction at SoundCloud. Soundcloud 11 hours uploaded every minute 150 million tracks 300 million users 2. History Rails 2.3

Images● Slide 4,7 - Rails Logo http://en.wikipedia.org/wiki/File:Ruby_on_Rails.svg● Slide 6,51 - Party Cat http://ghostexist.deviantart.com/art/Party-Cat-logo-287986071● Silde 7 - MySQL Logo http://blogwifi.fr/?p=9990● Slide 7 - Hadoop Cop https://svn.apache.org/repos/asf/hadoop/logos/out_rgb/hadoop-security-logo.

jpg● Slide 10 - Hello, My Name Is: http://commons.wikimedia.org/wiki/File:Hello_my_name_is_sticker.

svg● Slide 14 - Sad Panda: http://www.whatsupyasieve.com/2012/09/17/lockout-blues/sad-panda-2/● Slide 16 - Exit Sign: http://logo-kid.com/emergency-exit-sign-left.htm● Slide 22 - Groovy Logo: http://groovy.codehaus.org/images/groovy-logo-medium.png● Slide 20, 25, 44 - Book Page: http://daviddiazolivares.deviantart.com/art/Old-Book-Page-

345869530● Slide 34 - Back to the future: http://i.huffpost.com/gen/1369403/thumbs/o-BACK-TO-THE-FUTURE-

facebook.jpg● Slide 42 - Tommy Lee Jones: http://persephonemagazine.com/2014/04/friday-news-bites-airline-

pranks-gabriel-garcia-marquez-pulitzers-more/film-title-no-country-for-old-men/● Slide 55 - That’s all folks: http://www.hd2wallpapers.com/view/thats_all_folks-1280x800.php

56