<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:atom="https://www.w3.org/2005/Atom" xmlns:sy="https://purl.org/rss/1.0/modules/syndication/" xmlns:dc="https://purl.org/dc/elements/1.1/" xmlns:content="https://purl.org/rss/1.0/modules/content/" xmlns:wfw="https://wellformedweb.org/CommentAPI/" xmlns:slash="https://purl.org/rss/1.0/modules/slash/"
  version="2.0">
  <channel>
    <title>Jason Short</title>
    <atom:link
      href="https://docs.microsoft.com/archive/blogs/jason_short/feed.xml"
      rel="self"
      type="application/rss+xml" />
    <link>https://docs.microsoft.com/archive/blogs/jason_short/feed.xml</link>
    <description>My thoughts on Microsoft technology, mostly Azure related</description>
    <lastBuildDate>Wed, 17 Apr 2019 04:09:32 GMT</lastBuildDate>
    <language>en-US</language>
    <sy:updatePeriod>hourly</sy:updatePeriod>
    <sy:updateFrequency>1</sy:updateFrequency>
    <item>
      <title>Top 10 Windows 8 App Mistakes</title>
      <link>https://docs.microsoft.com/archive/blogs/jason_short/top-10-windows-8-app-mistakes</link>
      <pubDate>Wed, 26 Feb 2014 09:18:00 GMT</pubDate>
      <dc:creator><![CDATA[Jason Short PhD]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jason_short/2014/02/26/top-10-windows-8-app-mistakes/</guid>
      <description><![CDATA[This is a talk I have given internally at Microsoft for people building apps on their own, and...]]></description>
      <content:encoded><![CDATA[<p>This is a talk I have given internally at Microsoft for people building apps on their own, and training external developers on building Windows 8 apps.&#160; I talk with a lot of developers who are building apps, many have already published and are not happy with their app response in the market.&#160; Most of them are making a lot of simple mistakes.&#160; This list is against general apps, not games specifically.&#160; I have entire discussion for game developers as well, maybe I will do that as a post later.</p>  <h3>Universal Mistakes cause users to be unhappy</h3>  <p>Apps may survive having a few of these problems, but maybe they are getting 2 star reviews or poor user engagement.&#160; Users don’t know why they are not happy in most cases, but the result is that they are leaving bad reviews and not engaging with the developer.</p>  <h3>Passing certification is not enough</h3>  <p>There are a number of small things that don’t cost much in terms of time or effort.&#160; You will spend far less time than you did building your app, and will help get more people to be happy with your application.&#160; Spending some time polishing your app goes a long way for customer satisfaction.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/7115.image_7B591147.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/7115.image_5F00_7B591147.png" width="244" align="right" height="212" />Windows 8 App Mistake #10</h2>  <p><strong>Default Splash screen and icon should never be left at the default</strong>.</p>  <p>Even most users know this is the default icon by now.&#160; It will actually fail certification now, but it was allowed for a long time.&#160; </p>  <p>Establish a brand through color and iconography. The start of the app, and the way it looks on the start screen, are important ways to establish a color theme and brand with the user.&#160; They need to start to identify your brand when using your products.</p>  <p>Don’t include your app name in the icon, Windows already has a great display of the text name for the package.&#160; It is ok to include your app name or company logo on the splash screen, but really try to showcase the app.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/6457.image_7439D4CF.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/6457.image_5F00_7439D4CF.png" width="244" align="right" height="102" />Windows 8 App Mistake #9</h2>  <p>&#160;<strong><em>DeveloperAppNameDoesntWork</em></strong></p>  <p>End users don’t want to read camel cased naming, and it also makes it impossible for search engines to get the individual words out of that mess.&#160; You want to make it easy for people to find your app, not hard.</p>  <p>Here are some quick tips for your app naming:</p>  <ul>   <li>Make sure the name fits under a small tile. </li>    <li>Make sure you modify the app properties to include a nice name – takes a few minutes </li>    <li>Abbreviations are ok, as long as the user learns them.&#160; This is how they will search for the app from the start screen, so make it memorable. </li>    <li>Don’t use another apps name in yours (Flappy Bird, Clash of Clans, etc).&#160; Don’t get a takedown notice because of your name. </li> </ul>  <p></p>  <h2>Windows 8 App Mistake #8<img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/1680.image_1B07EB10.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/1680.image_5F00_1B07EB10.png" width="324" align="right" height="104" /> </h2>  <p><strong>Keywords are precious</strong>.&#160; Don’t use your app name as a keyword in the app store.&#160; The name is already included in the text results, and has a heavier result weight than the keywords.</p>  <p>Additional hints for keywords:</p>  <ul>   <li>Use phrases if users are likely to search on them (Doesn’t have to be a single word) </li>    <li>App marketing around chosen keywords </li>    <li>Use those same keywords in tweets, blog posts, etc about the app      <ul>       <li>For the app shown I would put a tweet that says Disney Family Trivia app. People will search on different parts of phrases they might remember </li>     </ul>   </li> </ul>  <p></p>  <h2>Windows 8 App Mistake #7</h2>  <p><strong>First user experience is key</strong>.&#160; You have 30 seconds to grab that user.&#160; Adding an application walk through is a great way to get people over that initial 30 seconds.&#160; Long boring tutorial is NOT the answer.&#160; Allow users to drop out quickly, and then resume the tutorial when they hit a new area of the application.</p>  <p>Hidden features will never be found.&#160; If you have an advanced feature that most users are not finding (see the mistake about analytics, you should know which features are being used!), add a guide to show it to users.&#160; Don’t be afraid to ask the user if they would like to learn more about something in the app.&#160; These type of just in time training within the application allows users to expand their knowledge of your application over time.</p>  <p>Seriously consider adding a what’s new guide for each new release.&#160; Especially if you have added new features that may not be obvious to the user.&#160; You need to guide them to find the features you work so hard on implementing.&#160; Don’t assume users will read the update notes in the store description.&#160; Most never go back to the store and view your app once they have it installed.</p>  <h3>Additional tip for the first 30 second experience</h3>  <p>Hand your app to someone who knows nothing about it.&#160; Watch them for the first 30 seconds (no talking, no pointing, nothing!).&#160; It will be painful to watch them explore the app and wander around, but you will learn a lot about how users experience your app for the first time.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/0184.image_0FDE60C6.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/0184.image_5F00_0FDE60C6.png" width="244" align="right" height="166" />Windows 8 App Mistake #6 </h2>  <p><strong>In app advertising should appear to be a part of the application experience, not a banner ad!</strong></p>  <p>Users do not like ads, especially banner ads.&#160; Don’t put them in as banners or users will ignore them.&#160; Remember that Bing Ads for Windows 8 do NOT pay per click, so just showing them on the screen is enough.</p>  <p>Look at the Bing Sports, and Bing Finance apps that ship with Windows 8 for good example of how to make the ad a part of the content without being obtrusive.&#160; </p>  <h3>Additional thoughts around advertising</h3>  <ul>   <li>Never put an ad where users can accidentally click on it (makes them mad) </li>    <li>Give a way for users to buy their way out of ads      <ul>       <li>$1.99 to remove ads will make more money than you would off showing them ads </li>     </ul>   </li>    <li>Consider using multiple ad networks to rotate through ads and avoid low fill rate issues </li>    <li>Create ads for your other apps to show when offline or no ads returned from ad network      <ul>       <li>Always have something to show, and highlight your other apps! </li>     </ul>   </li> </ul>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/5875.image_13E8AE98.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/5875.image_5F00_13E8AE98.png" width="244" align="right" height="131" />Windows 8 App Mistake #5</h2>  <p><strong>Ship regular updates to your apps</strong>.&#160; This is your chance to engage the users, provide feedback to them on progress, and just let them know the app is alive and well.</p>  <p>After shipping an update with lots of user downloads you may see yourself in the “New &amp; Rising” category of the store.&#160; It is not automatic, but based upon the number of users who download and run the update.</p>  <p>Users get bored with perfectly working apps that are never updated.&#160; How else do you explain so many Twitter clients?&#160; Users are always returning to the store looking for new clients to their favorite services.</p>  <h3>Update your store screenshots</h3>  <p>Would you use a sports app for your favorite team that shows a season two years old in the screen shot?&#160; Update those screen shots if you have time sensitive content in them as well.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/8117.image_08BF244E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/8117.image_5F00_08BF244E.png" width="244" align="right" height="92" /> Windows 8 App Mistake #4</h2>  <p><strong>Capture user feedback</strong>. If you don’t give users a way to interact with you they will choose your marketplace reviews to do it.&#160; That is <strong>not</strong> where you want to get negative suggestions or feedback.&#160; Always give users a way to reach out and interact with you.&#160; They will feel more empowered and a part of the community for the app.</p>  <p>I always create a twitter account for each of my apps (or group of apps in the case of sports apps).&#160; That allows me to interact with users, and I put it the handle in the splash screen.&#160; I get tweets from users, followers, and most important thing to me is the community it gives to the app.&#160; I have tried using twitter as a way to broadcast to users (show them at app startup) with mixed success.&#160; It really depends on the type of app you are building.&#160; But always give a way to get feedback, even if it is just a launch to the mail client using a generic app email address.</p>  <p></p>  <h2>Windows 8 App Mistake #3</h2>  <p><strong>Paid app, with a free trial that never expires</strong>.&#160; This has to be one of the worst strategies to monetize your app.&#160; You want to get free users, then put the app in the free section.&#160; If you want people to pay only when they like it, add an in app purchase to “support the developer” or something like that.&#160; You will get 10x or more downloads from the free section of the store, and that larger base of users will mean you make a lot more money.&#160; Free apps with ads, and an in app purchase to remove them will make more money than a free trial of a paid app.</p>  <p>A paid app without a trial will never succeed.&#160; But a trial should be just that, somehow limited or expiring at some point.&#160; Free trial forever just makes no sense.&#160; Trial apps are unique to the Windows platforms, and they do have their place, but not without limits.</p>  <h3>Build a minimum viable product</h3>  <p>Imagine instead you have a free app that includes basic functionality, this is your minimum viable product.&#160; Maybe it doesn’t support live tiles, or notifications, social features, or online backup.&#160; These are all things you can charge for outside the base functionality. </p>  <p>Then app four or five features that not everyone will use, but they have to pay for individually.&#160; A few users will buy them all, but most will only buy what they want.&#160; This gives you a huge base of free users, and you will make more from those who are willing to pay for features.&#160; Three $1.99 purchases are worth more than a single app purchase as well.&#160; You can then also engage the users and add features they request, for a fee of course.</p>  <p>I have much, much more to say about monetization, but I will save that for a future blog post.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/3240.image_3AB6C4D8.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/3240.image_5F00_3AB6C4D8.png" width="244" align="right" height="240" /> Windows 8 App Mistake #2</h2>  <p><strong>Live tiles should be…&#160; well, alive!</strong></p>  <p>Never include a tile to the app that does nothing.&#160;&#160; <strong>Make users want to launch the app</strong>!&#160; Give them a call to action.&#160; New news is available, your friend replied to you, come see the latest sales, etc.&#160; All of these call to actions make a user want to launch the app</p>  <p>Notice the image here is all tiles for Bing Finance to different stocks.&#160; Each has information that is valuable without launching the app, but clicking on it takes you directly to that stock, not the general finance start screen.&#160; This is known as deep linking.</p>  <h3>Deep linking</h3>  <p>The stock tiles are a good example of this in action, but there are many others. If there is a feature that users use frequently and it is not on the launch page of the app you should include a way for users to launch directly to it.&#160; Think about 4 square as an example.&#160; Most frequently users are checking in places.&#160; If you had to launch the app, navigate to check in, and then press the location that is too many steps.&#160; Create a tile called check in and let the user get straight to that spot in the app.&#160; These type of interactions are also unique to Windows devices, take advantage of them!</p>  <h3>Tile Sizes</h3>  <p>Never create a double wide tile without having some sort of dynamic content.&#160; You are just wasting users screen space.&#160; Leave a single width tile for static content.&#160; Also don’t forget that the extra small tiles can only show little badges, no content.</p>  <p></p>  <h2><img title="image" style="border-width: 0px; margin-right: 0px; margin-left: 0px; display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/8623.image_2F8D3A8E.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/8623.image_5F00_2F8D3A8E.png" width="324" align="right" height="129" /> Windows 8 App Mistake #1</h2>  <p><strong>In App Analytics are not optional</strong>.&#160; There are truly free options available for any size developer up until you get millions of users.&#160; So there is no excuse not to use one of these services.</p>  <p>Example of questions you should always be able to answer:</p>  <ul>   <li>How many users are still running version 1.0? </li>    <li>Do users use feature X? </li>    <li>How many users run the app in snapped mode? </li>    <li>Does anyone create secondary live tiles? </li>    <li>How long does the average user spend in your app? </li>    <li>Do you have any unhandled exceptions in your app? </li>    <li>How many users have actually run your app this month? </li> </ul>  <p>I have articles on the blog covering how to add these types of services to your apps with services like MarkedUp.&#160; A basic version checker and number of users can be done in minutes.&#160; Getting features and screens instrumented can take a little longer, but more less than it took to build those features.</p>  <p></p>  <h2>Thank you</h2>  <p>Thanks for reading this far down the list!&#160; Hope this was super useful to you and you will take some of these suggestions to heart.&#160; I have seen apps that implemented all of these go from being 1 and 2 stars apps to 4 stars.&#160; The app was solid to begin with, it just needed some polish to make it more engaging to the users.</p>]]></content:encoded>
    </item>
    <item>
      <title>Azure Sample Project Source Code on Codeplex</title>
      <link>https://docs.microsoft.com/archive/blogs/jason_short/azure-sample-project-source-code-on-codeplex</link>
      <pubDate>Mon, 03 Jun 2013 22:21:09 GMT</pubDate>
      <dc:creator><![CDATA[Jason Short PhD]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jason_short/2013/06/03/azure-sample-project-source-code-on-codeplex/</guid>
      <description><![CDATA[&#160;  Proof of Concept Code  Several of our proof of concept (POC) projects have already been...]]></description>
      <content:encoded><![CDATA[<p>&#160;</p>  <h2>Proof of Concept Code</h2>  <p>Several of our proof of concept (POC) projects have already been published to <a href="https://azurescalepoc.codeplex.com/" target="_blank">Codeplex Azure Business Scale POCs</a>.</p>  <h2>Enable NuGet to download missing packages</h2>  <p> In order to build the packages from the proof of concept projects you will need to enable NuGet to get the missing packages for you automatically.</p>  <p>From the Visual Studio 2012 Tools | Options menu choose the Package Manager treeview item and then select the Package Restore.&#160; When you build the project for the first time NuGet will get the packages automatically.</p>  <p>&#160;</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/6180.image_6B0BE407.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/6180.image_5F00_6B0BE407.png" target="_blank"><img title="image" style="display: inline;" border="0" alt="image" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/6505.image_thumb_7152BA95.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/6505.image_5F00_thumb_5F00_7152BA95.png" width="644" height="373" /></a></p>]]></content:encoded>
    </item>
    <item>
      <title>Thoughts on Queue Centric Workflow Design</title>
      <link>https://docs.microsoft.com/archive/blogs/jason_short/thoughts-on-queue-centric-workflow-design</link>
      <pubDate>Sun, 02 Jun 2013 17:51:30 GMT</pubDate>
      <dc:creator><![CDATA[Jason Short PhD]]></dc:creator>
      <guid
        isPermaLink="false">https://blogs.msdn.microsoft.com/jason_short/2013/06/02/thoughts-on-queue-centric-workflow-design/</guid>
      <description><![CDATA[&#160;  Where did this come from?  I spend a portion of my job working with large partners to help...]]></description>
      <content:encoded><![CDATA[<h3>&#160;</h3>  <h2>Where did this come from?</h2>  <p>I spend a portion of my job working with large partners to help them architect their applications to run in Windows Azure.&#160; Usually they are coming from an on premises application that was not built for scale out.&#160; One of the most helpful patterns I use is the Queue Centric Workflow pattern.&#160; I have collected email snippets that usually occur after the first design session.&#160; I thought I would collect them in one place to share with partners, and to hopefully help others.</p>  <p>A key aspect of building scale systems is to ensure your application state is kept outside the individual application components.&#160; Windows Azure provides a very robust, scalable queue system built on top of redundant Windows Azure Storage.&#160; This becomes a key to almost every application design I work with today.&#160; Taking advantage of storage services is not covered in this post, perhaps I will go into that in a later post.</p>  <h2>What is this pattern?</h2>  <p>The <a href="  https://blog.codingoutloud.com/book/ " target="_blank">Queue Centric Workflow pattern</a> is an essential pattern for loose coupling of cloud based applications. This pattern is a subset of the <a href="https://en.wikipedia.org/wiki/Command-query_separation" target="_blank">Command Query Responsibility Separation</a> (CQRS). Reliable queues are built into Windows Azure.</p>  <p>To use this pattern an object should generate a queue entry for work to be completed asynchronously from the primary application. The following challenges are overcome by using this pattern:</p>  <p>· Application decoupling across tiers, but all tiers collaborate using external Azure Queue / Tables</p>  <p>· Application needs to guarantee at least once processing for messages</p>  <p>· Ability to scale processing nodes deterministically based upon amount of outstanding work</p>  <p>There are a lot of other patterns which can be used in conjunction with this one, but I am primarily focused on using queues in this paper.</p>  <h2>Azure Storage Queues are Reliable</h2>  <p>The Azure Storage Queue is a reliable queue due to the underlying Azure Storage service. The queue data is always persisted across three nodes, and allows for hundreds of calls per second.</p>  <p>The queue itself being reliable does not inherently make your application more durable, your application design still must take into account failures. These failures may come from dependent services, or your own software.</p>  <h3>Receiver Asynchronous Processing</h3>  <p>The Queue Centric Workflow pattern may be used in many situations where loosely coupled asynchronous processing is desirable. Commands are sent as messages via a queue, which are turn processed on receiver nodes. Receivers may be located on separate physical services, or may be running within the main application. A key tenant is that the queue messages are outside your application and will survive the failure of your app.</p>  <p>The queue has a few very <a href="https://msdn.microsoft.com/en-us/library/windowsazure/dd179363.aspx">simple operations</a>, remember that the service is just a series of REST calls. The queue is then polled periodically by receiver which will then process the messages. The queue itself is a FIFO queue, but the messages are not processed in order. A message that was returned to the queue from a failed node may be processed out of order from other messages. Do not use the queue as an ordered communication device!</p>  <p>Key operations on messages include:</p>  <p>· Enqueue (put) – Add a message to the queue</p>  <p>· Dequeue (get) – Get the next message from the queue without deleting it</p>  <p>· Peek – Look at the next message without processing it</p>  <p>· Update – Messages may be updated to change their invisibility timeout, or the message</p>  <h3>Invisibility Window</h3>  <p>Each message, upon being pulled from the queue, is invisible to other receivers for a period of time. This is to ensure that the message is successfully processed. In the event a receiver fails/crashes while processing, the pulled message will become visible again after some time and can be picked up for processing again.</p>  <p>Your receiver application should follow a process similar to this while operating:</p>  <p>· Get next message from the queue</p>  <p>· Verify the message has not been dequeued too many times (see <a href="https://microsoft-my.sharepoint.com/#_Poison_Message_Handling">poison message handling</a>)</p>  <p>· Periodically update the queue message during processing to extend the invisibility window</p>  <p>· Delete the message from the queue if it was successfully processed</p>  <h2>At-least-once processing</h2>  <p>By following the above pattern for processing messages you are ensured each message is processed at least one time. That may seem strange at first, how can messages be processed more than one time? If the machine processing the request is rebooted, crashes, or otherwise fails to complete the processing of the message it will be returned to the queue and another receiver will process it.</p>  <h3>Idempotent Processing of Repeated Messages</h3>  <p>Since a message may be processed more than once, your application will need to handle that scenario. <a href="https://en.wikipedia.org/wiki/Idempotent">Idempotence</a> is a mathematical property that says an operation must have the same visible result despite having an operator applied to it twice.</p>  <p>For example if an operation must generate a thumbnail of an image it doesn’t matter if the operation is run twice as long as the same thumbnail is output. There are operational wastes in running the process twice, but the <i>end user</i> will never know it was run twice.</p>  <p>This is true of many messages in decoupled systems. If the message was processed, or partially processed, once it may still have been put back on the queue because the original receiver crashed after they completed the task (and had not yet deleted the message).</p>  <p>If an operation is critical to being processed exactly once additional business logic will need to be included in the application to handle this scenario. Most application logic assumes running for the first time, and additional code may be needed to handle validating stages of processing in a larger task. If this is required the original message may be updated at each stage with a checkpoint marker (“step3” for example) to let a subsequent caller know how far the original processor got with the message. </p>  <h3>Poison Message Handling</h3>  <p>In some cases the message may be causing the receiver application to crash either due to a code bug, or malicious intent. In either case the application must decide how many times to retry the processing before flagging the request as bad.</p>  <p>This topic ties in directly with <a href="https://microsoft-my.sharepoint.com/#_Idempotent_Processing_of">Idempotence Processing</a>. An application must ensure that processing of a message twice would leave the system in the same state as if it had only been run once. If this cannot be ensured than any message being dequeued twice would need to be flagged as bad.</p>  <p>A typical implementation would flow something like the following:</p>  <p>· The receiver application pulls a message from the queue and checks the dequeue count</p>  <p>· Check if the message has been attempted more than 3 times, or if the receiver finds a previous output with a crash dump. In either case the message is removed from the queue and placed into a bad message queue.</p>  <p>Poison messages are typically deleted from the primary queue and inserted into a bad message queue (this is sometimes called a dead letter queue because it can’t be delivered successfully).</p>  <h2>Scaling Processing Nodes</h2>  <p>The size of the queue, and the amount of time required to process each message are useful properties to use for scaling receiver nodes. The receiver application can calculate the time required to process a message and place the result in a shared table. Some application patterns do not lend themselves to a deterministic processing time and may not be able to use this as a metric. Many applications are able to use the queue size to estimate the processing required and determine when to scale up more receiver nodes.</p>  <p>Microsoft provides the <a href="https://msdn.microsoft.com/en-us/library/hh680892(v=pandp.50).aspx">Microsoft Enterprise Library Autoscaling Application Block</a> (WASABi) to assist developers in scaling their applications. The application has the following key benefits:</p>  <p>· Allows the graphical Enterprise Library configuration tool to manage configuration settings</p>  <p>· Allows configuration of application blocks though storage locations and logging mechanisms</p>  <p>· Allows application block customization by adding custom autoscaling rules and actions</p>  <p>Use of the application block is not required, however. Developers are free to choose another solution for scaling their application. Some form of auto scale is desirable in many situations where the load can vary, simply to save the company money on consuming resources that are not needed.</p>  <h2>Watch out for Money Leaks</h2>  <p>Most cloud applications need to balance the need for quick processing (performance), with the real world demands of running resources (costs). Most applications will have to strike a balance between these two. Some ideas to look for are deterministic time periods of load (maybe first thing Monday morning), or periods of inactivity that are predictable and can be used to scale back an application. </p>  <p>As of this writing 1 million storage transactions cost $0.10 (<a href="https://www.windowsazure.com/en-us/pricing/calculator/?scenario=full" target="_blank">see Azure calculator</a>). Each transaction for a queue operation counts towards that storage transaction (remember that queues and tables are both part of Azure Storage).</p>  <p>Attempting to dequeue messages when there is no work to be completed will still cost you money. Consider adding some form of step off after an unsuccessful dequeue operation to ensure you are not leaking money within your application.</p>  <p><a href="https://en.wikipedia.org/wiki/Exponential_backoff">Exponential Backoff</a> is a commonly used pattern to wait longer and longer after each unsuccessful attempt. Applications that do not implement some form of delayed retry handling will waste resources on Azure, and cost the user more money than is needed for operations.</p>  <h1>Summary</h1>  <p>I hope this paper has sparked some thoughts in your mind about your own applications. There are many papers and books on the topic of Cloud Architecture and scaling. I have a few broad recommendations for topics you may want to research further.</p>  <p>Decoupling of application tiers – This is very important for cloud applications to ensure a backlog or outage in one tier does not bring the entire application down. It also allows for bursting of the layers that need additional resources, rather than requiring all tiers be scaled.</p>  <p>Guaranteed Processing – All message based systems need a good way to ensure all messages are processed at least once. Windows Azure has really good reliable queues for this purpose. You may want to research how other distributed systems handle messages.</p>  <p>&#160;</p>  <p>&#160;</p>  <h2>Example Application Design</h2>  <p>&#160;</p>  <p><a href="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/5025.image_44CF1834.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/5025.image_5F00_44CF1834.png"><img title="Example Processing System" style="display: inline;" border="0" alt="Example Processing System" src="https://msdnshared.blob.core.windows.net/media/MSDNBlogsFS/prod.evol.blogs.msdn.com/CommunityServer.Blogs.Components.WeblogFiles/00/00/01/58/54/metablogapi/2816.image_thumb_68883FCE.png" original-url="https://blogs.msdn.com/cfs-file.ashx/__key/communityserver-blogs-components-weblogfiles/00-00-01-58-54-metablogapi/2816.image_5F00_thumb_5F00_68883FCE.png" width="520" height="420" /></a>&#160; </p>  <p>The above diagram is an example of using an Azure Queue to control Worker Roles during processing of input.&#160; A full write up of this architecture is provided in the blog post <a href="https://blogs.msdn.com/b/neerajjoshi/archive/2013/05/24/proof-of-concept-to-test-scalability-of-stream-data-processing-in-azure.aspx" target="_blank">Proof of Concept to test scalability of stream data processing in Azure</a>.</p>]]></content:encoded>
    </item>
  </channel>
</rss>