The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event...

88
The events must flow Lessons learnt from evolving the Spotify’s event delivery system

Transcript of The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event...

Page 1: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

The events must flowLessons learnt from evolving the Spotify’s event delivery system

Page 2: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2Proprietary & Confidential

Page 3: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Agenda

● Introduction Spotify’s event delivery system

● System generations● Lessons learnt

Page 4: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation
Page 5: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Page 6: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

Page 7: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

Page 8: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

Page 9: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

Page 10: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

Page 11: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Collect & Deliver

250 billion events per day

Page 12: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

What’s the event delivery?

Spotify’s event delivery

Distributed Storage

Page 13: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3 Generations

Page 14: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Based on sftp

3 Generations

Page 15: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Based on sftp

3 Generations

Based on Kafka 0.7

Page 16: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Based on sftp

3 Generations

Based on Kafka 0.7

Based on Google CloudPub/Sub

Page 17: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st GenerationBased on sftp

Page 18: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2008

Thousands of users

Few millions

5 markets

Royalties payments and reportingTrending trackingBillboards chartsData driven features

Page 19: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st Generation Architecture

service

syslog Event 1

Event 2

Page 20: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st Generation Architecture

service

syslog Event 1

Event 2

Page 21: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st Generation Architecture

service

syslog

sftp Collector

Event 1

Event 2

Page 22: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st Generation Architecture

service

syslog

sftp Collector

Event 1

Event 2

Page 23: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1st Generation Architecture

service

syslog

sftp Collector

Event 1

Event 2

M/RPost Process

Page 24: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Event delivery is not a critical system

1st Generation Pros

Page 25: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Event delivery is not a critical system

● Decoupling between○ Producers○ Delivery system○ Consumers

1st Generation Pros

Page 26: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Event delivery is not a critical system

● Decoupling between○ Producers○ Delivery system○ Consumers

● Simple○ Mainly copying files

1st Generation Pros

Page 27: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Some silent failures scenarios

1st Generation Cons

Page 28: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Some silent failures scenarios● Service level objectives (SLO)

1st Generation Cons

Page 29: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Some silent failures scenarios● Service level objectives (SLO)● Single point of failure

1st Generation Cons

Page 30: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Some silent failures scenarios● Service level objectives (SLO)● Single point of failure● Pets instead of cattle

1st Generation Cons

Page 31: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 1

Simple systems can get you a long way

Page 32: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 1

Simple systems can get you a long way...until it breaks!

Page 33: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationBased on Kafka 0.7

Page 34: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2013

24 million ~15 billion events per day

55 markets

Royalties payments and reportingTrending trackingBillboards chartsData driven features

Page 35: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog Event 1

Event 2

Page 36: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher

Event 1

Event 2

Page 37: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher data

Event 1

Event 2

Page 38: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher Consumerdata

Event 1

Event 2

Page 39: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher Consumerdata

ack Event 1

Event 2

Page 40: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher Consumerdata

ack Event 1

Event 2

M/RPost Process

Page 41: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher Consumerdata

ack Event 1

Event 2

M/RPost Process

Grouper

real timechecks

liveness

Page 42: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Support real-time use cases (~)

2nd Generation Pros

Page 43: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Support real-time use cases (~)● Increased scalability

2nd Generation Pros

Page 44: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate

2nd Generation Cons

Page 45: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate○ End to end acks hides bottlenecks

2nd Generation Cons

Page 46: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate○ End to end acks hides bottlenecks○ 100% timely delivery

2nd Generation Cons

Page 47: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate○ End to end acks hides bottlenecks○ 100% timely delivery

● Benefits are not visible to the downstreams consumers

2nd Generation Cons

Page 48: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate○ End to end acks hides bottlenecks○ 100% timely delivery

● Benefits are not visible to the downstreams consumers○ No improvements to SLOs

2nd Generation Cons

Page 49: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Complicated to operate○ End to end acks hides bottlenecks○ 100% timely delivery

● Benefits are not visible to the downstreams consumers○ No improvements to SLOs○ System was about moving bits

2nd Generation Cons

Page 50: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 2

You might focus on the wrong issuewithout owning the whole problem

Page 51: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationIncremental improvements

● One team owns event delivery*

Page 52: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationIncremental improvements

● One team owns event delivery*● SLOs improvements

Page 53: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationIncremental improvements

● One team owns event delivery*● SLOs improvements

○ End to end monitoring

Page 54: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationIncremental improvements

● One team owns event delivery*● SLOs improvements

○ End to end monitoring○ Rewrite of slows components

Page 55: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd GenerationIncremental improvements

● One team owns event delivery*● SLOs improvements

○ End to end monitoring○ Rewrite of slows components○ Interface simplifications

Page 56: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Motivations for 3rd Generation

● Create a simpler system○ pub/sub system with replication

Page 57: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Motivations for 3rd Generation

● Create a simpler system○ pub/sub system with replication

● Event isolation

Page 58: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Motivations for 3rd Generation

● Create a simpler system○ pub/sub system with replication

● Event isolation● Focus on the data that counts

○ Only transmit valid events

Page 59: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

service

syslog

Publisher Consumerdata

ack Event 1

Event 2

M/RPost Process

Page 60: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2nd Generation Architecture

syslog

Publisher Consumerdata

ack Event 1

Event 2

M/RPost Process

service

Page 61: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2015

Page 62: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2015

Page 63: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 3

Make sure you have a reliable and stable system before focusing on a new one

Page 64: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 4

Get support by offloadingcross cutting concerns to other teams

Page 65: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Based on Google Cloud Pub/Sub

3rd Generation

Page 66: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

2016

100 million ~120 billion events per day

59 markets

Royalties payments and reportingTrending trackingBillboards chartsData driven features

Page 67: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3rd Generation Architecture

service

syslog

Publisher

Event 1 Event 2 Event 3

Page 68: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3rd Generation Architecture

service

syslog

Publisher

Event 1 Event 2 Event 3

Service

Page 69: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3rd Generation Architecture

service

syslog

Publisher

Event 1 Event 2 Event 3

Service

Page 70: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3rd Generation Architecture

service

syslog

Publisher

Event 1 Event 2 Event 3

Service Consumer

Consumer

Consumer

Page 71: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

3rd Generation Architecture

service

syslog

Publisher Service Consumer

Consumer

Consumer

Event 1

M/RDedup

Event 2

M/RDedup

Event 3

M/RDedup

Page 72: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Simplified system

3rd Generation Pros

Page 73: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Simplified system● Easier to operate

○ Managed infrastructure

3rd Generation Pros

Page 74: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Simplified system● Easier to operate

○ Managed infrastructure● Next order of magnitude of scale

3rd Generation Pros

Page 75: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Simplified system● Easier to operate

○ Managed infrastructure● Next order of magnitude of scale● Events, not bits

○ Isolation○ Ownership

3rd Generation Pros

Page 76: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Death by thousand papercuts

3rd Generation Cons

Page 77: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Death by thousand papercuts○ Early stages tools

3rd Generation Cons

Page 78: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Death by thousand papercuts○ Early stages tools○ All events were treated equally

3rd Generation Cons

Page 79: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

● Death by thousand papercuts○ Early stages○ All events were treated equally

● Still relying on syslog, enforcing stateful components

3rd Generation Cons

Page 80: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Learning 5

Improve your life by focusing on what matters

Page 81: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

The journey continuesRelying on syslog is still a problem

Page 82: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Lessons learnt recap

Page 83: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1. Keep it simple

Lessons learnt recap

Page 84: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1. Keep it simple2. Own the whole problem

Lessons learnt recap

Page 85: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1. Keep it simple2. Own the whole problem3. Stabilize before focusing on a new one

Lessons learnt recap

Page 86: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1. Keep it simple2. Own the whole problem3. Stabilize before focusing on a new one4. Offload cross cutting concerns to other teams

Lessons learnt recap

Page 87: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

1. Keep it simple2. Own the whole problem3. Stabilize before focusing on a new one4. Offload cross cutting concerns to other teams5. Focus on what matters

Lessons learnt recap

Page 88: The events must flow - bigdatadays.ru · Lessons learnt from evolving the Spotify’s event delivery system. 2 Proprietary & Confidential ... Google Cloud Pub/Sub. 1st Generation

Thank [email protected] to join the band? http://spoti.fi/jobs