Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Look ma, no server! Creating mobile apps on backend-as-a-service platforms

Clay Smith
November 28, 2015

Look ma, no server! Creating mobile apps on backend-as-a-service platforms

Clay Smith

November 28, 2015
Tweet

More Decks by Clay Smith

Other Decks in Programming

Transcript

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

    View Slide

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

    View Slide

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

    View Slide

  4. THE 2015 APP

    View Slide

  5. MULTIPLATFORM

    View Slide

  6. INTERNATIONAL

    View Slide

  7. COOLSENSORS

    View Slide

  8. SUPERRESPONSIVE

    View Slide

  9. CONNECTED
    CC flickr.com/photos/hernanpc/18954719651

    View Slide

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

    View Slide

  11. 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

    View Slide

  12. PUSHNOTIFICATIONS

    View Slide

  13. APP BACKENDS
    MAKING YOUR MOBILE DREAMS A REALITY

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  18. git push PaaS master
    MAGIC!

    View Slide

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

    View Slide

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

    View Slide

  21. VERY HIGH-LEVEL
    ABSTRACTIONS != EASIER

    View Slide

  22. BACKEND AS A SERVICE
    A THING SINCE ~2011

    View Slide

  23. YE OLDE BACKEND

    View Slide

  24. TRADITIONAL VERY SIMPLIFIED WEB APP ARCHITECTURE

    View Slide

  25. NEW STUFF
    BACKEND AS A SERVICE

    View Slide

  26. "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

    View Slide

  27. STORAGE

    View Slide

  28. SINGLESIGNON

    View Slide

  29. FANCYCONSOLES

    View Slide

  30. MULTIPLATFORM

    View Slide

  31. CLIENTLIBRARIES

    View Slide

  32. PUSHNOTIFICATIONS

    View Slide

  33. REALTIMESTUFF

    View Slide

  34. SECURITY?

    View Slide

  35. THE BAAS BIG 3*

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  39. 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).

    View Slide

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

    View Slide

  41. 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)

    View Slide

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

    View Slide

  43. 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

    View Slide

  44. 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

    View Slide

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

    View Slide

  46. 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.

    View Slide

  47. 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

    View Slide

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

    View Slide

  49. 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

    View Slide

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

    View Slide

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

    View Slide

  52. 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

    View Slide

  53. 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) { }
    });

    View Slide

  54. 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.

    View Slide

  55. 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!

    View Slide

  56. 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

    View Slide

  57. 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

    View Slide

  58. 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)

    View Slide

  59. EVENT-DRIVEN BAAS

    View Slide

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

    View Slide

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

    View Slide

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

    View Slide

  63. 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

    View Slide

  64. 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.

    View Slide

  65. 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.

    View Slide

  66. 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!

    View Slide

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

    View Slide

  68. LAZY BENCHMARKING

    View Slide

  69. 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.

    View Slide

  70. 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)

    View Slide

  71. MILLISECONDS

    View Slide

  72. MILLISECONDS

    View Slide

  73. TL;DR: BE AWARE OF
    GEOGRAPHY

    View Slide

  74. 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.

    View Slide

  75. TO BAAS OR NOT TO
    BAAS?

    View Slide

  76. QUESTIONS?
    CLAY SMITH, NEW RELIC
    @SMITHCLAY

    View Slide