Cross-Platform Data Models and API Using Grpc

Total Page:16

File Type:pdf, Size:1020Kb

Cross-Platform Data Models and API Using Grpc Cross-Platform Data Models and API Using gRPC Sebastian Hagedorn, Felix Lamouroux SumUp. A better way to get paid Outline 1. Motivation & Goals 2. Choosing the Right Cross-Platform Technology 3. Introduction to Protocol Buffers and gRPC 4. Collaborative API Design 5. Here Be Dragons SumUp. A better way to get paid Create a Playful & Performant App that Feels Native SumUp. A better way to get paid Starting Point ● Green field: New project, clean slate, no legacy components, engineering-driven decisions ● Team of experienced developers per platform ● Preferred languages: iOS (Swift), Android (Kotlin), Web (Elm), Server-Backend (Go) ● No complex business logic on mobile/desktop clients SumUp. A better way to get paid Goals ● Ensure consistent API usage ● Reduce boilerplate per platform ○ Parsing & serialization ○ Transport layer ● No critical 3rd party dependencies above transport layer ● Integrate seamlessly with native languages & tools SumUp. A better way to get paid Options Considered: JNI/Djinni ● Interfaces defined in platform-agnostic Interface Definition Language (IDL) ● Platform-specific interfaces (Java or C++/Objective-C) are generated ● Service/shared code must be implemented in C++ ● Decided against it: ○ Not usable for web client ○ Our team lacks C++ experience for large/critical code bases ○ Little client-side business logic in our UI-heavy project https://github.com/dropbox/djinni SumUp. A better way to get paid Options Considered: React Native ● Allows cross-platform code (way) beyond data model and networking ● Enables JavaScript developers to write native apps ● Decided against it: ○ Does not help to define a common model unless all components use React Native (backend must use node.js) ○ Our team consists of experienced platform developers (with little JS experience) ○ Does not align with our goal of playful & performant apps SumUp. A better way to get paid Technology Stack: Protocol Buffers ● Binary serialization format developed by Google ● Model types are defined in simple Protobuf language ● Per-platform/per-language code is generated from Proto files ○ Generates interface and implementation for (de)serialization ○ Official support for many languages: Java, Python, Objective-C, C++, Go, Ruby, and C# ○ More can be added via plugins, as Apple did for Swift: https://github.com/apple/swift-protobuf SumUp. A better way to get paid Auto-generated types Golang Java Proto Objective-C Swift code generator available from Apple: https://github.com/apple/swift-protobuf Swift SumUp. A better way to get paid Technology Stack: gRPC ● “A high performance, open-source universal RPC framework" (grpc.io) ● API endpoints are defined in IDL (Protobuf by default) ● Server and client libraries are generated ○ Protobuf handles (de)serialization ○ gRPC handles networking ● Apps call generated endpoint APIs in native language ● gRPC-ProtoRPC generators & runtimes available in Swift and ObjC ○ We chose ObjC for better stability (Swift support is declared experimental) ○ Interdependency between Protobuf (Swift support implemented by Apple) and gRPC (Swift support implemented by official project maintainers): Cannot (necessarily) update components individually ○ Apple uses gRPC-ProtoRPC in private CloudKit server-to-server API SumUp. A better way to get paid Code Speaks Louder than Words SumUp. A better way to get paid Login Example: API Specs (Service) ▪ Support JSON fall-back via proxy ▪ Shared documentation also provided in auto-generated clients. ▪ SumUp. A better way to get paid Login Example: API Specs (Model) SumUp. A better way to get paid Login Example: iOS Callsite (Swift) SumUp. A better way to get paid Login Example: Backend Implementation (Go) SumUp. A better way to get paid Collaborative API Design: Tooling & Setup ● Bridge gap between frontend & backend teams: Design API collaboratively ● Cross-platform API submodule ○ Central source of truth for model and API definitions (Proto files) ○ Tooling to generate code for all platforms (using Makefiles) ○ Integration of runtimes and generated files solved per platform repository ● All developers invited to contribute via Pull Requests to shared API specs ○ On-the-fly code generation allows local iterations ○ Review & verification on all platforms ● Shared vocabulary about types (user, account, profile, …) SumUp. A better way to get paid Don't Let Clients Send Messages With Ignored Fields ▪ Messages that are used in requests should only contain fields that are mutable by the client. ▪ Information about an entity that is only mutable by the server should only be available as part of responses. ▪ Combine messages to decorate them (composition over inheritance) SumUp. A better way to get paid Avoid Duplicate Fields Avoid repeating fields by wrapping decorating messages around existing ones. SumUp. A better way to get paid Here Be Dragons SumUp. A better way to get paid Beware: All Fields are Optional Protocol buffers 3 no longer allows marking fields as required ▪ Makes backwards/forward-compatibility easier: ▪ required fields invalidate the entire message regardless of context ▪ parts of an application could pass around partially-complete messages internally ▪ whole applications might simply be interested in passing message through (see routers) ▪ Ensure that each callsite using a message performs sensible validation (no blanket rejections) ▪ Provide invalid default values to fields if you need to ensure that clients set them explicitly (see enums) ▪ Only validate messages when you care about the content See also: https://capnproto.org/faq.html#how-do-i-make-a-field-required-like-in-protocol-buffers SumUp. A better way to get paid Optionality & Versioning “We’re mitigating [backward and forward compatibility issues] by using Protocol Buffers and controlling most new features with flags, which remain turned off during a partition upgrade, and are enabled only after all hosts are updated.” From Apple’s CloudKit paper (http://www.vldb.org/pvldb/vol11/p540-shraer.pdf) SumUp. A better way to get paid Check Your Defaults ▪ Explicit UNINITIALIZED_* values in enums ensure that unset values are caught ▪ Check if your business logic makes sense for other type defaults, such as empty string or zero integers SumUp. A better way to get paid Enforce Client-Side Non-Optional Values ▪ Linter enforces usage of “convenience” initializers ▪ Unit tests make sure that model changes do not go unnoticed SumUp. A better way to get paid Tooling Quirks ● Custom Makefile to process Proto files ○ Not trivial to write ○ Integration is different per platform/IDE ● Make modifies output file timestamps regardless of content diff ○ Swift compiler re-builds the entire module ○ Solution: Extra script using rsync that only makes actual changes available to Xcode ● Integration of gRPC runtime is not trivial ○ …except when using CocoaPods ● Protobuf optionality is not reflected by ObjC header annotations ○ All properties are force-unwrapped SumUp. A better way to get paid We Are Hiring We are building a product team here in Cologne. ▪ Looking for iOS, Android, Web, Backend, UI/UX design…. ▪ Strong mobile focus with many senior developers. http://sumup.com/careers/ SumUp. A better way to get paid Sebastian Hagedorn Felix Lamouroux iOS Lead Developer Project Lead - New Ventures (and iOS dev) ▪ @hagidd ▪ @felixlamouroux ▪ [email protected][email protected] SumUp. A better way to get paid.
Recommended publications
  • Protolite: Highly Optimized Protocol Buffer Serializers
    Package ‘protolite’ July 28, 2021 Type Package Title Highly Optimized Protocol Buffer Serializers Author Jeroen Ooms Maintainer Jeroen Ooms <[email protected]> Description Pure C++ implementations for reading and writing several common data formats based on Google protocol-buffers. Currently supports 'rexp.proto' for serialized R objects, 'geobuf.proto' for binary geojson, and 'mvt.proto' for vector tiles. This package uses the auto-generated C++ code by protobuf-compiler, hence the entire serialization is optimized at compile time. The 'RProtoBuf' package on the other hand uses the protobuf runtime library to provide a general- purpose toolkit for reading and writing arbitrary protocol-buffer data in R. Version 2.1.1 License MIT + file LICENSE URL https://github.com/jeroen/protolite BugReports https://github.com/jeroen/protolite/issues SystemRequirements libprotobuf and protobuf-compiler LinkingTo Rcpp Imports Rcpp (>= 0.12.12), jsonlite Suggests spelling, curl, testthat, RProtoBuf, sf RoxygenNote 6.1.99.9001 Encoding UTF-8 Language en-US NeedsCompilation yes Repository CRAN Date/Publication 2021-07-28 12:20:02 UTC R topics documented: geobuf . .2 mapbox . .2 serialize_pb . .3 1 2 mapbox Index 5 geobuf Geobuf Description The geobuf format is an optimized binary format for storing geojson data with protocol buffers. These functions are compatible with the geobuf2json and json2geobuf utilities from the geobuf npm package. Usage read_geobuf(x, as_data_frame = TRUE) geobuf2json(x, pretty = FALSE) json2geobuf(json, decimals = 6) Arguments x file path or raw vector with the serialized geobuf.proto message as_data_frame simplify geojson data into data frames pretty indent json, see jsonlite::toJSON json a text string with geojson data decimals how many decimals (digits behind the dot) to store for numbers mapbox Mapbox Vector Tiles Description Read Mapbox vector-tile (mvt) files and returns the list of layers.
    [Show full text]
  • Tencentdb for Tcaplusdb Getting Started
    TencentDB for TcaplusDB TencentDB for TcaplusDB Getting Started Product Documentation ©2013-2019 Tencent Cloud. All rights reserved. Page 1 of 32 TencentDB for TcaplusDB Copyright Notice ©2013-2019 Tencent Cloud. All rights reserved. Copyright in this document is exclusively owned by Tencent Cloud. You must not reproduce, modify, copy or distribute in any way, in whole or in part, the contents of this document without Tencent Cloud's the prior written consent. Trademark Notice All trademarks associated with Tencent Cloud and its services are owned by Tencent Cloud Computing (Beijing) Company Limited and its affiliated companies. Trademarks of third parties referred to in this document are owned by their respective proprietors. Service Statement This document is intended to provide users with general information about Tencent Cloud's products and services only and does not form part of Tencent Cloud's terms and conditions. Tencent Cloud's products or services are subject to change. Specific products and services and the standards applicable to them are exclusively provided for in Tencent Cloud's applicable terms and conditions. ©2013-2019 Tencent Cloud. All rights reserved. Page 2 of 32 TencentDB for TcaplusDB Contents Getting Started Basic Concepts Cluster Table Group Table Index Data Types Read/Write Capacity Mode Table Definition in ProtoBuf Table Definition in TDR Creating Cluster Creating Table Group Creating Table Getting Access Point Information Access TcaplusDB ©2013-2019 Tencent Cloud. All rights reserved. Page 3 of 32 TencentDB for TcaplusDB Getting Started Basic Concepts Cluster Last updated:2020-07-31 11:15:59 Cluster Overview A cluster is the basic TcaplusDB management unit, which provides independent TcaplusDB service for the business.
    [Show full text]
  • Advanced Model Deployments with Tensorflow Serving Presentation.Pdf
    Most models don’t get deployed. Hi, I’m Hannes. An inefficient model deployment import json from flask import Flask from keras.models import load_model from utils import preprocess model = load_model('model.h5') app = Flask(__name__) @app.route('/classify', methods=['POST']) def classify(): review = request.form["review"] preprocessed_review = preprocess(review) prediction = model.predict_classes([preprocessed_review])[0] return json.dumps({"score": int(prediction)}) Simple Deployments @app.route('/classify', methods=['POST']) Why Flask is insufficient def classify(): review = request.form["review"] ● No consistent APIs ● No consistent payloads preprocessed_review = preprocess(review) ● No model versioning prediction = model.predict_classes( ● No mini-batching support [preprocessed_review])[0] ● Inefficient for large models return json.dumps({"score": int(prediction)}) Image: Martijn Baudoin, Unsplash TensorFlow Serving TensorFlow Serving Production ready Model Serving ● Part of the TensorFlow Extended Ecosystem ● Used internally at Google ● Highly scalable model serving solution ● Works well for large models up to 2GB TensorFlow 2.0 ready! * * With small exceptions Deploy your models in 90s ... Export your Model import tensorflow as tf TensorFlow 2.0 Export tf.saved_model.save( ● Consistent model export model, ● Using Protobuf format export_dir="/tmp/saved_model", ● Export of graphs and signatures=None estimators possible ) $ tree saved_models/ Export your Model saved_models/ └── 1555875926 ● Exported model as Protobuf ├── assets (Saved_model.pb)
    [Show full text]
  • Software License Agreement (EULA)
    Third-party Computer Software AutoVu™ ALPR cameras • angular-animate (https://docs.angularjs.org/api/ngAnimate) licensed under the terms of the MIT License (https://github.com/angular/angular.js/blob/master/LICENSE). © 2010-2016 Google, Inc. http://angularjs.org • angular-base64 (https://github.com/ninjatronic/angular-base64) licensed under the terms of the MIT License (https://github.com/ninjatronic/angular-base64/blob/master/LICENSE). © 2010 Nick Galbreath © 2013 Pete Martin • angular-translate (https://github.com/angular-translate/angular-translate) licensed under the terms of the MIT License (https://github.com/angular-translate/angular-translate/blob/master/LICENSE). © 2014 [email protected] • angular-translate-handler-log (https://github.com/angular-translate/bower-angular-translate-handler-log) licensed under the terms of the MIT License (https://github.com/angular-translate/angular-translate/blob/master/LICENSE). © 2014 [email protected] • angular-translate-loader-static-files (https://github.com/angular-translate/bower-angular-translate-loader-static-files) licensed under the terms of the MIT License (https://github.com/angular-translate/angular-translate/blob/master/LICENSE). © 2014 [email protected] • Angular Google Maps (http://angular-ui.github.io/angular-google-maps/#!/) licensed under the terms of the MIT License (https://opensource.org/licenses/MIT). © 2013-2016 angular-google-maps • AngularJS (http://angularjs.org/) licensed under the terms of the MIT License (https://github.com/angular/angular.js/blob/master/LICENSE). © 2010-2016 Google, Inc. http://angularjs.org • AngularUI Bootstrap (http://angular-ui.github.io/bootstrap/) licensed under the terms of the MIT License (https://github.com/angular- ui/bootstrap/blob/master/LICENSE).
    [Show full text]
  • An Evaluation of Tensorflow As a Programming Framework for HPC Applications
    DEGREE PROJECT IN COMPUTER SCIENCE AND ENGINEERING, SECOND CYCLE, 30 CREDITS STOCKHOLM, SWEDEN 2018 An Evaluation of TensorFlow as a Programming Framework for HPC Applications WEI DER CHIEN KTH ROYAL INSTITUTE OF TECHNOLOGY SCHOOL OF ELECTRICAL ENGINEERING AND COMPUTER SCIENCE An Evaluation of TensorFlow as a Programming Framework for HPC Applications WEI DER CHIEN Master in Computer Science Date: August 28, 2018 Supervisor: Stefano Markidis Examiner: Erwin Laure Swedish title: En undersökning av TensorFlow som ett utvecklingsramverk för högpresterande datorsystem School of Electrical Engineering and Computer Science iii Abstract In recent years, deep-learning, a branch of machine learning gained increasing popularity due to their extensive applications and perfor- mance. At the core of these application is dense matrix-matrix multipli- cation. Graphics Processing Units (GPUs) are commonly used in the training process due to their massively parallel computation capabili- ties. In addition, specialized low-precision accelerators have emerged to specifically address Tensor operations. Software frameworks, such as TensorFlow have also emerged to increase the expressiveness of neural network model development. In TensorFlow computation problems are expressed as Computation Graphs where nodes of a graph denote operation and edges denote data movement between operations. With increasing number of heterogeneous accelerators which might co-exist on the same cluster system, it became increasingly difficult for users to program efficient and scalable applications. TensorFlow provides a high level of abstraction and it is possible to place operations of a computation graph on a device easily through a high level API. In this work, the usability of TensorFlow as a programming framework for HPC application is reviewed.
    [Show full text]
  • Towards a Fully Automated Extraction and Interpretation of Tabular Data Using Machine Learning
    UPTEC F 19050 Examensarbete 30 hp August 2019 Towards a fully automated extraction and interpretation of tabular data using machine learning Per Hedbrant Per Hedbrant Master Thesis in Engineering Physics Department of Engineering Sciences Uppsala University Sweden Abstract Towards a fully automated extraction and interpretation of tabular data using machine learning Per Hedbrant Teknisk- naturvetenskaplig fakultet UTH-enheten Motivation A challenge for researchers at CBCS is the ability to efficiently manage the Besöksadress: different data formats that frequently are changed. Significant amount of time is Ångströmlaboratoriet Lägerhyddsvägen 1 spent on manual pre-processing, converting from one format to another. There are Hus 4, Plan 0 currently no solutions that uses pattern recognition to locate and automatically recognise data structures in a spreadsheet. Postadress: Box 536 751 21 Uppsala Problem Definition The desired solution is to build a self-learning Software as-a-Service (SaaS) for Telefon: automated recognition and loading of data stored in arbitrary formats. The aim of 018 – 471 30 03 this study is three-folded: A) Investigate if unsupervised machine learning Telefax: methods can be used to label different types of cells in spreadsheets. B) 018 – 471 30 00 Investigate if a hypothesis-generating algorithm can be used to label different types of cells in spreadsheets. C) Advise on choices of architecture and Hemsida: technologies for the SaaS solution. http://www.teknat.uu.se/student Method A pre-processing framework is built that can read and pre-process any type of spreadsheet into a feature matrix. Different datasets are read and clustered. An investigation on the usefulness of reducing the dimensionality is also done.
    [Show full text]
  • Datacenter Tax Cuts: Improving WSC Efficiency Through Protocol Buffer Acceleration
    Datacenter Tax Cuts: Improving WSC Efficiency Through Protocol Buffer Acceleration Dinesh Parimi William J. Zhao Jerry Zhao University of California, Berkeley University of California, Berkeley University of California, Berkeley [email protected] william [email protected] [email protected] Abstract—According to recent literature, at least 25% of cycles will serialize some set of objects stored in memory to a in a modern warehouse-scale computer are spent on common portable format defined by the protobuf compiler (protoc). “building blocks” [1]. Referred to by Kanev et al. as a “datacenter The serialized objects can be sent to some remote device, tax”, these tasks are prime candidates for hardware acceleration, as even modest improvements here can generate immense cost which will then deserialize the object into its own memory and power savings given the scale of such systems. to execute on. Thus protobuf is widely used to implement One of these tasks is protocol buffer serialization and parsing. remote procedure calls (RPC), since it facilitates the transport Protocol buffers are an open-source mechanism for representing of arguments across a network. Protobuf remains the most structured data developed by Google, and used extensively in popular serialization framework due to its maturity, backwards their datacenters for communication and remote procedure calls. While the source code for protobufs is highly optimized, certain compatibility, and extensibility. Specifically, the encoding tasks - such as the compression/decompression of integer fields scheme enables future changes to the protobuf schema to and the encoding of variable-length strings - bottleneck the remain backwards compatible. throughput of serializing or parsing a protobuf.
    [Show full text]
  • From XML to Flat Buffers: Markup in the Twenty-Teens Warning! the Contenders
    Elliotte Rusty Harold [email protected] August 2018 From XML to Flat Buffers: Markup in the Twenty-teens Warning! The Contenders ● XML ● JSON ● YAML ● EXI ● Protobufs ● Flat Protobufs XML JSON YAML EXI Protobuf Flat Buffers App Engine X X Standard Java App Engine X Flex What Uses What Kubernetes X X From technology, tools, and systems Eclipse X I use frequently. There are many others. Maven X Ant X Google X X X X X “APIs” Publishing X XML XML ● Very well defined standard ● By far the most general format: ○ Mixed content ○ Attributes and elements ● By far the best tool support. Nothing else is close: ○ XSLT ○ XPath ○ Many schema languages: ■ W3C XSD ■ RELAX NG More Reasons to Choose XML ● Most composable for mixing and matching markup; e.g. MathML+SVG in HTML ● Does not require a schema. ● Streaming support: very large documents ● Better for interchange amongst unrelated parties ● The deeper your needs the more likely you’ll end up here. Why Not XML? ● Relatively complex for simple tasks ● Limited to no support for non-string programming types: ○ Numbers, booleans, dates, money, etc. ○ Lists, maps, sets ○ You can encode all these but APIs don’t necessarily recognize or support them. ● Lots of sharp edges to surprise the non-expert: ○ 9/10 are namespace related ○ Attribute value normalization ○ White space ● Some security issues if you’re not careful (Billion laughs) JSON ● Simple for object serialization and program data. If your data is a few basic types (int, string, boolean, float) and data structures (list, map) this works well. ● More or less standard (7-8 of them in fact) ● Consumption libraries for essentially all significant languages Why Not JSON? ● It is surprising how fast needs grow past a few basic types and data structures.
    [Show full text]
  • Trifacta Data Preparation for Amazon Redshift and S3 Must Be Deployed Into an Existing Virtual Private Cloud (VPC)
    Install Guide for Data Preparation for Amazon Redshift and S3 Version: 7.1 Doc Build Date: 05/26/2020 Copyright © Trifacta Inc. 2020 - All Rights Reserved. CONFIDENTIAL These materials (the “Documentation”) are the confidential and proprietary information of Trifacta Inc. and may not be reproduced, modified, or distributed without the prior written permission of Trifacta Inc. EXCEPT AS OTHERWISE PROVIDED IN AN EXPRESS WRITTEN AGREEMENT, TRIFACTA INC. PROVIDES THIS DOCUMENTATION AS-IS AND WITHOUT WARRANTY AND TRIFACTA INC. DISCLAIMS ALL EXPRESS AND IMPLIED WARRANTIES TO THE EXTENT PERMITTED, INCLUDING WITHOUT LIMITATION THE IMPLIED WARRANTIES OF MERCHANTABILITY, NON-INFRINGEMENT AND FITNESS FOR A PARTICULAR PURPOSE AND UNDER NO CIRCUMSTANCES WILL TRIFACTA INC. BE LIABLE FOR ANY AMOUNT GREATER THAN ONE HUNDRED DOLLARS ($100) BASED ON ANY USE OF THE DOCUMENTATION. For third-party license information, please select About Trifacta from the Help menu. 1. Quick Start . 4 1.1 Install from AWS Marketplace . 4 1.2 Upgrade for AWS Marketplace . 7 2. Configure . 8 2.1 Configure for AWS . 8 2.1.1 Configure for EC2 Role-Based Authentication . 14 2.1.2 Enable S3 Access . 16 2.1.2.1 Create Redshift Connections 28 3. Contact Support . 30 4. Legal 31 4.1 Third-Party License Information . 31 Page #3 Quick Start Install from AWS Marketplace Contents: Product Limitations Internet access Install Desktop Requirements Pre-requisites Install Steps - CloudFormation template SSH Access Troubleshooting SELinux Upgrade Documentation Related Topics This guide steps through the requirements and process for installing Trifacta® Data Preparation for Amazon Redshift and S3 through the AWS Marketplace.
    [Show full text]
  • Distributed Services with Go Your Guide to Reliable, Scalable, and Maintainable Systems
    Extracted from: Distributed Services with Go Your Guide to Reliable, Scalable, and Maintainable Systems This PDF file contains pages extracted from Distributed Services with Go, published by the Pragmatic Bookshelf. For more information or to purchase a paperback or PDF copy, please visit http://www.pragprog.com. Note: This extract contains some colored text (particularly in code listing). This is available only in online versions of the books. The printed versions are black and white. Pagination might vary between the online and printed versions; the content is otherwise identical. Copyright © 2021 The Pragmatic Programmers, LLC. All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form, or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior consent of the publisher. The Pragmatic Bookshelf Raleigh, North Carolina Distributed Services with Go Your Guide to Reliable, Scalable, and Maintainable Systems Travis Jeffery The Pragmatic Bookshelf Raleigh, North Carolina Many of the designations used by manufacturers and sellers to distinguish their products are claimed as trademarks. Where those designations appear in this book, and The Pragmatic Programmers, LLC was aware of a trademark claim, the designations have been printed in initial capital letters or in all capitals. The Pragmatic Starter Kit, The Pragmatic Programmer, Pragmatic Programming, Pragmatic Bookshelf, PragProg and the linking g device are trade- marks of The Pragmatic Programmers, LLC. Every precaution was taken in the preparation of this book. However, the publisher assumes no responsibility for errors or omissions, or for damages that may result from the use of information (including program listings) contained herein.
    [Show full text]
  • Protocol Buffers
    Protocol Buffers http://code.google.com/p/protobuf/ 1 Overview ● What are Protocol Buffers ● Structure of a .proto file ● How to use a message ● How messages are encoded ● Important points to remember ● More Stuff 2/33 What are Protocol Buffers? ● Serialization format by Google ● used by Google for almost all internal RPC protocols and file formats (currently 48,162 different message types defined in the Google code tree across 12,183 .proto files. They©re used both in RPC systems and for persistent storage of data in a variety of storage systems.) ● Goals: ● Simplicity ● Compatibility ● Performance 3/33 Comparison XML - Protobuf ● Readable by humans ↔ binary format ● Self-describing ↔ Garbage without .proto file ● Big files ↔ small files (3-10 times) ● Slow to serialize/parse ↔ fast (20-100 times) ● .xsd (complex) ↔ .proto (simple, less ambiguous) ● Complex access ↔ easy access 4/33 Comparison XML ± Protobuf (cntd) <person> Person { <name>John Doe</name> name: "John Doe" <email>[email protected]</email> email: "[email protected]" </person> } (== 69 bytes, 5-10©000ns to parse) (== 28 bytes, 100-200ns to parse) cout << "Name: " cout << "Name: " << person.name() << << endl; person.getElementsByTagName("nam cout << "E-mail: " << person.email() << e")->item(0)->innerText() endl; << endl; cout << "E-mail: " << person.getElementsByTagName("emai l")->item(0)->innerText() 5/33 << endl; Example message Person { required string name = 1; // name of person required int32 id = 2; // id of person optional string email = 3; // email address enum PhoneType { MOBILE = 0; HOME = 1; WORK = 2; } message PhoneNumber { required string number = 1; optional PhoneType type = 2 [default = HOME]; } 6/33 repeated PhoneNumber phone = 4; } From .proto to runtime ● Messages defined in .proto file(s) ● Compiled into source code with protoc ● C++ ● Java ● Python ● More languages via AddOns (C#, PHP, Perl, ObjC, etc) ● Usage in code ● Passed via network / files 7/33 Message Definition ● Messages defined in .proto files ● Syntax: Message [MessageName] { ..
    [Show full text]
  • Cloud Native Communication Patterns with Grpc
    Cloud Native Communication Patterns with gRPC Kasun Indrasiri Author “gRPC Up and Running” and “Microservices for Enterprise” About Me ● Author “gRPC Up & Running”, “Microservices for Enterprise” ● Product Manager/Senior Director at WSO2. ● Committer and PMC member at Apache Software Foundation. ● Founder “Bay area Microservices, APIs and Integration” meetup group. What is gRPC? ● Modern Inter-process communication technology. ● Invoking remote functions as easy as making a local function invocation. ● Contract-first. ● Binary messaging on the wire on top of HTTP2 ● Polyglot. Fundamentals of gRPC - Service Definition syntax = "proto3"; ● Defines the business capabilities of package ecommerce; your service. service ProductInfo { rpc addProduct(Product) returns (ProductID); ● Protocol Buffers used as the IDL for rpc getProduct(ProductID) returns (Product); define services. } message Product { ● Protocol Buffers : string id = 1; ○ A language-agnostic, platform-neutral, string name = 2; extensible mechanism to serializing string description = 3; float price = 4; structured data. } ● Defines service, remote methods, and message ProductID { data types. string value = 1; } ProductInfo.proto Fundamentals of gRPC - gRPC Service // AddProduct implements ecommerce.AddProduct ● gRPC service implements the func (s *server) AddProduct(ctx context.Context, in *pb.Product) (*pb.ProductID, business logic. error) { ● Generate server side skeleton from // Business logic } service definition. // GetProduct implements ecommerce.GetProduct func (s *server) GetProduct(ctx
    [Show full text]