Slide 1

Slide 1 text

Building light-weight Microservices using Redis Carlos Justiniano – Flywheel Sports

Slide 2

Slide 2 text

• Carlos Justiniano • 2005 World Record in Distributed Computation • Chief Software Architect at Flywheel Sports • Redis since 2011 • @cjus on Twitter, Github • More about me at http://cjus.me About me

Slide 3

Slide 3 text

Light on external complexity and dependencies Not light as in Limited

Slide 4

Slide 4 text

No content

Slide 5

Slide 5 text

Flywheel Sports • Founded in 2010 • Featuring high-energy Indoor Stadium Cycling and Barre classes. • Performance tracking technology • ~1200 employees • 42 Studios across the U.S.

Slide 6

Slide 6 text

• Three studios in the Bay Area • One right here in SF • At Market St in the Financial District Flywheel Sports • Sign up for a free class using the offer code: FLYREDIS

Slide 7

Slide 7 text

• Last summer we prepared to launch FlyAnywhere • Our at home live streaming service. Flywheel Sports

Slide 8

Slide 8 text

Flash back two years …

Slide 9

Slide 9 text

We started thinking about embracing microservices

Slide 10

Slide 10 text

No content

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

No content

Slide 13

Slide 13 text

No content

Slide 14

Slide 14 text

No content

Slide 15

Slide 15 text

No content

Slide 16

Slide 16 text

Embracing microservices at Flywheel

Slide 17

Slide 17 text

How hard could it be?

Slide 18

Slide 18 text

%QPVCKPGTK\CVKQP 'PVGTRTKUG5GTXKEG$WU

Slide 19

Slide 19 text

Wow that’s a lot to grok!

Slide 20

Slide 20 text

Lots to learn Small team Limited resources

Slide 21

Slide 21 text

No content

Slide 22

Slide 22 text

No content

Slide 23

Slide 23 text

No content

Slide 24

Slide 24 text

No content

Slide 25

Slide 25 text

We’re not…

Slide 26

Slide 26 text

We’re not… * And chances are you’re not either! *

Slide 27

Slide 27 text

No content

Slide 28

Slide 28 text

But where to begin?

Slide 29

Slide 29 text

No content

Slide 30

Slide 30 text

Feature checklist • Service discovery • Messaging • Load balancing • Health • Presence • Logging • Queuing

Slide 31

Slide 31 text

Wish list • Super easy to use • Ideally a single package • Microservice out of the box?

Slide 32

Slide 32 text

No content

Slide 33

Slide 33 text

Redis as distributed computing glue? • Each microservice binds to a Redis cluster • Presence by key / expiration • IPC via Pub / Sub • Routes via set stores • Microservice features minimal dependencies?

Slide 34

Slide 34 text

• Health and presence • Service discovery • Inter-service (P2P) communication • Load balancing and routing • Self registration with near zero configuration • Job queues Hydra Features

Slide 35

Slide 35 text

Your NodeJS Microservice Hydra module (npmjs.org) Other Node module Other Node module Other Node module Other Node module Your JS code Other Microservice Hydra module (npmjs.org) Other Node module Other Node module Other Node module Other Node module JS code Other Microservice Hydra module (npmjs.org) Other module Other module Other module Other module JS code

Slide 36

Slide 36 text

No content

Slide 37

Slide 37 text

We used Hydra to chisel away at our own monoliths

Slide 38

Slide 38 text

Fast forward 9 months….

Slide 39

Slide 39 text

Smithsonian Museum of the American Indian

Slide 40

Slide 40 text

We open sourced Hydra at the EmpireNode 2016 conference https://npmjs.com/package/hydra | $ npm i hydra

Slide 41

Slide 41 text

No content

Slide 42

Slide 42 text

Demos

Slide 43

Slide 43 text

No content

Slide 44

Slide 44 text

No content

Slide 45

Slide 45 text

No content

Slide 46

Slide 46 text

No content

Slide 47

Slide 47 text

No content

Slide 48

Slide 48 text

No content

Slide 49

Slide 49 text

No content

Slide 50

Slide 50 text

No content

Slide 51

Slide 51 text

No content

Slide 52

Slide 52 text

No content

Slide 53

Slide 53 text

No content

Slide 54

Slide 54 text

Demos Recap

Slide 55

Slide 55 text

Redis Deep Dive • Presence • Health • Service discovery • Routes • Load balancing • Messaging • Queues • Logging • Configuration Management

Slide 56

Slide 56 text

Synergy When the whole is greater than the sum of its parts where: 1 + 1 = 3 ❤

Slide 57

Slide 57 text

Redis key space

Slide 58

Slide 58 text

Redis key space • Prefix: allows for filtering Hydra vs non-Hydra keys • Service Name: filtering keys of a particular service type • Instance ID: filtering keys for a unique service instance • Type: classifies the type of use – i.e. purpose of key Prefix Service Name Instance ID Type * * * Service Name and Instance ID don’t apply in all situations

Slide 59

Slide 59 text

Example key hydra:service:user-svcs:636a68fb1a34493f8fc17fe77d5a1b4b:presence Prefix Service Name Instance ID Type Hydra:service user-svcs 636a68fb1a34493f8fc17fe77d5a1b4b presence

Slide 60

Slide 60 text

Other keys

Slide 61

Slide 61 text

Key Space Recap • Keys organized by segments • Segments can be used to filter queries

Slide 62

Slide 62 text

Presence Is a service available?

Slide 63

Slide 63 text

hydra:service:user-svcs:636a68fb1a34493f8fc17fe77d5a1b4b:presence Prefix Service Name Instance ID Type Hydra:service user-svcs 636a68fb1a34493f8fc17fe77d5a1b4b presence : [STRING] GET, SETEX Presence in Redis

Slide 64

Slide 64 text

No content

Slide 65

Slide 65 text

No content

Slide 66

Slide 66 text

No content

Slide 67

Slide 67 text

Presence Recap • Presence management via key presence

Slide 68

Slide 68 text

Health Is a service healthy?

Slide 69

Slide 69 text

: [STRING] GET, SETEX Health in Redis hydra:service:auth-svcs:1556536eda5e4d9089b56d0d6dd0a081:health Prefix Service Name Instance ID Type Hydra:service auth-svcs 1556536eda5e4d9089b56d0d6dd0a081 health

Slide 70

Slide 70 text

No content

Slide 71

Slide 71 text

No content

Slide 72

Slide 72 text

Health Recap • Per-instance health stats • Managed using a string key with stringified JSON text • Can be used by monitoring apps

Slide 73

Slide 73 text

Service Discovery Where can I find this service?

Slide 74

Slide 74 text

: [HASH] HGET, HSET, HGETALL Service discovery in Redis hydra:service:nodes Prefix Type Hydra:service nodes

Slide 75

Slide 75 text

No content

Slide 76

Slide 76 text

No content

Slide 77

Slide 77 text

No content

Slide 78

Slide 78 text

No content

Slide 79

Slide 79 text

No content

Slide 80

Slide 80 text

No content

Slide 81

Slide 81 text

Service Discovery Recap • ServiceName used to query for service information • Individual services store information using their unique IDs • Managed using Redis Hash – blazing fast!

Slide 82

Slide 82 text

Routes What’s the path to this resource?

Slide 83

Slide 83 text

: [SET] SADD, SMEMBERS Routes in Redis hydra:service:asset-svcs:service:routes Prefix Type Hydra:service service:routes Service Name asset-svcs

Slide 84

Slide 84 text

No content

Slide 85

Slide 85 text

No content

Slide 86

Slide 86 text

Routes Recap • Services can publish their routes to Redis • Individual services store information using their unique IDs • Enables dynamic service aware routing • Managed using a Redis Set

Slide 87

Slide 87 text

Load Balancing Distributing requests / messages among available services

Slide 88

Slide 88 text

Load balancing using Redis : [STRING, HASH, SET] GET, SETEX, HGET, HGETALL, SADD, SMEMBERS hydra:service:nodes Prefix Type Hydra:service nodes hydra:service:asset-svcs:service:routes Prefix Type Hydra:service service:routes Service Name asset-svcs hydra:service:user-svcs:636a68fb1a34493f8fc17fe77d5a1b4b:presence Prefix Service Name Instance ID Type Hydra:service user-svcs 636a68fb1a34493f8fc17fe77d5a1b4b presence

Slide 89

Slide 89 text

Note: scan is used instead of keys and hgets are wrapped in a multi transaction

Slide 90

Slide 90 text

Load Balancing Recap • Works using Presence, service discover and routing features • Redis string, hash and sets make this possible

Slide 91

Slide 91 text

Messaging Communicating with other services

Slide 92

Slide 92 text

: [PUB/SUB] SUBSCRIBE, UNSUBSCRIBE, PUBLISH Messaging in Redis hydra:service:mc:asset-svcs:cb8c96deb5434d5b95f3cd7bcdd6851c Prefix Hydra:service Service Name asset-svcs Instance ID cb8c96deb5434d5b95f3cd7bcdd6851c hydra:service:mc:asset-svcs

Slide 93

Slide 93 text

asset-svcs Hydra module (npmjs.org) code hydra:service:mc:asset-svcs cb8c96deb5434d5b95f3cd7bcdd6851c hydra:service:mc:asset-svcs: cb8c96deb5434d5b95f3cd7bcdd6851c hydra:service:mc:project-svcs: b4d2bbdadb514ea598d9bd08c7aef120 hydra:service:mc:project-svcs project-svcs Hydra module (npmjs.org) code b4d2bbdadb514ea598d9bd08c7aef120

Slide 94

Slide 94 text

No content

Slide 95

Slide 95 text

UMF Messaging Standardizing messaging

Slide 96

Slide 96 text

REQUIRED REQUIRED REQUIRED USER DEFINED

Slide 97

Slide 97 text

client-svcs send message project-svcs receive message

Slide 98

Slide 98 text

How send message works Standardizing messaging

Slide 99

Slide 99 text

more…* * channels are returned as an unordered list consisting of two entries per service

Slide 100

Slide 100 text

Messaging Recap • Needed because services are distributed! • Implemented using Redis Pub / Sub • Standardizing messaging formats is vital

Slide 101

Slide 101 text

Queues Message queues, job queues

Slide 102

Slide 102 text

: [LIST] lpush, rpush, rpoplpush, lrem Queues in Redis hydra:service:imageproc-svcs:mqrecieved Prefix Service Name Type Hydra:service imageproc-svcs mq{bin} hydra:service:imageproc-svcs:mqinprogress hydra:service:imageproc-svcs:mqincomplete

Slide 103

Slide 103 text

item 11 item 8 item 10 item 12 item 9 item 8 item 7 item 6 item 5 item 4 item 3 FIFO mqrecieved mqinprogress mqincomplete lpush item 2 rpoplpush item 1 Item 0 lrem rpush

Slide 104

Slide 104 text

Asset-svcs queues a task for the imageproc-svcs imageproc-svcs dequeues task imageproc-svcs marks task as complete Inter-service Queuing Flow

Slide 105

Slide 105 text

Queuing Recap • Great when we don’t need immediate message responses • Redis Lists using lpush and rpoplpush • Atomic operations FTW • Ease of abstractions at an application level

Slide 106

Slide 106 text

Logging Microservice flight recorder?

Slide 107

Slide 107 text

: [LIST] lrange, lpush, ltrim Logging in Redis hydra:service:imageproc-svcs:1ce584aeee24429891182180fee12f58:health:log Prefix Service Name Instance ID Type Hydra:service imageproc-svcs 1556536eda5e4d9089b56d0d6dd0a081 health:log

Slide 108

Slide 108 text

No content

Slide 109

Slide 109 text

Logging Recap • Necessary because services are distributed • Distributed logging • Redis as a Flight Recorder! • Implemented using lists and the lpush / ltrim commands

Slide 110

Slide 110 text

Configuration Management Storing configs in Redis

Slide 111

Slide 111 text

: [HASH] hget, hset, hkeys Redis for configuration management? hydra:service:imageproc-svcs:configs Prefix Service Name Type Hydra:service imageproc-svcs configs

Slide 112

Slide 112 text

No content

Slide 113

Slide 113 text

No content

Slide 114

Slide 114 text

No content

Slide 115

Slide 115 text

Configuration Management Recap • Redis can be used for configuration management • Statefulness is a concern • Redis Hash indexed by service version with a stringified JSON contents

Slide 116

Slide 116 text

Wow, we’ve covered a lot!

Slide 117

Slide 117 text

No content

Slide 118

Slide 118 text

No content

Slide 119

Slide 119 text

Pulling it all together

Slide 120

Slide 120 text

No content

Slide 121

Slide 121 text

No content

Slide 122

Slide 122 text

No content

Slide 123

Slide 123 text

Thank You @cjus : github / twitter http://cjus.me