Slide 1

Slide 1 text

CREATING MOBILE APPS IN A BACKEND-AS-A-SERVICE WORLD LOOK, MA: NO SERVER! CLAY SMITH, NEW RELIC - DEVFEST VIENNA 2015 @SMITHCLAY

Slide 2

Slide 2 text

LOOK MA, NO SERVER! ABOUT ME Web App Dev Mobile Dev burritos Dev Advocate @ New Relic

Slide 3

Slide 3 text

LOOK MA, NO SERVER! AGENDA THE 2015 APP MODERN BACKENDS INTRO TO BAAS EVENT-DRIVEN BAAS PERFORMANCE

Slide 4

Slide 4 text

THE 2015 APP

Slide 5

Slide 5 text

MULTIPLATFORM

Slide 6

Slide 6 text

INTERNATIONAL

Slide 7

Slide 7 text

COOLSENSORS

Slide 8

Slide 8 text

SUPERRESPONSIVE

Slide 9

Slide 9 text

CONNECTED CC flickr.com/photos/hernanpc/18954719651

Slide 10

Slide 10 text

YEAR EXABYTES MOBILE DATA* *Google "mobile data growth" for a real graph.

Slide 11

Slide 11 text

LOOK MA, NO SERVER! COMMON APP NETWORK REQUESTS ▸ API Requests (3rd-party or internal) ▸ Analytics ▸ Static Content ▸ Images ▸ Video ▸ Audio CC0 stock.tookapic.com/photos/20932

Slide 12

Slide 12 text

PUSHNOTIFICATIONS

Slide 13

Slide 13 text

APP BACKENDS MAKING YOUR MOBILE DREAMS A REALITY

Slide 14

Slide 14 text

REMEMBER THESE? CC flickr.com/photos/dominichargreaves/2345869796

Slide 15

Slide 15 text

IAAS, AT YOUR SERVICE CC flickr.com/photos/doctorow/14574108306 IT'S ALL IN THE CLOUD

Slide 16

Slide 16 text

LOOK MA, NO SERVER NOT SHOWN IN PREVIOUS DIAGRAM ▸ Security ▸ Server Provisioning ▸ Deploying ▸ Monitoring and Alerting ▸ Scaling

Slide 17

Slide 17 text

PAAS, PLEASE DON'T WANT TO WORRY ABOUT INFRASTRUCTURE?

Slide 18

Slide 18 text

git push PaaS master MAGIC!

Slide 19

Slide 19 text

MOST OF YOU ARE FAMILIAR WITH THE VIRTUES OF A PROGRAMMER... LAZINESS, IMPATIENCE, AND HUBRIS Larry Wall, creator of Perl LOOK MA, NO SERVER!

Slide 20

Slide 20 text

WE ARE MOVING TO VERY HIGH-LEVEL ABSTRACTIONS FOR APP BACKENDS CC flickr.com/photos/veljovic/15738348069

Slide 21

Slide 21 text

VERY HIGH-LEVEL ABSTRACTIONS != EASIER

Slide 22

Slide 22 text

BACKEND AS A SERVICE A THING SINCE ~2011

Slide 23

Slide 23 text

YE OLDE BACKEND

Slide 24

Slide 24 text

TRADITIONAL VERY SIMPLIFIED WEB APP ARCHITECTURE

Slide 25

Slide 25 text

NEW STUFF BACKEND AS A SERVICE

Slide 26

Slide 26 text

"A MODEL FOR PROVIDING... DEVELOPERS WITH A WAY TO LINK THEIR APP TO BACKEND CLOUD STORAGE AND APIS." Mobile BaaS: Wikipedia Definition CC flickr.com/photos/hrathmann/19646314070

Slide 27

Slide 27 text

STORAGE

Slide 28

Slide 28 text

SINGLESIGNON

Slide 29

Slide 29 text

FANCYCONSOLES

Slide 30

Slide 30 text

MULTIPLATFORM

Slide 31

Slide 31 text

CLIENTLIBRARIES

Slide 32

Slide 32 text

PUSHNOTIFICATIONS

Slide 33

Slide 33 text

REALTIMESTUFF

Slide 34

Slide 34 text

SECURITY?

Slide 35

Slide 35 text

THE BAAS BIG 3*

Slide 36

Slide 36 text

PARSE (FACEBOOK) FOUNDED IN 2011, ACQUIRED IN 2013.

Slide 37

Slide 37 text

FIREBASE (GOOGLE) FOUNDED 2011, ACQUIRED 2014. REALTIME FOCUS.

Slide 38

Slide 38 text

CLOUDKIT (APPLE) "ICLOUD FOR DEVELOPERS" - DONE THE APPLE WAY

Slide 39

Slide 39 text

LOOK MA, NO SERVER! ALSO WORTH MENTIONING ▸ Apache Usergrid (OSS) ▸ Amazon Mobile Hub (now in beta) ▸ Azure Mobile Web Services (Microsoft) ▸ Kivney, Synaco, Apigee, Appcelerator (and many more).

Slide 40

Slide 40 text

LOOK MA, NO SERVER! HOW BAAS PROVIDERS MATURE (TYPICALLY) DATABASE AUTHENTICATION EVERYTHING ELSE

Slide 41

Slide 41 text

LOOK MA, NO SERVER! IMPORTANT BAAS METRICS ($) ▸ Number of requests per minute ▸ Data transfer (network I/O) ▸ Storage cost (persistence) ▸ Database ▸ Assets (Images, Audio, Video, etc)

Slide 42

Slide 42 text

PRACTICAL BAAS FOR A SIMPLE APP LET'S SEE SOME CODE! CC flickr.com/photos/hackny/6890140478

Slide 43

Slide 43 text

LOOK MA, NO SERVER! SOME ASSEMBLY REQUIRED - ANDROID dependencies { compile 'com.parse.bolts:bolts-android:1.+' compile 'com.parse:parse-android:1.+' } dependencies { compile 'com.firebase:firebase-client-android:2.4.0+' } FIREBASE PARSE firebase.com/docs/android/quickstart.html parse.com/apps/quickstart

Slide 44

Slide 44 text

LOOK MA, NO SERVER! SOME INITIALIZATION REQUIRED - INITIALIZATION (ANDROID) Parse.initialize(this, "api-key", "client-key"); // Activity#onCreate Firebase.setAndroidContext(this); // Activity#onCreate Firebase myFirebaseRef = new Firebase("https://my-app.firebaseio.com/"); FIREBASE PARSE firebase.com/docs/android/quickstart.html parse.com/apps/quickstart

Slide 45

Slide 45 text

AUTH MORE THAN USER + PASS CC flickr.com/photos/111692634@N04/11406965045

Slide 46

Slide 46 text

LOOK MA, NO SERVER! SINGLE-SIGN ON SUPPORT Type Parse Firebase CloudKit Facebook Y Y N Google N Y N Username/Pass Y Y N Anonymous Y Y Y* Twitter Y Y N Github N Y N iCloud N N Y OAuth Y Y N * Based on publicly available documentation as of 11/6/2015.

Slide 47

Slide 47 text

LOOK MA, NO SERVER! ANONYMOUS AUTH - ANDROID ParseUser.enableAutomaticUser(); ParseUser.getCurrentUser(); // Exists! // ref is a reference to your Firebase URL ref.authAnonymously(new Firebase.AuthResultHandler() { // ... } ); FIREBASE PARSE firebase.com/docs/android/quickstart.html parse.com/apps/quickstart

Slide 48

Slide 48 text

LOOK MA, NO SERVER! PARSE COOLNESS: CONVERTING AN ANONYMOUS USER TO REAL USER ParseAnonymousUtils.isLinked(ParseUser.getCurrentUser())

Slide 49

Slide 49 text

LOOK MA, NO SERVER! USERNAME/PASSWORD AUTH - ANDROID ParseUser user = new ParseUser(); user.setUsername("username"); user.setPassword("pass"); user.setEmail("[email protected]"); user.signUpInBackground(); // ref is a reference to your Firebase URL ref.createUser("[email protected]", "pass", new Firebase.ValueResultHandler>() { // callbacks }); FIREBASE PARSE

Slide 50

Slide 50 text

DATA PERSIST ALL THE THINGS CC flickr.com/photos/rh2ox/9990024683

Slide 51

Slide 51 text

LOOK MA, NO SERVER! YESTERSPRINT: AN EXAMPLE SPRINT RETROSPECTIVE APP

Slide 52

Slide 52 text

LOOK MA, NO SERVER! PARSE - CREATING AND FETCHING ParseObject newRetro = new ParseObject("Retro");
 newRetro.put("createdBy", ParseUser.getCurrentUser()); // Creates a retrospective to many users relationship.
 newRetro.getRelation("members").add(ParseUser.getCurrentUser());
 newRetro.saveInBackground(); ParseQuery query = ParseQuery.getQuery("Retro");
 query.whereEqualTo("members", ParseUser.getCurrentUser());
 // Execute query in background thread
 query.findInBackground(new FindCallback() { // ... } ); FETCHING CREATING

Slide 53

Slide 53 text

LOOK MA, NO SERVER! FIREBASE - CREATING AND FETCHING Firebase retroRef = ref.child("retros"); Map newRetro = new HashMap(); newRetro.put("createdBy", "clay"); retroRef.push().setValue(newRetro); FETCHING CREATING ref.child("user/clay/retros").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snap) { } @Override public void onCancelled(FirebaseError error) { } });

Slide 54

Slide 54 text

LOOK MA, NO SERVER! REALTIME EVENTS SIDEBAR - HOW DO THEY DO IT? ▸ CloudKit: Uses Apple Push Notifications ▸ Firebase: Uses websockets ▸ Parse: good old fashioned HTTP.

Slide 55

Slide 55 text

ALL FIREBASE DATABASE DATA IS STORED AS JSON OBJECTS. THERE ARE NO TABLES OR RECORDS. firebase.com/docs/android/guide/understanding-data.html LOOK MA, NO SERVER!

Slide 56

Slide 56 text

LOOK MA, NO SERVER! OFFLINE READY Parse.enableLocalDatastore(this); // must be called before Parse.initialize()! retrospective.saveEventually(); // when the network is available, it will save. FIREBASE PARSE // Automagic... mostly. Firebase.getDefaultConfig().setPersistenceEnabled(true); // between app restarts

Slide 57

Slide 57 text

LOOK MA, NO SERVER! UI HELPERS TO MAKE IT SUPER EASY ▸ ParseQueryAdapter - Connects a list of parse data to an Android ListView (ParseUI-Android) ▸ FirebaseListAdapter - Same for Firebase (FirebaseUI- Android) CC flickr.com/photos/groovenite

Slide 58

Slide 58 text

LOOK MA, NO SERVER! NOT DISCUSSED (FURTHER READING SUGGESTED) ▸ Authorization - who gets what ▸ Geo data (both Parse and Firebase) ▸ Push Notifications (Parse only) ▸ Analytics (Parse only)

Slide 59

Slide 59 text

EVENT-DRIVEN BAAS

Slide 60

Slide 60 text

WEBHOOKS ARE "USER-DEFINED HTTP CALLBACKS" en.wikipedia.org/wiki/Webhook CC https://www.flickr.com/photos/versageek

Slide 61

Slide 61 text

AN EVENT IS A SIGNIFICANT CHANGE IN THE STATE OF THE UNIVERSE. K. Mani Chandy, "Towards a Theory of Events" LOOK MA, NO SERVER!

Slide 62

Slide 62 text

LOOK MA, NO SERVER! WEBHOOKS: EVERYTHING BECOMES EVENT-DRIVEN

Slide 63

Slide 63 text

LOOK MA, NO SERVER! PARSE: WEBHOOKS AND CLOUD CODE ▸ webhooks: a URL gets hit when beforeSave and afterSave gets called on a ParseObject ▸ Cloud Code: custom endpoints, triggers. ▸ Static hosting and Heroku support, too. CC flickr.com/photos/infomastern/14719723237

Slide 64

Slide 64 text

LOOK MA, NO SERVER! FIREBASE EVENT-DRIVEN APPROACH USING THEIR NODE.JS CLIENT ▸ Node.js server listens for events using the firebase node library, then *does other stuff* ▸ More code, but still really useful. ▸ https://github.com/firebase/flashlight (Firebase Elastic Search) ▸ New: Google Cloud modules.

Slide 65

Slide 65 text

LOOK MA, NO SERVER! AMAZON WEB SERVICES: "CLOUD LOGIC" IN MOBILE HUB (IN BETA) ▸ Exposes AWS Lambda Functions easily to mobile apps. ▸ Lambda: event driven, integrates with other major AWS services. ▸ Write once, run on multiple platforms. ▸ Current (late 2015) languages: node.js, python, java.

Slide 66

Slide 66 text

LOOK MA, NO SERVER! PARSE - RUNNING A CLOUD CODE FUNCTION (JAVA/ANDROID) ParseCloud.callFunctionInBackground("myAwesomeFn", params, new FunctionCallback() { public void done(Object object, ParseException e) { // TODO: Handle response } } LOOK MA, NO BACKEND!

Slide 67

Slide 67 text

PERFORMANCE HOW BAAS DOES IN REAL LIFE... CC flickr.com/photos/monthouphoto

Slide 68

Slide 68 text

LAZY BENCHMARKING

Slide 69

Slide 69 text

LOOK MA, NO SERVER! TEST: SET {"FOO":"BAR"} IN PARSE OR FIREBASE'S DATABASE ▸ Track how long it takes to get a success response for the server. ▸ Run the operation in JavaScript, track with a simple timer. ▸ Run the code in Singapore, Sydney, Sao Paulo, Dublin, Frankfurt, Washington DC and San Francisco.

Slide 70

Slide 70 text

LOOK MA, NO SERVER1 NEW RELIC SYNTHETICS SCRIPT (I.E. SELENIUM) WEB PAGE (USING BAAS JAVASCRIPT SDKS) CREATE OBJ PARSE API FIREBASE API PUSH INSIGHTS (NRDB = METRICS DATABASE) CREATE OBJ SYNTHETICS (RUNS A WEB PAGE IN DIFFERENT PLACES)

Slide 71

Slide 71 text

MILLISECONDS

Slide 72

Slide 72 text

MILLISECONDS

Slide 73

Slide 73 text

TL;DR: BE AWARE OF GEOGRAPHY

Slide 74

Slide 74 text

LOOK MA, NO SERVER! FREE PLAN COMPARISON (IT'S DIFFICULT TO UNDERSTAND) Type Parse Firebase* CloudKit* File Transfer 2 TB 100 GB 2 GB File Storage 20 GB 1 GB 10 GB Database Storage 20 GB 1 GB 100 MB Requests per sec 30 100 40 * Based on publicly available documentation as of 11/6/2015. CloudKit limits grow with active user count.

Slide 75

Slide 75 text

TO BAAS OR NOT TO BAAS?

Slide 76

Slide 76 text

QUESTIONS? CLAY SMITH, NEW RELIC @SMITHCLAY