109
Windows Azure: Cloud service development best practices Sriram Krishnan Program Manager Microsoft Corporation sriramk@microsof t.com

Windows Azure - Cloud Service Development Best Practices

Embed Size (px)

DESCRIPTION

Talk from PDC 2008

Citation preview

Page 1: Windows Azure - Cloud Service Development Best Practices

Windows Azure: Cloud service development best practices

Sriram KrishnanProgram ManagerMicrosoft Corporation

[email protected]

Page 2: Windows Azure - Cloud Service Development Best Practices

1980

Page 3: Windows Azure - Cloud Service Development Best Practices
Page 4: Windows Azure - Cloud Service Development Best Practices

void quicksort(int* array, int left, int right)

{

if(left >= right)

return;

int index = partition(array, left, right);

quicksort(array, left, index - 1);

quicksort(array, index + 1, right);

}

Page 5: Windows Azure - Cloud Service Development Best Practices
Page 6: Windows Azure - Cloud Service Development Best Practices
Page 7: Windows Azure - Cloud Service Development Best Practices

simplicity

Page 8: Windows Azure - Cloud Service Development Best Practices

Act IArchitecture

Page 9: Windows Azure - Cloud Service Development Best Practices

Networks are unreliable

Page 10: Windows Azure - Cloud Service Development Best Practices

Hardware fails

Page 11: Windows Azure - Cloud Service Development Best Practices
Page 12: Windows Azure - Cloud Service Development Best Practices
Page 13: Windows Azure - Cloud Service Development Best Practices

A few design choices

Page 14: Windows Azure - Cloud Service Development Best Practices

Big, reliable,

expensive machine

Page 15: Windows Azure - Cloud Service Development Best Practices

Several commodity machines

Page 16: Windows Azure - Cloud Service Development Best Practices

Lots and lots of commodity machines

Page 17: Windows Azure - Cloud Service Development Best Practices

A few challenges

Page 18: Windows Azure - Cloud Service Development Best Practices

What do you do about that pesky thing called state?

Page 19: Windows Azure - Cloud Service Development Best Practices
Page 20: Windows Azure - Cloud Service Development Best Practices

Go horizontalGo stateless

Page 21: Windows Azure - Cloud Service Development Best Practices

Store state in Windows Azure storage

Page 22: Windows Azure - Cloud Service Development Best Practices

And it is the default out of the box!

Page 23: Windows Azure - Cloud Service Development Best Practices

Session state provider

<system.web>

...<sessionState mode="Custom"

customProvider="TableStorageSessionStateProvider">            <providers>

                <add name="TableStorageSessionStateProvider“

        type="Microsoft.Samples.ServiceHosting.AspProviders.TableStorageSessionStateProvider"                    

applicationName=“Foo” />

            </providers></sessionState>

</system.web>

Page 24: Windows Azure - Cloud Service Development Best Practices

How do you deal with unreliable components?

Page 25: Windows Azure - Cloud Service Development Best Practices
Page 26: Windows Azure - Cloud Service Development Best Practices

Be loosely coupled

Page 27: Windows Azure - Cloud Service Development Best Practices

Use Windows Azure queues for separation of work

Page 28: Windows Azure - Cloud Service Development Best Practices

Default.aspx(Input + Making

Coffee)

LB

Page 29: Windows Azure - Cloud Service Development Best Practices

Tight coupling : Default.aspx.cs

public partial class _Default : System.Web.UI.Page    {                 protected void Button1_Click(object sender,EventArgs e)        {            var order = txtOrder.Text;            ProcessOrder(order);        }

protected void ProcessOrder(string order)        {  //Make some coffee!

...        }

     }

Page 30: Windows Azure - Cloud Service Development Best Practices

Default.aspx(Input)

Windows Azure Queues

LB

Worker.cs(Make Coffee)

Page 31: Windows Azure - Cloud Service Development Best Practices

Loose coupling : Default.aspx.cs

public partial class _Default : System.Web.UI.Page    {                 protected void Button1_Click(object sender,EventArgs e)        {            var order = txtOrder.Text;

            QueueStorage qStore = QueueStorage.Create(_account);

            MessageQueue orderQ = qStore.GetQueue("OrderQueue");

            orderQ.PutMessage(new Message(order));         }

     }

Page 32: Windows Azure - Cloud Service Development Best Practices

Loose coupling : WorkerRole.cs

public class WorkerRole : RoleEntryPoint    {        public override void Start()        {

            QueueStorage qStore = QueueStorage.Create(_account);            MessageQueue orderQ = qStore.GetQueue("OrderQueue");            while (true)            {                Message msg = orderQ.GetMessage();

if( msg != null)                 ProcessOrder(msg.ContentAsString());            }        }               protected void ProcessOrder(string order)        {

//Make some coffee! ...

        }

Page 33: Windows Azure - Cloud Service Development Best Practices

How do you deal with varying load?

Page 34: Windows Azure - Cloud Service Development Best Practices

Build a thermostat for your service

Page 35: Windows Azure - Cloud Service Development Best Practices

How do you deal with failures?

Page 36: Windows Azure - Cloud Service Development Best Practices

Use Windows Azure storage for valuable data

Page 37: Windows Azure - Cloud Service Development Best Practices

Be prepared to reconstruct local state…

Page 38: Windows Azure - Cloud Service Development Best Practices

…since it can disappear any time

Page 39: Windows Azure - Cloud Service Development Best Practices

Retry on transient failures

But…

Page 40: Windows Azure - Cloud Service Development Best Practices

Be idempotent

Page 41: Windows Azure - Cloud Service Development Best Practices

Don’t launch a DoS attack on yourself

Page 42: Windows Azure - Cloud Service Development Best Practices

Be predictable

Page 43: Windows Azure - Cloud Service Development Best Practices

Avoid shutdown code

Page 44: Windows Azure - Cloud Service Development Best Practices

Know when to throttle and shed load

Page 45: Windows Azure - Cloud Service Development Best Practices

Case study: SmugMug and SkyNet

Page 46: Windows Azure - Cloud Service Development Best Practices

When is ‘good enough’ good enough?

Page 47: Windows Azure - Cloud Service Development Best Practices

The resiliency of email

Page 48: Windows Azure - Cloud Service Development Best Practices

Do all apps need the same guarantees?

Page 49: Windows Azure - Cloud Service Development Best Practices

It's a knob

Page 50: Windows Azure - Cloud Service Development Best Practices
Page 51: Windows Azure - Cloud Service Development Best Practices
Page 52: Windows Azure - Cloud Service Development Best Practices

Stateless front-endsLoose couplingBuilding a thermostatRetrying on failuresLoosening consistency

Recap

Page 53: Windows Azure - Cloud Service Development Best Practices

End of Act I

Page 54: Windows Azure - Cloud Service Development Best Practices

Act IIUpdates

Page 55: Windows Azure - Cloud Service Development Best Practices

Updates are hard

Page 56: Windows Azure - Cloud Service Development Best Practices

Hard to ‘undo’ a failed deployment

Page 57: Windows Azure - Cloud Service Development Best Practices

Need to deal with both code and schema changes

Page 58: Windows Azure - Cloud Service Development Best Practices

Code + data

Update only one at a time

Page 59: Windows Azure - Cloud Service Development Best Practices

Code vN Data vN

Page 60: Windows Azure - Cloud Service Development Best Practices

Code vN

Data vN

Code vN +1

Page 61: Windows Azure - Cloud Service Development Best Practices

Code vN

Data vN

Data vN+1

Page 62: Windows Azure - Cloud Service Development Best Practices

Be compatible

Page 63: Windows Azure - Cloud Service Development Best Practices

If it looks like a duck and walks like a duck…

http://www.flickr.com/photos/gaetanlee/298160415/

Page 64: Windows Azure - Cloud Service Development Best Practices

Use version numbers in schema

Page 65: Windows Azure - Cloud Service Development Best Practices

  class Employee : TableStorageEntity    {        public Employee(string firstName, string lastName) :            base(firstName, lastName) //partition key, row key        {}         public string JobTitle        {             get;             set;         }     }  

...       var qResult = from emp in

svc.CreateQuery<Employee>(EmployeeDataServiceContext.EmployeeTable)

       where emp.PartitionKey == "Steve" && emp.RowKey == "Marx        select emp;

Schema without versioning                                  }

Page 66: Windows Azure - Cloud Service Development Best Practices

  class Employee : TableStorageEntity    {        public Employee(string firstName, string lastName) :            base(firstName, lastName)        {}         public string JobTitle        {             get; set;         }

        public int Version         {             get; set;

        } 

    }  ...       var qResult = from emp in

svc.CreateQuery<Employee>(EmployeeDataServiceContext.EmployeeTable)

       where emp.PartitionKey == "Steve" && emp.RowKey == "Marx

&& emp.Version == 1        select emp;

Schema *with* versioning                                  }

Page 67: Windows Azure - Cloud Service Development Best Practices

How do you do upgrades without downtime?

Page 68: Windows Azure - Cloud Service Development Best Practices

Windows Azure’s rolling upgrades

Page 69: Windows Azure - Cloud Service Development Best Practices

Stage Deployment Production Deployment

Swap for zero downtime upgrade

Page 70: Windows Azure - Cloud Service Development Best Practices

+Stop + start for big changes or if

downtime isn’t an issue

Page 71: Windows Azure - Cloud Service Development Best Practices

Future: Precise control

Page 72: Windows Azure - Cloud Service Development Best Practices

When is the best time to update a service?

Page 73: Windows Azure - Cloud Service Development Best Practices

Use the Pacific Ocean

Page 74: Windows Azure - Cloud Service Development Best Practices

Case study: Windows Live ID

Page 75: Windows Azure - Cloud Service Development Best Practices

Update code or dataMaintain compatVersioning in schemasRolling upgrades

Recap

Page 76: Windows Azure - Cloud Service Development Best Practices

End of Act II

Page 77: Windows Azure - Cloud Service Development Best Practices

December 4th, 1996

Page 78: Windows Azure - Cloud Service Development Best Practices
Page 79: Windows Azure - Cloud Service Development Best Practices
Page 80: Windows Azure - Cloud Service Development Best Practices
Page 81: Windows Azure - Cloud Service Development Best Practices

Oh Oh!

Page 82: Windows Azure - Cloud Service Development Best Practices
Page 83: Windows Azure - Cloud Service Development Best Practices

Trace logs

Page 84: Windows Azure - Cloud Service Development Best Practices

Trickiest patch ever

Page 85: Windows Azure - Cloud Service Development Best Practices
Page 86: Windows Azure - Cloud Service Development Best Practices

Act IIIWhen things go wrong…

Page 87: Windows Azure - Cloud Service Development Best Practices

How do I debug?

Page 88: Windows Azure - Cloud Service Development Best Practices

Use the Windows Azure SDK and debug locally to find bugs

Page 89: Windows Azure - Cloud Service Development Best Practices

Separate code and config

Page 90: Windows Azure - Cloud Service Development Best Practices

 ServiceDefinition.csdef

<ServiceDefinition name="DemoService">  <WebRole name="WebRole">    <ConfigurationSettings>

      <Setting name="Color"/>

    </ConfigurationSettings>  </WebRole></ServiceDefinition>

ServiceConfiguration.cscfg

<ServiceConfiguration serviceName="DemoService">  <Role name="WebRole">    <ConfigurationSettings>

      <Setting name ="Color" value ="Red"/>

    </ConfigurationSettings>  </Role></ServiceConfiguration>

Configuration files           

Page 91: Windows Azure - Cloud Service Development Best Practices

Windows Azure’s configuration update mechanism

Page 92: Windows Azure - Cloud Service Development Best Practices

How do I debug the cloud?

Page 93: Windows Azure - Cloud Service Development Best Practices

Logging

Page 94: Windows Azure - Cloud Service Development Best Practices

  <?xml version="1.0"?><ServiceConfiguration serviceName=“DemoService”>

  <Role name="WebRole">

    <Instances count="1"/>    <ConfigurationSettings>

      <Setting name ="LogLevel" value ="Verbose"/>

    </ConfigurationSettings>  </Role></ServiceConfiguration>

...

Configurable logging           

if (RoleManager.GetConfigurationSetting("LogLevel") == "Verbose")       RoleManager.WriteToLog("Information", "Some log message");

Page 95: Windows Azure - Cloud Service Development Best Practices

Tag data with unique ID to track across the system

{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}

Page 96: Windows Azure - Cloud Service Development Best Practices

How do I get notified when something bad happens?

Page 97: Windows Azure - Cloud Service Development Best Practices

!

Windows Azure’s alerts

Page 98: Windows Azure - Cloud Service Development Best Practices

!

Email / IM / Phone

Page 99: Windows Azure - Cloud Service Development Best Practices

The Big Red Button

Page 100: Windows Azure - Cloud Service Development Best Practices

Use the SDKSeparate code and configConfigurable loggingAlertsThe Big Red Button

Recap

Page 101: Windows Azure - Cloud Service Development Best Practices

End of Act III

Page 102: Windows Azure - Cloud Service Development Best Practices

James Hamilton http://research.microsoft.com/~jamesrh/

Emre Kiciman http://research.microsoft.com/~emrek/

Pat Helland http://blogs.msdn.com/pathelland/

What really happened on Mars http://research.microsoft.com/~mbj/mars_pathfinder/

Flickr blog post http://code.flickr.com/blog/2008/09/26/flickr-engineers-do-it-offline/

Don MacAskill http://blogs.smugmug.com/don/

Credits & Acknowledgements

Page 103: Windows Azure - Cloud Service Development Best Practices

One final story

Page 104: Windows Azure - Cloud Service Development Best Practices

William of Ockhamc. 1288 - c. 1348

Page 105: Windows Azure - Cloud Service Development Best Practices

Numquam ponenda est pluralitas sine necessitate

Plurality ought never be posited without necessity

Page 106: Windows Azure - Cloud Service Development Best Practices

KISS

Page 107: Windows Azure - Cloud Service Development Best Practices

simplicity

Page 108: Windows Azure - Cloud Service Development Best Practices

[email protected]

www.sriramkrishnan.com

Page 109: Windows Azure - Cloud Service Development Best Practices

© 2008 Microsoft Corporation. All rights reserved. Microsoft, Windows, Windows Vista and other product names are or may be registered trademarks and/or trademarks in the U.S. and/or other countries.The information herein is for informational purposes only and represents the current view of Microsoft Corporation as of the date of this presentation. Because Microsoft must respond to changing market

conditions, it should not be interpreted to be a commitment on the part of Microsoft, and Microsoft cannot guarantee the accuracy of any information provided after the date of this presentation. MICROSOFT MAKES NO WARRANTIES, EXPRESS, IMPLIED OR STATUTORY, AS TO THE INFORMATION IN THIS PRESENTATION.