Cosmos DB and ASP.NET Core · • Globally replicated • Multi-modal database • Offering •...

88
Copyright 2017 Code Career Academy, LLC Cosmos DB and ASP.NET Core Creating Your First Project!

Transcript of Cosmos DB and ASP.NET Core · • Globally replicated • Multi-modal database • Offering •...

  • Copyright 2017 Code Career Academy, LLC

    Cosmos DB and ASP.NET CoreCreating Your First Project!

  • Copyright 2017 Code Career Academy, LLC

    Who am I?

    Jeff Ammons

    Microsoft MVP

    Pluralsight Author

    CEO/Chief Instructor at Code Career

    Academy

    25 Years Professional Experience in Software

  • Copyright 2017 Code Career Academy, LLC

    @AtlCodeCamphttp://AtlantaCodeCamp.com

  • Copyright 2017 Code Career Academy, LLC

    Platinum Sponsors

  • Copyright 2017 Code Career Academy, LLC

    After Party – Dave & Busters

    2215 D&B Drive SoutheastMarietta, GA

    Sponsored By:

  • Copyright 2017 Code Career Academy, LLC

    Gold Sponsors

  • Copyright 2017 Code Career Academy, LLC

    Silver Sponsors

  • Copyright 2017 Code Career Academy, LLC

    Please Fill Out Evaluation

  • Copyright 2017 Code Career Academy, LLC

    Hey Jeff, Could You Please Set My Expectation Levels?

  • Copyright 2017 Code Career Academy, LLC

    What is the focus of THIS Cosmos DB talk?

    • Think Average…• How can Cosmos DB help the…

    • Average developer working for the• Average company building the• Average web app?

  • Copyright 2017 Code Career Academy, LLC

    What is the focus of THIS Cosmos DB talk?

    • Think Average…• How can Cosmos DB help the…

    • Average developer working for the• Average company building the• Average web app?

  • Copyright 2017 Code Career Academy, LLC

    What is the focus of THIS Cosmos DB talk?

    • Think Average…• How can Cosmos DB help the…

    • Average developer working for the• Average company building the• Average web app?

  • Copyright 2017 Code Career Academy, LLC

    What is the focus of THIS Cosmos DB talk?

    • Think Average…• How can Cosmos DB help the…

    • Average developer working for the• Average company building the• Average web app?

  • Copyright 2017 Code Career Academy, LLC

    What is Cosmos DB?

  • Copyright 2017 Code Career Academy, LLC

    It is a…

    • Globally replicated• Multi-modal database• Offering

    • Rich querying over schema-free data

    • Configurable and reliable performance

    • Faster development

  • Copyright 2017 Code Career Academy, LLC

    It is a…

    • Globally replicated• Multi-modal database• Offering

    • Rich querying over schema-free data

    • Configurable and reliable performance

    • Faster development

    Be all the things!

  • Copyright 2017 Code Career Academy, LLC

    Globally Replicated

    • Click a hexagon• Replicate to that datacenter• Low latency SLA

    • 10 ms reads and 15 ms writes

  • Copyright 2017 Code Career Academy, LLC

    Multi-Modal

    • Key/Value Store

  • Copyright 2017 Code Career Academy, LLC

    Multi-Modal

    • Key/Value Store• Document Database

  • Copyright 2017 Code Career Academy, LLC

    Multi-Modal

    • Key/Value Store• Document Database• Graph Database

  • Copyright 2017 Code Career Academy, LLC

    Multi-Modal

    • Key/Value Store• Document Database• Graph Database• More to come!

  • Copyright 2017 Code Career Academy, LLC

    Multi-Modal

    • Key/Value Store• Document Database• Graph Database• More to come!

    • Pick the right tool for the job

  • Copyright 2017 Code Career Academy, LLC

    Rich Querying Over Schema-Free Data

    • SQL Interface• Mongo DB Interface• Table Interface• Graph Interface

  • Copyright 2017 Code Career Academy, LLC

    Rich Querying Over Schema-Free Data

    • SQL Interface• Mongo DB Interface• Table Interface• Graph Interface

    • Dump your data in a bucket• We'll index everything• No matter what it is• SuperCaliMagicData-

    ExpediteYourQueries

  • Copyright 2017 Code Career Academy, LLC

    Configurable and Reliable Performance

    • Just slide the sliders• and click the hexagons!

  • Copyright 2017 Code Career Academy, LLC

    Faster Development

    • Avoid object/relational mapping

    • Worry less about schema changes

  • Copyright 2017 Code Career Academy, LLC

    So…

    • Is it really magic?

  • Copyright 2017 Code Career Academy, LLC

    Of course not, but…

    • It's pretty darned good!

  • Copyright 2017 Code Career Academy, LLC

    So What Can I Use Today?

    • Average Company, Developer, App is likely to want• DocumentDB

    • Lose the schema• Save some time• Gain some speed• Keep SQL ad hoc queries

  • Copyright 2017 Code Career Academy, LLC

    Document DB Concepts• Your objects are stored as

    Documents (JSON)

    • Documents are stored in Collections

    • You need to partition your data

    • HINT: This is crucial

    • Your data is denormalized

    DocumentDBAccount

    Database/dbs/{id}

    Collections/colls/{id}

    Documents/docs/{id}

    Attachments/attachments/{id}

    Users/users/{id}

    Permissions/permissions/{id}

    Stored Procedures/sprocs/{id}

    Triggers/triggers/{id}

    User Defined Functions/functions/{id}

  • Copyright 2017 Code Career Academy, LLC

    What's the Big Deal About Schemaless?

    Pros• No need to define tables• No need to map objects to

    tables• Store objects as objects• Changing code is faster since

    you don't have to also change tables

    Cons• Nothing enforces your structure• Nothing enforces relationships• Data can be stored in multiple

    places

  • Copyright 2017 Code Career Academy, LLC

    You Have to Pick the Right ToolNeither approach is perfect

  • Copyright 2017 Code Career Academy, LLC

    What is Partitioning?

  • Copyright 2017 Code Career Academy, LLC

    Subdivide Your Data

    • Pick a partition key• Partitions can be moved around• You don't manage partitions, Azure does• Picking your key is… well… key to performance and/or price!

    https://docs.microsoft.com/en-us/azure/cosmos-db/partition-data

  • Copyright 2017 Code Career Academy, LLC

    So What's the Biggest Pain Point?

  • Copyright 2017 Code Career Academy, LLC

    Danger!

    • You can go broke!• Either a

    • great value or • eat you alive!

    • Danger Zones• Collections

    • You pay for each!• Request Units

    • $5.92/ 100 RUs/sec/month• MINIMUM 400!• BEWARE "OfferThroughput"!

    • Examples show 3,000 & 5,000

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    NO! NO! NO!

    • OfferThroughput = 20000!!!• 20000/100 = 200• 200 * $5.592 = $1,190.40• PER MONTH!

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-partition-data

  • Copyright 2017 Code Career Academy, LLC

    But wait!

    • How about the "Azure Document DB Overview and Offline Development" video?

  • Copyright 2017 Code Career Academy, LLC

    But wait!

    • How about the "Azure Document DB Overview and Offline Development" video?

  • Copyright 2017 Code Career Academy, LLC

    But wait!

    • How about the "Azure Document DB Overview and Offline Development" video?

  • Copyright 2017 Code Career Academy, LLC

    But wait!

    • How about the "Azure Document DB Overview and Offline Development" video?

    • $15,000 a month!• Great Googly Moogly!

  • Copyright 2017 Code Career Academy, LLC

  • Copyright 2017 Code Career Academy, LLC

    s Your Boss

  • Copyright 2017 Code Career Academy, LLC

    To Be Clear…

    • I'm not upset the high priced options exist…

    • Just that they casually use those values in the basic documentation!

  • Copyright 2017 Code Career Academy, LLC

    Burn This Into Your Brain RIGHT NOW

    OfferThroughput = 400;

  • Copyright 2017 Code Career Academy, LLC

    Burn This Into Your Brain RIGHT NOW

    OfferThroughput = 400; • Today, Tomorrow, and Always

  • Copyright 2017 Code Career Academy, LLC

    How Can I Minimize Costs?

  • Copyright 2017 Code Career Academy, LLC

    Take the Big Bucket Approach

    • DON'T think of collections as tables!• You can put all kinds of different data into the bucket• The Key is partitioning!

  • Copyright 2017 Code Career Academy, LLC

    ExampleCar

    ID: 123Year: 2012Make: Ford

    Model: Fusion

    CarID: 125

    Year: 2017Make: HondaModel: Accord

    CarID: 124

    Year: 2015Make: Toyota

    Model: Tundra

    CustomerID: 456

    FirstName: BobLastName: Smith

    CustomerID: 458

    Year: 2017FirstName: SamLastName: Jones

    CustomerID: 457

    Year: 2015FirstName: JoeLastName: Wills

  • Copyright 2017 Code Career Academy, LLC

    Example: Option 1Car

    ID: 123Year: 2012Make: Ford

    Model: Fusion

    CarID: 125

    Year: 2017Make: HondaModel: Accord

    CarID: 124

    Year: 2015Make: Toyota

    Model: Tundra

    CustomerID: 456

    FirstName: BobLastName: Smith

    CustomerID: 458

    Year: 2017FirstName: SamLastName: Jones

    CustomerID: 457

    Year: 2015FirstName: JoeLastName: Wills

    Collection 1

    Collection 2

  • Copyright 2017 Code Career Academy, LLC

    Car Collection

    Customer Collection

    Example: Option 1Car

    ID: 125Year: 2017

    Make: HondaModel: Accord

    CarID: 124

    Year: 2015Make: Toyota

    Model: Tundra

    CustomerID: 458

    Year: 2017FirstName: SamLastName: Jones

    CustomerID: 457

    Year: 2015FirstName: JoeLastName: Wills

    CarID: 123

    Year: 2012Make: Ford

    Model: Fusion

    CustomerID: 456

    FirstName: BobLastName: Smith

    ~$25/mo

    ~$25/mo

  • Copyright 2017 Code Career Academy, LLC

    Collection 1

    Customer Partition

    Car Partition

    Example: Option 2

    CarID: 125

    Year: 2017Make: HondaModel: Accord

    Type: Car

    CarID: 124

    Year: 2015Make: Toyota

    Model: TundraType: Car

    CustomerID: 458

    Year: 2017FirstName: SamLastName: JonesType: Customer

    CustomerID: 457

    Year: 2015FirstName: JoeLastName: WillsType: Customer

    CarID: 123

    Year: 2012Make: Ford

    Model: FusionType: Car

    CustomerID: 456

    FirstName: BobLastName: SmithType: Customer

    ~$25/mo

  • Copyright 2017 Code Career Academy, LLC

    Choose Carefully

    • Option 2 partitions for the best price, not best performance• Depending on your needs you may need to partition on some other

    attribute• Sometimes paying more is the right choice!

  • Copyright 2017 Code Career Academy, LLC

    So Schemaless Means Not Thinking About Structure?• No!• How you break up your objects is very important.• Remember in general:

    • Normalized data makes for faster writes• Denormalized data makes for faster reads/fewer trips to the source

  • Copyright 2017 Code Career Academy, LLC

    Modeling Your Data

    Concept mapping:Embedded Data == DenormalizedReferenced Data == Normalized (more or less…)

  • Copyright 2017 Code Career Academy, LLC

    Referenced

    • Fast writes• Two queries to get data

    CarID: 123

    Year: 2012Make: Ford

    Model: FusionOwnerId: 456

    CustomerID: 456

    FirstName: BobLastName: Smith

    Cars: [CarId: 123

    ]

  • Copyright 2017 Code Career Academy, LLC

    Embedded

    • Fast reads (one trip)• Data may be duplicated

    CustomerID: 456

    FirstName: BobLastName: Smith

    Cars: [

    ]

    CarID: 123

    Year: 2012Make: Ford

    Model: Fusion

  • Copyright 2017 Code Career Academy, LLC

    Difference from Relational DB

    Document• Weak references

    • Nothing enforces them

    Relational• Strong references

    • Enforced by DB Engine

  • Copyright 2017 Code Career Academy, LLC

    How About Another Pain Point?

  • Copyright 2017 Code Career Academy, LLC

    Auto Incrementing IDNope.

    Sorry.

    Gotta getta GUID.

    Or roll your own in stored procedure.

  • Copyright 2017 Code Career Academy, LLC

    So How Do We Get Started?

  • Copyright 2017 Code Career Academy, LLC

    Where Are the Docs?

    https://docs.microsoft.com/en-us/azure/cosmos-db/

  • Copyright 2017 Code Career Academy, LLC

    Be Careful With Docs!

    This isn't Core!

    https://docs.microsoft.com/en-us/azure/cosmos-db/tutorial-develop-documentdb-dotnet

  • Copyright 2017 Code Career Academy, LLC

    Here's the Core Walk Through!

    Here's the Core one!

    But… it's not ASP

    https://docs.microsoft.com/en-us/azure/cosmos-db/documentdb-dotnetcore-get-started

  • Copyright 2017 Code Career Academy, LLC

    Grab the Emulator!

    • Run locally• https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator

    • When you run it you will get a little web server running locally• Browser will pop up

    https://docs.microsoft.com/en-us/azure/cosmos-db/local-emulator

  • Copyright 2017 Code Career Academy, LLC

    Create Your Base App

    • Whatever kind of app you want, but I like• ASP.NET Core MVC• You know the drill: File, New, Project…

    • If you are doing Core, be sure you have the Preview 2 or better of VS 2017

  • Copyright 2017 Code Career Academy, LLC

    NuGet Yourself Some Cosmos DB Love

    • Microsoft.Azure.DocumentDB OR• Microsoft.Azure.DocumentDB.Core

    • Depending on whether you're doing Core yet or not

  • Copyright 2017 Code Career Academy, LLC

    Create Your Collection

    • You can do so manually in the Portal OR• do it via code

  • Copyright 2017 Code Career Academy, LLC

    Create Your Domain Classes

    • Use JsonProperties to prep the JSON documents

    public class Item

    {

    [JsonProperty(PropertyName = "id")]

    public string Id { get; set; }

    [JsonProperty(PropertyName = "name")]

    public string Name { get; set; }

  • Copyright 2017 Code Career Academy, LLC

    Create Your Domain Classes

    • Use JsonProperties to prep the JSON documents

    public class Item

    {

    [JsonProperty(PropertyName = "id")]

    public string Id { get; set; }

    [JsonProperty(PropertyName = "name")]

    public string Name { get; set; }

    • You must have an ID column that is a string

    • Even if you use a GUID or Integer

  • Copyright 2017 Code Career Academy, LLC

    Gut Check Time

  • Copyright 2017 Code Career Academy, LLC

    Which is More Important?

    • Super pure OOP? • Easier/faster development?

  • Copyright 2017 Code Career Academy, LLC

    Options

    Super Pure OOP• Create a domain object that is

    pure• Create a document object for

    each domain object• Keep the document objects

    inside your repository

    Down and Dirty• Create a domain object that

    has:• ID as a string• Type as a string

    • Pass this object around

  • Copyright 2017 Code Career Academy, LLC

    Basically EF's DilemmaBut not as much extra junk

  • Copyright 2017 Code Career Academy, LLC

    Either Way…

    • I'd encapsulate the Cosmos Code in a repository

  • Copyright 2017 Code Career Academy, LLC

    Startup.csConfigureServices Method

    If You Haven't Worked with Core Yet…• The biggest difference is:

    • Use Dependency Injection to get your repo into your controller

    services.AddScoped(); services.AddScoped();

    services.AddScoped();

    services.AddScoped();

  • Copyright 2017 Code Career Academy, LLC

    Startup.csConfigureServices Method

    If You Haven't Worked with Core Yet…• The biggest difference is:

    • Use Dependency Injection to get your repo into your controller

    services.AddScoped(); services.AddScoped(); For Down & Dirty You Only

    Need the Second line here

    services.AddScoped();

    services.AddScoped();

  • Copyright 2017 Code Career Academy, LLC

    If You Haven't Worked with Core Yet…• The biggest difference is:

    • Use Dependency Injection to get your repo into your controller

    In Your Controller

    public class HolidayManagerController : Controller { private readonly IHolidayRepository _holidayRepo; public HolidayManagerController(IHolidayRepository holidayRepo) { _holidayRepo = holidayRepo; }

    public class HolidayManagerController : Controller

    {

    private readonly IHolidayRepository _holidayRepo;

    public HolidayManagerController(IHolidayRepository holidayRepo)

    {

    _holidayRepo = holidayRepo;

    }

  • Copyright 2017 Code Career Academy, LLC

    Configure Your Project for the Emulator

    • Right Click the project and select Manage User Secrets• This opens secrets.json (shh!)• This does NOT get checked in: stays on the developer's machine

    • Paste into the secrets file the following (get it from the PDF…)• These values are the same for everyone• Put the real values on your server (App Settings Env Vars for App Svcs)

    "cosmosdb:studentportal:authKey": "C2y6yDjf5/R+ob0N8A7Cgv30VRDJIWEHLM+4QDU5DE2nQ9nDuVTqobD4b8mGGyPMbIZnqyMsEcaGQy67XIw/Jw==",

    "cosmosdb:studentportal:endpoint": "https://localhost:8081"

  • Copyright 2017 Code Career Academy, LLC

    DemoIn the remaining 23 seconds…Let's see some code!

  • Copyright 2017 Code Career Academy, LLC

    Follow Me on The Web

    • Blog: jeffa.tech• CCA: CodeCareerAcademy.com• Slides are at: https://codecareeracademy.com/news/• Twitter: jeffa00• Twitter: codecareeracad• http://www.meetup.com/Gwinnett-Microsoft-Users-Group/• http://www.meetup.com/Code-Career-Academy-Meetups-

    Gwinnett/

    Cosmos DB and ASP.NET CoreWho am I?Slide Number 3Platinum SponsorsAfter Party – Dave & Busters� Gold SponsorsSlide Number 7Please Fill Out EvaluationHey Jeff, Could You Please Set My Expectation Levels?What is the focus of THIS Cosmos DB talk?What is the focus of THIS Cosmos DB talk?What is the focus of THIS Cosmos DB talk?What is the focus of THIS Cosmos DB talk?What is Cosmos DB?It is a…It is a…Globally ReplicatedMulti-ModalMulti-ModalMulti-ModalMulti-ModalMulti-ModalRich Querying Over Schema-Free DataRich Querying Over Schema-Free DataConfigurable and Reliable PerformanceFaster DevelopmentSo…Of course not, but…So What Can I Use Today?Document DB ConceptsWhat's the Big Deal About Schemaless?You Have to Pick the Right ToolWhat is Partitioning?Subdivide Your DataSo What's the Biggest Pain Point?Danger!NO! NO! NO!NO! NO! NO!NO! NO! NO!NO! NO! NO!NO! NO! NO!NO! NO! NO!NO! NO! NO!NO! NO! NO!But wait!But wait!But wait!But wait!Slide Number 49sTo Be Clear…Burn This Into Your Brain RIGHT NOWBurn This Into Your Brain RIGHT NOWHow Can I Minimize Costs?Take the Big Bucket ApproachExampleExample: Option 1Example: Option 1Example: Option 2Choose CarefullySo Schemaless Means Not Thinking About Structure?Modeling Your DataReferencedEmbeddedDifference from Relational DBHow About Another Pain Point?Auto Incrementing IDSo How Do We Get Started?Where Are the Docs?Be Careful With Docs!Here's the Core Walk Through!Grab the Emulator!Create Your Base AppNuGet Yourself Some Cosmos DB LoveCreate Your CollectionCreate Your Domain ClassesCreate Your Domain ClassesGut Check TimeWhich is More Important?OptionsBasically EF's DilemmaEither Way…If You Haven't Worked with Core Yet…If You Haven't Worked with Core Yet…If You Haven't Worked with Core Yet…Configure Your Project for the EmulatorDemoFollow Me on The Web