<?xml version="1.0" encoding="utf-8"?>
<rss xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:pingback="http://madskills.com/public/xml/rss/module/pingback/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0">
  <channel>
    <title>Muranosoft Blog - Azure</title>
    <link>http://www.muranosoft.com/Outsourcingblog/</link>
    <description>Coding etc</description>
    <language>en-us</language>
    <copyright>Murano Software</copyright>
    <lastBuildDate>Mon, 24 May 2010 21:33:13 GMT</lastBuildDate>
    <generator>newtelligence dasBlog 2.3.9074.18820</generator>
    <managingEditor>valerie.sinitskaya@muranosoft.com</managingEditor>
    <webMaster>valerie.sinitskaya@muranosoft.com</webMaster>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=af8bb2a4-a405-408a-8059-4b07a0d40dcc</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=af8bb2a4-a405-408a-8059-4b07a0d40dcc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
One of the updates in the <a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx">RCA
phase 2</a> was a porting our database from Azure storage to Azure SQL. Minimal changes
we needed to make were on the server (Azure web/web role) and Azure SQL. We also changed
some scripts on the client to increase performance. Let’s look at the changes in the
main two steps:
</p>
        <p>
          <strong>Changes in the Azure SQL</strong>
        </p>
        <p>
The main differences between Azure storage and Azure SQL are: 
</p>
        <ol>
          <li>
Each table in Azure storage has two key fields: RowKey and PartitionKey.</li>
          <li>
A database in Azure storage is not relational, so no joins, group by and order by.</li>
          <li>
Windows Azure storage can return either 1,000 rows or 4 Kbytes.</li>
          <li>
Two key fields must be properly designed for good performance. 
</li>
        </ol>
        <p>
We also want to note that Azure SQL has some <a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx">limitations</a> as
compared to traditional RDBMS. We couldn’t make a connection to Azure SQL from Visual
studio before version 2010 RC, and we had to create copy of the Azure SQL database
on the local SQL Server, make a model and change the connection string to the database
in Azure SQL. But this problem was resolved in VS 2010 RC, and we can work with Azure
SQL directly. 
</p>
        <p>
Thus, we removed PartitionKey and RowKey, as well as TimeStamp, from the structure
of each table because these keys can’t be used as primary keys in relational database.
Then we formed primary keys and relations between tables. We didn’t find any tool
to migrate the database from Azure storage to Azure SQL. So we implemented sql-script
to create our database structure by hand.
</p>
        <p>
We want to note that you can work with Azure SQL, as well as the traditional SQL Server,
using <a href="http://blogs.msdn.com/ssds/archive/2009/11/11/9921041.aspx">SQL Server
2008 R2 Management Studio CTP</a>. One of the most pleasant features of this tool
is the script generator that can generate script from an existing database. A generated
script is adapted to Azure SQL and can create a database in Azure SQL. So you can
create a database in the local SQL Server and use it in your Rich Internet Application
before releasing and generating the database in Azure SQL only for the production
version. 
</p>
        <p>
          <strong>Changes on the server (Web role / Azure Web)</strong>
        </p>
        <p>
We used the data access layer described in this blog (<a href="http://blogs.msdn.com/ales/archive/2009/06/17/porting-silverlight-ria-to-windows-azure-part-1.aspx">Porting
Silverlight RIA to Windows Azure</a>) to work with Azure storage. The next step was
to decide what kind of technology we would use to work with Azure SQL. We chose the
LINQ to SQL technology. So we changed the previous model to a model generated by the
DBML Code Generator. Our new model has to be inherited from the IUpdatable interface,
so we implemented a partial class of our model that inherits from the IUpdatable interface.
A generic implementation of the IUpdatable interface for LINQ to SQL is provided under
MS-PL license. You can find it <a href="http://code.msdn.microsoft.com/IUpdateableLinqToSql/Release/ProjectReleases.aspx?ReleaseId=1753">here</a> and
use it in the partial class of your model.
</p>
        <p>
These are all minimal changes you need to make to port your Azure storage to Azure
SQL. Good luck.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=af8bb2a4-a405-408a-8059-4b07a0d40dcc" />
      </body>
      <title>Porting database from Azure storage to Azure SQL</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Porting-Database-From-Azure-Storage-To-Azure-SQL.aspx</link>
      <pubDate>Mon, 24 May 2010 21:33:13 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
One of the updates in the &lt;a href="http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx"&gt;RCA
phase 2&lt;/a&gt; was a porting our database from Azure storage to Azure SQL. Minimal changes
we needed to make were on the server (Azure web/web role) and Azure SQL. We also changed
some scripts on the client to increase performance. Let’s look at the changes in the
main two steps:
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Changes in the Azure SQL&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
The main differences between Azure storage and Azure SQL are: 
&lt;ol&gt;
&lt;li&gt;
Each table in Azure storage has two key fields: RowKey and PartitionKey.&lt;/li&gt;
&lt;li&gt;
A database in Azure storage is not relational, so no joins, group by and order by.&lt;/li&gt;
&lt;li&gt;
Windows Azure storage can return either 1,000 rows or 4 Kbytes.&lt;/li&gt;
&lt;li&gt;
Two key fields must be properly designed for good performance. 
&lt;/li&gt;
&lt;/ol&gt;
&gt;
&lt;p&gt;
We also want to note that Azure SQL has some &lt;a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx"&gt;limitations&lt;/a&gt; as
compared to traditional RDBMS. We couldn’t make a connection to Azure SQL from Visual
studio before version 2010 RC, and we had to create copy of the Azure SQL database
on the local SQL Server, make a model and change the connection string to the database
in Azure SQL. But this problem was resolved in VS 2010 RC, and we can work with Azure
SQL directly. 
&lt;/p&gt;
&lt;p&gt;
Thus, we removed PartitionKey and RowKey, as well as TimeStamp, from the structure
of each table because these keys can’t be used as primary keys in relational database.
Then we formed primary keys and relations between tables. We didn’t find any tool
to migrate the database from Azure storage to Azure SQL. So we implemented sql-script
to create our database structure by hand.
&lt;/p&gt;
&lt;p&gt;
We want to note that you can work with Azure SQL, as well as the traditional SQL Server,
using &lt;a href="http://blogs.msdn.com/ssds/archive/2009/11/11/9921041.aspx"&gt;SQL Server
2008 R2 Management Studio CTP&lt;/a&gt;. One of the most pleasant features of this tool
is the script generator that can generate script from an existing database. A generated
script is adapted to Azure SQL and can create a database in Azure SQL. So you can
create a database in the local SQL Server and use it in your Rich Internet Application
before releasing and generating the database in Azure SQL only for the production
version. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Changes on the server (Web role / Azure Web)&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
We used the data access layer described in this blog (&lt;a href="http://blogs.msdn.com/ales/archive/2009/06/17/porting-silverlight-ria-to-windows-azure-part-1.aspx"&gt;Porting
Silverlight RIA to Windows Azure&lt;/a&gt;) to work with Azure storage. The next step was
to decide what kind of technology we would use to work with Azure SQL. We chose the
LINQ to SQL technology. So we changed the previous model to a model generated by the
DBML Code Generator. Our new model has to be inherited from the IUpdatable interface,
so we implemented a partial class of our model that inherits from the IUpdatable interface.
A generic implementation of the IUpdatable interface for LINQ to SQL is provided under
MS-PL license. You can find it &lt;a href="http://code.msdn.microsoft.com/IUpdateableLinqToSql/Release/ProjectReleases.aspx?ReleaseId=1753"&gt;here&lt;/a&gt; and
use it in the partial class of your model.
&lt;/p&gt;
&lt;p&gt;
These are all minimal changes you need to make to port your Azure storage to Azure
SQL. Good luck.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=af8bb2a4-a405-408a-8059-4b07a0d40dcc" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,af8bb2a4-a405-408a-8059-4b07a0d40dcc.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=3cb21155-dcd3-4316-ad47-2e2452e72b68</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=3cb21155-dcd3-4316-ad47-2e2452e72b68</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Stanislav, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">Senior
.NET Developer</a> on Murano Software’s team</em>
        </p>
        <p>
The latest version of Silverlight delivers hundreds of features, such as a full set
of form controls, enhanced data-binding support, printing API, UDP, webcam and microphone
support, full trust in out-of-browser, and so on. But it doesn't have an out-of-box
solution to stream video or audio captured from a microphone and Web camera via a
network. Current API allows you to capture video/audio data from media devices, and
it has a way to play back media information using MediaStreamSource and MediaElement
control. Also, API has the UdpAnySourceMulticastClient class, which is a client receiver
for multicast traffic from any source, also known as Any Source Multicast (ASM) or
Internet Standard Multicast (ISM).
</p>
        <p>
Silverlight 4 gets support for microphones and webcams. It allows us to have access
to the raw streams. The added support opens a lot of opportunities for new types of
applications. 
</p>
        <p>
During our work on <a href="http://code.msdn.microsoft.com/rca">http://code.msdn.microsoft.com/rca</a> (source
code is available under the MS-PL license), we created an application that allows
users to communicate over the local network and to establish video/audio conferencing.
</p>
        <p>
The classes that expose this functionality live in the System.Windows.Media namespace. 
</p>
        <p>
There are two classes that give us access to audio and video (<a href="http://msdn.microsoft.com/en-us/library/system.windows.media.audiosink(VS.96).aspx">AudioSink</a>, <a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.96).aspx">VideoSink</a>).
</p>
        <p>
To obtain video information from a video input device in Silverlight, you have to
derive a custom video sink from VideoSink, which exposes several virtual callbacks:
</p>
        <ul>
          <li>
OnCaptureStarted 
</li>
          <li>
OnCaptureStopped 
</li>
          <li>
OnFormatChange 
</li>
          <li>
OnSamples 
</li>
        </ul>
        <p>
When you derive from VideoSink, you must provide overrides for the callbacks in order
to compile.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}</pre>
        </div>
        <p>
The idea was to split data related to the particular frame into a set of packets,
renumber them, add additional information and send them over the network.
</p>
        <p>
On the client side, the application receives the mentioned packets, orders them, recovers
the frame structure and passes frames to MediaElement, using MediaStreamSource.
</p>
        <p>
The sources can be downloaded <a href="http://code.msdn.microsoft.com/rca">here</a>.
All logic related to the media chat is located in the PSO.Client.UDPMediaChat project
(see Figure 1). It contains the following classes:
</p>
        <p>
          <table border="1" cellspacing="0" cellpadding="2">
            <tbody>
              <tr>
                <td valign="top">
                  <strong>Class name</strong>
                </td>
                <td valign="top">
                  <strong>Description</strong>
                </td>
              </tr>
              <tr>
                <td valign="top">
MediaFrame 
</td>
                <td valign="top">
Contains all related data to the media sample 
</td>
              </tr>
              <tr>
                <td valign="top">
UdpAudioSink, 
<br />
UdpVideoSink 
</td>
                <td valign="top">
These classes are responsible for the capturing raw media data and passing it to the
appropriate media channel. 
</td>
              </tr>
              <tr>
                <td valign="top">
VideoPacketChannel, 
<br />
AudioPacketChannel 
</td>
                <td valign="top">
These classes are responsible for the preparing data for the transmission. They split
media samples into a set of packets and pass them to the transmitter. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetPacketTransmitter 
</td>
                <td valign="top">
It contains the logic of the transmission and receives NetPackets over the network. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetAudioPacketSerializer, 
<br />
NetVideoPacketSerializer 
</td>
                <td valign="top">
These classes are responsible for the logic of packet serialization and de-serialization. 
</td>
              </tr>
              <tr>
                <td valign="top">
NetVideoPacket, 
<br />
NetAudioPacket 
</td>
                <td valign="top">
Stores all necessary media data that is prepared to send over the network. 
</td>
              </tr>
              <tr>
                <td valign="top">
StreamingServer 
</td>
                <td valign="top">
Contains logic that allows users to organize raw media data transmission over the
network. 
</td>
              </tr>
              <tr>
                <td valign="top">
MediaFrameSource 
</td>
                <td valign="top">
Contains media buffering logic. 
</td>
              </tr>
              <tr>
                <td valign="top">
RawMediaStreamSource 
</td>
                <td valign="top">
Contains the logic of the prepared media samples for the playback by MediaElement 
</td>
              </tr>
            </tbody>
          </table>
        </p>
        <p>
          <b>Table 1. The description of the most important classes.</b>
        </p>
        <p>
          <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Solution structure" border="0" alt="Solution structure" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard02_3.png" width="367" height="747" />
        </p>
        <p>
          <b>Figure 1. Solution explorer</b>
        </p>
        <p>
Sequence diagrams show how the application processes media samples before sending
them over a network.
</p>
        <p>
We streamed raw data without any compression. Unfortunately, Silverlight doesn't supply
codecs yet, but we suppose that it's possible to compress media streams using COM
Object Access in Trusted Applications.
</p>
        <p>
Figure 2 shows that we have two media data sources (VideoSink and AudioSink). They
pass media data to the corresponding media packet channel, which is responsible for
the media frames’ (samples’) processing and further transmission. We want to note
that these sinks work separately in different threads. Also, the media channel contains
frames splitting logic into a pile of packets. Each packet is sent over the network
separately.
</p>
        <p>
 <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_4.png" target="_blank"><img style="display: inline" title="Sequence diagram shows simplified algorithm of raw media streaming" alt="Sequence diagram shows simplified algorithm of raw media streaming" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_thumb_1.png" width="750" height="512" /></a></p>
        <p>
          <b>Figure 2. Sequence diagram shows simplified algorithm of raw media streaming.</b>
        </p>
        <p>
When you use a multicast client, the first thing you have to do is to join the group,
using the known multicast IP address (ex: 224.0.0.1 - The All Hosts multicast group
that contains all systems on the same network segment) and the port (ex: 9999). The
address block 224.0.0.0/24 (224.0.0.0 to 224.0.0.255) is designated for multicasting
on the local subnetwork only. When the connection has been made, you can start send
and/or receive from the group. 
</p>
        <p>
There are several security restrictions on connecting to multicast groups in Silverlight.
</p>
        <p>
The security policy checks included in the Silverlight runtime are designed to prevent
networking threats like DoS attacks, DNS rebinding, reverse tunnel attack, etc. Currently,
it's not possible to connect to remote ports less then 1024. Before a multicast client
is allowed to join a group, the Silverlight runtime implements a protocol check to
verify that the client has been granted permission to join the group and receive datagrams.
</p>
        <p>
Sink produces raw media data by the callback:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}</pre>
        </div>
        <p>
These data are packed in a media frame and passed to the corresponding media channel.
The channel splits the media frame into a set of packets because UdpAnySourceMulticastClient
restricts the amount of data that can be sent at once. So the application cuts huge
media frames that contain raw media data into small pieces and sends them over the
network. 
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Sequence diagram shows simplified playback algorithm of the raw media stream" border="0" alt="Sequence diagram shows simplified playback algorithm of the raw media stream" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_thumb.png" width="750" height="641" />
          </a>
        </p>
        <p>
          <b>Figure 3. Sequence diagram shows simplified playback algorithm of the raw media
stream.</b>
        </p>
        <p>
On the client side, UdpAnySourceMulticastClient receives raw bytes. It passes them
to NetPacketTransmitter. The transmitter verifies the destination address and “unpacks”
the packet.
</p>
        <p>
Then the transmitter notifies the media channels that the packet with media data has
been received.
</p>
        <p>
Each channel verifies the ability to process the incoming packet. The logic of the
channels could vary drastically, depending on the nature of the received data. For
instance, VideoChannel uses a special mechanism for the video frames recovery from
a set of packets. When the media channel decides that a subsequent frame is received
completely, it passes it to the MediaFrameSource.
</p>
        <p>
This class manages media frame queues for both audio and video frames. Each received
frame is added to the particular queue. The frames from the queues are pulled by the
MediaStreamSource.
</p>
        <p>
If the queue is empty, the thread that serves MediaStreamSource is suspended until
the queue receives at least one frame.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Audio chat window" border="0" alt="Audio chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_thumb.png" width="615" height="480" />
          </a>
        </p>
        <p>
          <b>Figure 5. Audio chat window</b>
        </p>
        <p>
A user can perform a call to other user by clicking on the phone icon at the left-side
of the main window. The other participant has to confirm the call. If the call is
confirmed, the special media control will be displayed (see Figure 5). By default
PSO establishes an audio conference. If you want to perform a video call you have
to press the film icon. In this case your application instance will start a video
transmission and the other participant will be able to see you. The video chat window
is displayed on figure 6.
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_2.png" target="_blank">
            <img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Video chat window" border="0" alt="Video chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_thumb.png" width="611" height="480" />
          </a>
        </p>
        <p>
          <b>Figure 6. Video chat window</b>
        </p>
        <p>
We successfully realized a proof of concept that shows the possibility of video conference
software development on the Silverlight 4 technology. Also, we built a universal extensible
framework that allows users to transmit data in the local network.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3cb21155-dcd3-4316-ad47-2e2452e72b68" />
      </body>
      <title>Video in Silverlight 4</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx</link>
      <pubDate>Wed, 21 Apr 2010 22:13:52 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Stanislav, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;Senior
.NET Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The latest version of Silverlight delivers hundreds of features, such as a full set
of form controls, enhanced data-binding support, printing API, UDP, webcam and microphone
support, full trust in out-of-browser, and so on. But it doesn't have an out-of-box
solution to stream video or audio captured from a microphone and Web camera via a
network. Current API allows you to capture video/audio data from media devices, and
it has a way to play back media information using MediaStreamSource and MediaElement
control. Also, API has the UdpAnySourceMulticastClient class, which is a client receiver
for multicast traffic from any source, also known as Any Source Multicast (ASM) or
Internet Standard Multicast (ISM).
&lt;/p&gt;
&lt;p&gt;
Silverlight 4 gets support for microphones and webcams. It allows us to have access
to the raw streams. The added support opens a lot of opportunities for new types of
applications. 
&lt;/p&gt;
&lt;p&gt;
During our work on &lt;a href="http://code.msdn.microsoft.com/rca"&gt;http://code.msdn.microsoft.com/rca&lt;/a&gt; (source
code is available under the MS-PL license), we created an application that allows
users to communicate over the local network and to establish video/audio conferencing.
&lt;/p&gt;
&lt;p&gt;
The classes that expose this functionality live in the System.Windows.Media namespace. 
&lt;/p&gt;
&lt;p&gt;
There are two classes that give us access to audio and video (&lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.audiosink(VS.96).aspx"&gt;AudioSink&lt;/a&gt;, &lt;a href="http://msdn.microsoft.com/en-us/library/system.windows.media.videosink(VS.96).aspx"&gt;VideoSink&lt;/a&gt;).
&lt;/p&gt;
&lt;p&gt;
To obtain video information from a video input device in Silverlight, you have to
derive a custom video sink from VideoSink, which exposes several virtual callbacks:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
OnCaptureStarted 
&lt;/li&gt;
&lt;li&gt;
OnCaptureStopped 
&lt;/li&gt;
&lt;li&gt;
OnFormatChange 
&lt;/li&gt;
&lt;li&gt;
OnSamples 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
When you derive from VideoSink, you must provide overrides for the callbacks in order
to compile.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
The idea was to split data related to the particular frame into a set of packets,
renumber them, add additional information and send them over the network.
&lt;/p&gt;
&lt;p&gt;
On the client side, the application receives the mentioned packets, orders them, recovers
the frame structure and passes frames to MediaElement, using MediaStreamSource.
&lt;/p&gt;
&lt;p&gt;
The sources can be downloaded &lt;a href="http://code.msdn.microsoft.com/rca"&gt;here&lt;/a&gt;.
All logic related to the media chat is located in the PSO.Client.UDPMediaChat project
(see Figure 1). It contains the following classes:
&lt;/p&gt;
&lt;p&gt;
&lt;table border="1" cellspacing="0" cellpadding="2"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
&lt;strong&gt;Class name&lt;/strong&gt; 
&lt;/td&gt;
&lt;td valign="top"&gt;
&lt;strong&gt;Description&lt;/strong&gt; 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
MediaFrame 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains all related data to the media sample 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
UdpAudioSink, 
&lt;br /&gt;
UdpVideoSink 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the capturing raw media data and passing it to the
appropriate media channel. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
VideoPacketChannel, 
&lt;br /&gt;
AudioPacketChannel 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the preparing data for the transmission. They split
media samples into a set of packets and pass them to the transmitter. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetPacketTransmitter 
&lt;/td&gt;
&lt;td valign="top"&gt;
It contains the logic of the transmission and receives NetPackets over the network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetAudioPacketSerializer, 
&lt;br /&gt;
NetVideoPacketSerializer 
&lt;/td&gt;
&lt;td valign="top"&gt;
These classes are responsible for the logic of packet serialization and de-serialization. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
NetVideoPacket, 
&lt;br /&gt;
NetAudioPacket 
&lt;/td&gt;
&lt;td valign="top"&gt;
Stores all necessary media data that is prepared to send over the network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
StreamingServer 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains logic that allows users to organize raw media data transmission over the
network. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
MediaFrameSource 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains media buffering logic. 
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top"&gt;
RawMediaStreamSource 
&lt;/td&gt;
&lt;td valign="top"&gt;
Contains the logic of the prepared media samples for the playback by MediaElement 
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Table 1. The description of the most important classes.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Solution structure" border="0" alt="Solution structure" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard02_3.png" width="367" height="747" /&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 1. Solution explorer&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
Sequence diagrams show how the application processes media samples before sending
them over a network.
&lt;/p&gt;
&lt;p&gt;
We streamed raw data without any compression. Unfortunately, Silverlight doesn't supply
codecs yet, but we suppose that it's possible to compress media streams using COM
Object Access in Trusted Applications.
&lt;/p&gt;
&lt;p&gt;
Figure 2 shows that we have two media data sources (VideoSink and AudioSink). They
pass media data to the corresponding media packet channel, which is responsible for
the media frames’ (samples’) processing and further transmission. We want to note
that these sinks work separately in different threads. Also, the media channel contains
frames splitting logic into a pile of packets. Each packet is sent over the network
separately.
&lt;/p&gt;
&lt;p&gt;
&amp;#160;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_4.png" target="_blank"&gt;&lt;img style="display: inline" title="Sequence diagram shows simplified algorithm of raw media streaming" alt="Sequence diagram shows simplified algorithm of raw media streaming" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard01_thumb_1.png" width="750" height="512" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 2. Sequence diagram shows simplified algorithm of raw media streaming.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
When you use a multicast client, the first thing you have to do is to join the group,
using the known multicast IP address (ex: 224.0.0.1 - The All Hosts multicast group
that contains all systems on the same network segment) and the port (ex: 9999). The
address block 224.0.0.0/24 (224.0.0.0 to 224.0.0.255) is designated for multicasting
on the local subnetwork only. When the connection has been made, you can start send
and/or receive from the group. 
&lt;/p&gt;
&lt;p&gt;
There are several security restrictions on connecting to multicast groups in Silverlight.
&lt;/p&gt;
&lt;p&gt;
The security policy checks included in the Silverlight runtime are designed to prevent
networking threats like DoS attacks, DNS rebinding, reverse tunnel attack, etc. Currently,
it's not possible to connect to remote ports less then 1024. Before a multicast client
is allowed to join a group, the Silverlight runtime implements a protocol check to
verify that the client has been granted permission to join the group and receive datagrams.
&lt;/p&gt;
&lt;p&gt;
Sink produces raw media data by the callback:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;protected override void OnSamples(long sampleTime, long frameDuration, byte[] sampleData)
{
	// Some code here...
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
These data are packed in a media frame and passed to the corresponding media channel.
The channel splits the media frame into a set of packets because UdpAnySourceMulticastClient
restricts the amount of data that can be sent at once. So the application cuts huge
media frames that contain raw media data into small pieces and sends them over the
network. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Sequence diagram shows simplified playback algorithm of the raw media stream" border="0" alt="Sequence diagram shows simplified playback algorithm of the raw media stream" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard04_thumb.png" width="750" height="641" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 3. Sequence diagram shows simplified playback algorithm of the raw media
stream.&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
On the client side, UdpAnySourceMulticastClient receives raw bytes. It passes them
to NetPacketTransmitter. The transmitter verifies the destination address and “unpacks”
the packet.
&lt;/p&gt;
&lt;p&gt;
Then the transmitter notifies the media channels that the packet with media data has
been received.
&lt;/p&gt;
&lt;p&gt;
Each channel verifies the ability to process the incoming packet. The logic of the
channels could vary drastically, depending on the nature of the received data. For
instance, VideoChannel uses a special mechanism for the video frames recovery from
a set of packets. When the media channel decides that a subsequent frame is received
completely, it passes it to the MediaFrameSource.
&lt;/p&gt;
&lt;p&gt;
This class manages media frame queues for both audio and video frames. Each received
frame is added to the particular queue. The frames from the queues are pulled by the
MediaStreamSource.
&lt;/p&gt;
&lt;p&gt;
If the queue is empty, the thread that serves MediaStreamSource is suspended until
the queue receives at least one frame.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Audio chat window" border="0" alt="Audio chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard05_thumb.png" width="615" height="480" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 5. Audio chat window&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
A user can perform a call to other user by clicking on the phone icon at the left-side
of the main window. The other participant has to confirm the call. If the call is
confirmed, the special media control will be displayed (see Figure 5). By default
PSO establishes an audio conference. If you want to perform a video call you have
to press the film icon. In this case your application instance will start a video
transmission and the other participant will be able to see you. The video chat window
is displayed on figure 6.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_2.png" target="_blank"&gt;&lt;img style="border-right-width: 0px; display: inline; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" title="Video chat window" border="0" alt="Video chat window" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/VideoinSilverlight4_B3A/Clipboard06_thumb.png" width="611" height="480" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p&gt;
&lt;b&gt;Figure 6. Video chat window&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
We successfully realized a proof of concept that shows the possibility of video conference
software development on the Silverlight 4 technology. Also, we built a universal extensible
framework that allows users to transmit data in the local network.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=3cb21155-dcd3-4316-ad47-2e2452e72b68" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,3cb21155-dcd3-4316-ad47-2e2452e72b68.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=4acdc401-94af-49ec-b97e-3b5dffc40ca7</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=4acdc401-94af-49ec-b97e-3b5dffc40ca7</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
We are glad to present the release of the new extended version of <a href="http://blogs.msdn.com/ales/archive/2010/02/05/rich-cloud-application-architecture-in-more-detail.aspx">Rich
Cloud Application</a> (RCA) that was announced in the last Rich Cloud Application
blog post. The main enhancements of this version are using Silverlight 4 RC features,
SQL Azure and Microsoft SyncFx:
</p>
        <ol>
          <li>
Using Silverlight’s comprehensive <a href="http://www.muranosoft.com/Outsourcingblog/Printing-Support-In-Silverlight-4-RC.aspx">printing
support</a>. Any registered user can make a hard copy, as well as a virtual printing
view, of any report in the system. 
</li>
          <li>
Using a microphone and Web camera in the world of today is the standard de facto of
user collaboration on the Internet. We extended the private chat with the possibility
of using a microphone and a Webcam for more effective cooperation. 
</li>
          <li>
Another cool feature of Silverlight 4 RC is multicast networking, enabling enterprises
to lower the cost of streaming broadcast events. We implemented <a href="http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx">video/audio
stream broadcasting</a> for video chat in the system by using UDP multicast. 
</li>
          <li>
Implementation of a new, complex rating system requires us to move the database from
Azure storage to Azure SQL. All changes that are needed to move the application from
Azure storage to Azure SQL will be described in the next blog post. 
</li>
          <li>
We implemented the possibility of comfortably working with our system in off-line
mode. The user can run the application in out-of-browser mode and work with cached
data. Any changes in cache will be synchronized with storage in Azure SQL by Microsoft
SyncFX while online. 
</li>
        </ol>
        <p>
Click below to take a look at screenshots of the application in action or try it online
at <a href="http://pso.cloudapp.net">http://pso.cloudapp.net</a>!
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:b4859f59-9f1d-41d8-8463-798f375b435d" class="wlWriterSmartContent">
          <a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!147&amp;ct=photos">
            <img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="View PSO v2 Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationPhase2isreleased_8DB/InlineRepresentation0a28ee78-e482-4c95-b36b-d78aed7bc61a.jpg" />
          </a>
          <div style="text-align: right; width: 400px">
            <a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!147&amp;ct=photos">View
Full Album</a>
          </div>
        </div>
        <p>
The full source of code, except synchronization, is available for download at the
MSDN Code Gallery under the MS-PL license. You can find some interesting solutions
and work-arounds for creating peer-to-peer video chat and printing support.
</p>
        <p>
So stay tuned and subscribe to our blog to get fresh news about Rich Cloud Application!
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4acdc401-94af-49ec-b97e-3b5dffc40ca7" />
      </body>
      <title>Rich Cloud Application Phase 2 is released!</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Phase-2-Is-Released.aspx</link>
      <pubDate>Wed, 21 Apr 2010 21:38:50 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
We are glad to present the release of the new extended version of &lt;a href="http://blogs.msdn.com/ales/archive/2010/02/05/rich-cloud-application-architecture-in-more-detail.aspx"&gt;Rich
Cloud Application&lt;/a&gt; (RCA) that was announced in the last Rich Cloud Application
blog post. The main enhancements of this version are using Silverlight 4 RC features,
SQL Azure and Microsoft SyncFx:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Using Silverlight’s comprehensive &lt;a href="http://www.muranosoft.com/Outsourcingblog/Printing-Support-In-Silverlight-4-RC.aspx"&gt;printing
support&lt;/a&gt;. Any registered user can make a hard copy, as well as a virtual printing
view, of any report in the system. 
&lt;/li&gt;
&lt;li&gt;
Using a microphone and Web camera in the world of today is the standard de facto of
user collaboration on the Internet. We extended the private chat with the possibility
of using a microphone and a Webcam for more effective cooperation. 
&lt;/li&gt;
&lt;li&gt;
Another cool feature of Silverlight 4 RC is multicast networking, enabling enterprises
to lower the cost of streaming broadcast events. We implemented &lt;a href="http://www.muranosoft.com/Outsourcingblog/Video-In-Silverlight-4.aspx"&gt;video/audio
stream broadcasting&lt;/a&gt; for video chat in the system by using UDP multicast. 
&lt;/li&gt;
&lt;li&gt;
Implementation of a new, complex rating system requires us to move the database from
Azure storage to Azure SQL. All changes that are needed to move the application from
Azure storage to Azure SQL will be described in the next blog post. 
&lt;/li&gt;
&lt;li&gt;
We implemented the possibility of comfortably working with our system in off-line
mode. The user can run the application in out-of-browser mode and work with cached
data. Any changes in cache will be synchronized with storage in Azure SQL by Microsoft
SyncFX while online. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Click below to take a look at screenshots of the application in action or try it online
at &lt;a href="http://pso.cloudapp.net"&gt;http://pso.cloudapp.net&lt;/a&gt;!
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:b4859f59-9f1d-41d8-8463-798f375b435d" class="wlWriterSmartContent"&gt;&lt;a style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!147&amp;amp;ct=photos"&gt;&lt;img style="border-right-width: 0px; border-top-width: 0px; border-bottom-width: 0px; border-left-width: 0px" alt="View PSO v2 Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationPhase2isreleased_8DB/InlineRepresentation0a28ee78-e482-4c95-b36b-d78aed7bc61a.jpg" /&gt;&lt;/a&gt; 
&lt;div style="text-align: right; width: 400px"&gt;&lt;a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!147&amp;amp;ct=photos"&gt;View
Full Album&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The full source of code, except synchronization, is available for download at the
MSDN Code Gallery under the MS-PL license. You can find some interesting solutions
and work-arounds for creating peer-to-peer video chat and printing support.
&lt;/p&gt;
&lt;p&gt;
So stay tuned and subscribe to our blog to get fresh news about Rich Cloud Application!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=4acdc401-94af-49ec-b97e-3b5dffc40ca7" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,4acdc401-94af-49ec-b97e-3b5dffc40ca7.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=baf1c62f-e4eb-4037-99ca-1c9e7d670678</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=baf1c62f-e4eb-4037-99ca-1c9e7d670678</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Alex, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">Senior
.NET Developer</a> on Murano Software’s team</em>
        </p>
        <p>
As Microsoft Azure spreads, the cloud computing and scaling technologies are getting
more and more familiar among the software developers. This is very essential, since
nowadays startups <i>scale fast or fail fast</i>.
</p>
        <p>
One of the advanced scaling techniques is <i>sharding</i>, which is horizontal data
partitioning, when large and scalability-sensitive data (e.g., a person's profiles
and his or her messages) are split into several <i>shards</i> by certain criteria
(regional, alphabetical and so on). You can add a new shard at any time to scale out
with less cost due to its smaller size and hardware requirements. All giants like
Flickr and Google are using <i>shards</i> in their architecture. There is a good amount
of network resources concerning <i>sharding</i> — e.g., at <a href="http://highscalability.com/unorthodox-approach-database-design-coming-shard">highscalability.com</a> or <a href="http://www.25hoursaday.com/weblog/2009/01/16/BuildingScalableDatabasesProsAndConsOfVariousDatabaseShardingSchemes.aspx">here</a>.
You can look at the <i>discussion</i><a href="http://www.mysqlperformanceblog.com/2009/08/06/why-you-dont-want-to-shard/">in
this blog</a> as a great example of sharding pros and cons from a practical angle.<i> Sharding</i> has
many difficult aspects and requires superior expertise in architecture and a large
investment in the design of your system.
</p>
        <p>
What concerns SQL Azure is that there are <a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx#dcasl">size
limitations</a> for the databases (originally they were up to 10Gb for a single database).
Although Microsoft <a href="http://blogs.msdn.com/cbiyikoglu/archive/2010/03/18/in-future-with-sql-azure.aspx">announced
50Gb databases</a>, the problem is still present for rapidly growing startups, and
Microsoft considers <i>sharding</i> one of the recommended solutions. Previously, <i>sharding</i> was
a high-end technology, but now it is knocking at the door of an average software development
team.
</p>
        <p>
Our company is going to develop an architectural guideline and software extensibility
kit, providing implementations for common sharding tasks, such as shard location service,
and using all the benefits of Microsoft Azure as a platform.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=baf1c62f-e4eb-4037-99ca-1c9e7d670678" />
      </body>
      <title>Microsoft Azure Sharding</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Microsoft-Azure-Sharding.aspx</link>
      <pubDate>Wed, 31 Mar 2010 09:16:38 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Alex, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;Senior
.NET Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
As Microsoft Azure spreads, the cloud computing and scaling technologies are getting
more and more familiar among the software developers. This is very essential, since
nowadays startups &lt;i&gt;scale fast or fail fast&lt;/i&gt;.
&lt;/p&gt;
&lt;p&gt;
One of the advanced scaling techniques is &lt;i&gt;sharding&lt;/i&gt;, which is horizontal data
partitioning, when large and scalability-sensitive data (e.g., a person's profiles
and his or her messages) are split into several &lt;i&gt;shards&lt;/i&gt; by certain criteria
(regional, alphabetical and so on). You can add a new shard at any time to scale out
with less cost due to its smaller size and hardware requirements. All giants like
Flickr and Google are using &lt;i&gt;shards&lt;/i&gt; in their architecture. There is a good amount
of network resources concerning &lt;i&gt;sharding&lt;/i&gt; — e.g., at &lt;a href="http://highscalability.com/unorthodox-approach-database-design-coming-shard"&gt;highscalability.com&lt;/a&gt; or &lt;a href="http://www.25hoursaday.com/weblog/2009/01/16/BuildingScalableDatabasesProsAndConsOfVariousDatabaseShardingSchemes.aspx"&gt;here&lt;/a&gt;.
You can look at the &lt;i&gt;discussion&lt;/i&gt; &lt;a href="http://www.mysqlperformanceblog.com/2009/08/06/why-you-dont-want-to-shard/"&gt;in
this blog&lt;/a&gt; as a great example of sharding pros and cons from a practical angle.&lt;i&gt; Sharding&lt;/i&gt; has
many difficult aspects and requires superior expertise in architecture and a large
investment in the design of your system.
&lt;/p&gt;
&lt;p&gt;
What concerns SQL Azure is that there are &lt;a href="http://msdn.microsoft.com/en-us/library/ee336245.aspx#dcasl"&gt;size
limitations&lt;/a&gt; for the databases (originally they were up to 10Gb for a single database).
Although Microsoft &lt;a href="http://blogs.msdn.com/cbiyikoglu/archive/2010/03/18/in-future-with-sql-azure.aspx"&gt;announced
50Gb databases&lt;/a&gt;, the problem is still present for rapidly growing startups, and
Microsoft considers &lt;i&gt;sharding&lt;/i&gt; one of the recommended solutions. Previously, &lt;i&gt;sharding&lt;/i&gt; was
a high-end technology, but now it is knocking at the door of an average software development
team.
&lt;/p&gt;
&lt;p&gt;
Our company is going to develop an architectural guideline and software extensibility
kit, providing implementations for common sharding tasks, such as shard location service,
and using all the benefits of Microsoft Azure as a platform.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=baf1c62f-e4eb-4037-99ca-1c9e7d670678" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,baf1c62f-e4eb-4037-99ca-1c9e7d670678.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Software Development</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=00a85692-e300-4a4d-af31-38de8d35e1ca</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=00a85692-e300-4a4d-af31-38de8d35e1ca</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
          <em>By Denis, a <a href="http://www.muranosoft.com/services/microsoftnet.aspx">.NET
Developer</a> on Murano Software’s team</em>
        </p>
        <p>
The growing popularity of cloud computing can easily be explained by the high ROI
that users get. In contrast to using SOA, with cloud computing, users receive a great
number of benefits with minimal capital expenditures. According to many studies, the
main advantages of cloud technologies are the reduction in the costs of building and
extending on-premises resources, the reduction in the effort and costs of IT management,
and the increase in flexibility and scalability. There is no question that <em>cloud
computing</em> is going to play a big part in the future hosting, scaling and managing
of Web applications. Microsoft introduced a new operation system, Windows Azure, as
“a cloud service operation system that serves as the development, service hosting
and service management environment for Windows Azure platform”. The goal of <a href="http://www.microsoft.com/windowsazure/windowsazure/">Windows
Azure</a> is to provide developers “with on-demand compute and storage to host, scale
and manage Web applications on the Internet through Microsoft<sup>®</sup> data centers”.
</p>
        <p>
As a software development outsourcing company, <a href="http://www.muranosoft.com">Murano
Software</a> has always been on the cutting edge of technology. This has enabled us
to develop <a href="http://muranosoft.com/stories/successstories.aspx">successful
Web-based software solutions</a> quickly and make our customers happy. That’s why
we probed into Microsoft’s cloud computing immediately after the initial presentation
of Microsoft Windows Azure - <a href="http://go.microsoft.com/fwlink/?LinkId=158011">Community
Technology Preview (CTP)</a>.
</p>
        <p>
We aimed at designing such a solution that would ensure real-time Web collaboration
for multiple users. The solution had to be based on the Windows Azure platform and
generalized into a framework.
</p>
        <p>
The implementation of this solution gave us a good sense of Windows Azure technologies,
capabilities and limitations.
</p>
        <h4>1. Capabilities and limitations of various Azure technologies
</h4>
        <p>
During the exploration phase of the project, we analyzed the capabilities and limitations
of various Azure technologies. The main parts of Microsoft’s Windows Azure platform
are the following cloud technologies:
</p>
        <ol>
          <li>
Windows AzureCompute service 
<ul><li>
Storage service 
</li><li>
Fabric 
</li></ul></li>
          <li>
SQL Azure (<a href="http://www.microsoft.com/windowsazure/sqlazure/">Learn more</a>) 
</li>
          <li>
.NET Services (<a href="http://www.microsoft.com/windowsazure/sqlazure/">Learn more</a>) 
</li>
        </ol>
        <p>
The Compute service runs applications and provides two different “instance” (virtual
machines) types for developers to use: Web Role Instances and Worker Role Instances.
Web Role can accept incoming HTTP and HTTPS requests, but can’t initiate its own request
for output. Windows Azure can’t ensure that multiple requests from the same user will
be sent to the same Web Role. So the Web Role must be stateless to make an application
scalable, and any client-specific state has to be written to Windows Azure storage,
SQL Azure or passed back to the client after each request. Worker Role can’t accept
requests from the outside. As a rule, it gets input via Queue (see figure 1). Worker
Role can send output to outside via Queue or outside connections, and it is used for
batch work.
</p>
        <p>
Windows Azure storage is exploited to exchange data between different parts of an
application, and it provides developers with blobs, tables and queues. Blobs are used
to save binary data up to 50 gigabytes. Tables aren’t relational tables. They contain
a set of entities with properties. A table has no fixed structure, so one table can
contain entities with different amount of properties. Different entities can even
have some properties that have equal names, but different types. A single table can
hold terabytes of data. Windows Azure storage offers a way to partition a table between
many servers to improve performance. It can be done by using different partition keys
for different groups of data.
</p>
        <p>
The main goal of Queue is to allow communication between different parts of Windows
Azure applications. So Queues provide a way for Web Role Instances to communicate
with Worker Role Instances. Data that’s part of a Queue’s message can reach up to
eight kilobytes, which isn’t much, in fact. 
</p>
        <h4>2. Preliminaries (Solution concept)
</h4>
        <p>
We have to solve several tasks to find a solution that will allow multiple users to
cooperate:
</p>
        <ol>
          <li>
What technologies of Windows Azure platform have to be used to process server side
work? 
</li>
          <li>
How to notify a user of changes made by other users in a system. 
</li>
        </ol>
        <h4>2.1. Technologies of the Windows Azure platform we use
</h4>
        <p>
Microsoft suggests we use Web Roles only for simple work processing, while Web Roles
and Worker Roles should be used in conjunction to process time-consuming work. We
decided to implement both variants in our solution to process simple and complex work.
Then we implemented a simple mechanism of switching between the two variants, which
entrusted a decision on task complexity to a developer. 
</p>
        <p>
When we use Web Role only, everything is simple. Let’s look at the variant when Web
Roles and Worker Roles are used in conjunction (see figure 1).
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_2.png">
            <img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb.png" width="682" height="373" />
          </a>
        </p>
        <p align="center">
          <strong>Figure 1. This is the general scheme of the Compute service work originally
offered by </strong>
          <a href="http://www.davidchappell.com/">
            <strong>David Chappell</strong>
          </a>
          <strong>.</strong>
        </p>
        <p>
Sending a lot of data to Worker Role makes Queue vulnerable. We decided to use a blob
to save both input and result data for Worker Role. A link to this blob can be saved
to Queue. Thus we avoid the Queue’s restriction.
</p>
        <p>
Users communicate with Web Role using WCF, so each operation contract in Web role
is the work requested by the user. If Web Role carries out simple work then everything
is clear. But how will Worker Role know what kind of work it has to perform? Taking
into account that our solution has to be generalized into a framework, we decided
to implement the following interface:
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public interface ITask : ICloneable
{
// Date and time of task created
	DateTime CreatedDate { get; set; }
// Task’s unique identifier
Guid TaskId { get; set; }
// Property defines usage of background processing
bool IsBackgroundProcessing { get; set; }
// Current state of a task: Success, Skipped, Postponed, Failed, Unknown
	TaskState State { get; set; }	
// Property used for saving task’s result
object ResultData { get; set; } 
// Property used for saving task’s input data
	object InputData { get; set; }
// Property used transfering exception, occured while task execution 
	Exception ExecutionException { get; set; }

	// Method defines essence of the task  
object Execute(); 
}</pre>
        </div>
        <p align="center">
          <strong>Figure 2. General task interface</strong>
        </p>
        <p>
Developers have to implement a class that inherits from the interface. Execute method
of the class determines work that has to be processed by an application based on our
framework. 
</p>
        <p>
Using the interface gives us the following advantages:
</p>
        <ol>
          <li>
A developer needs only to implement any logic in Execute method without any changes
in the framework. 
</li>
          <li>
Class can be serialized and sent to Worker Role from Web Role via Queue. Thus any
free Worker Role can get the class, deserialize it and run Execute method. 
</li>
          <li>
Implemented class can be performed either by Web Role or Worker Role. A developer
can choose which type of Role processes work. The IsBackgroundProcessing property
determines what kind of processing has to be done. 
</li>
        </ol>
        <p>
Our framework implements various applications to allow multiple users to work together
while the code is not changed inside the framework.
</p>
        <p>
Any modern application can’t work without a database. Microsoft provides two types
of storages: SQL Azure and Windows Azure storage. Usage of SQL Azure is similar to
SQL Server. So Azure storage is more interesting for us as part of the Windows Azure
platform. We decided to use Windows Azure storage in our solution. We implemented
a mechanism that allows creating tables in Azure storage in the simplest way. This
is a BaseEntity class implemented in the framework. 
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public abstract class BaseEntity : TableServiceEntity
{
	protected BaseEntity()
	{
		CreatedDate = DateTime.UtcNow;
	}
	public DateTime CreatedDate { get; set; }
	protected abstract void RebuildBuildRowKey();
}</pre>
        </div>
        <p>
A developer only needs to implement his own class that inherits from BaseEntity to
determine a table in Azure storage.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public class ShapeEntity : BaseEntity
{
	public string ShapeType { get; set; }
	public long Color { get; set; }
	public double Thickness { get; set; }
	public double Opacity { get; set; }
	public string XYPoints { get; set; }
	public string BoardName { get; set; }
	// This method can be overriden to implement 
	protected override void RebuildBuildRowKey()
	{
		throw new NotImplementedException();
	}
}</pre>
        </div>
        <p>
A developer implements context that creates all tables.
</p>
        <div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid">
          <pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;">public class PaintContext : TableServiceContext
{
	public const string BoardTable = "Boards";
	public const string ShapeTable = "Shapes";

	public PaintContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials)
	{ }

	public IQueryable<boardentity>
Boards { get { return CreateQuery<boardentity>
(BoardTable); } } public IQueryable<shapeentity>
Shapes { get { return CreateQuery<shapeentity>
(ShapeTable); } } }
</shapeentity></shapeentity></boardentity></boardentity></pre>
        </div>
        <h4>2.2. User notification
</h4>
        <p>
The solution that allows multiple users to cooperate has to include a mechanism to
notify users of changes. Let’s call any work requested by a user a task. We considered
three cases:
</p>
        <ol>
          <li>
One table is used for all tasks. Each task has a status showing if a task is completed
or is in use. Each Web role makes requests to this table and checks the presence of
tasks completed. If there is a completed task, then the task’s result is sent back
to the user. 
</li>
          <li>
Web Role creates new Queue for each user who makes request to it. The notification
“task completed” will be added to all users’ Queues when a task is completed. Web
Role checks these Queues to see if there is any notification of a completed task in
loop. Web Role gets a link to a blob, which contains result data from the notification
and sends it to the user. 
</li>
          <li>
.Net Service Bus can be used to notify users or Web Role of the task’s completion. 
</li>
        </ol>
        <p>
We decided include the first and third cases in our solution. The first option is
easy to implement, but produces a high load on the Storage Service, while a lot of
Web Role Instances are constantly pulling the table. But the table contains all history
of performed work. It can be used in a decision-making process about the sequence
for the different tasks performing the same actions. Usage of .Net Service Bus is
more complex in implementation, but it allows you to notify a user of the task’s completion
either directly or through Web Role. 
</p>
        <h4>2.3. Other features implemented in the framework
</h4>
        <p>
It is worth mentioning that Worker Role is a virtual machine (VM). This VM uses one
of the processor’s cores. There may arise a situation when our processor’s core isn’t
being used fully. For example, Worker Role is calling outside services, such as the
storage service or other services in the Internet, is waiting for a response. The
processor is idle while waiting for a response. We implemented a simple mechanism
to manage several threads under one Worker Role Instance. It allows you to load Worker
Role as much as possible.
</p>
        <h4>
        </h4>
        <h4>3. Overview of solution generalized to framework
</h4>
        <p>
Web Role accepts a request and selects one of the classes inherited from the task,
depending on the called operation contract. Then the class's TaskId, InputData and
IsBackgroundProcessing properties are filled by new Guid, Input data and IsBackgroundProcessing
flag from the request. This class is put to a task manager where the class’s properties
are saved to the Task table. Then the task manager either runs the class’s Execute
method or sends the class to Worker Role.
</p>
        <p>
Let’s look at the case when Web Role runs Execute method by itself. Web Role calls
Execute method of the current instance of class and saves the results to a blob. It
saves a link to this blob and updates the status into a Task table for the current
instance of class. Web Role returns the result data to the user as a result of the
called operation contract. 
</p>
        <p>
Now, let’s look at the case of using background processing. Task Manager saves the
class’s InputData to a blob with the name “InputData”+TaskId, and a link to that blob
is saved to Queue with the serialized instance of the class. Any free Worker Role
gets a serialized class from Queue, deserializes it and fills Input data from the
blob. Then Worker Role calls Execute method of the class. The results of Execute method
working are saved to a blob with the name “ResultData”+TaskId. A link to the blob
and the status “Task completed” are saved to the Task table. Web Role checks the Task
table in loop and returns the results from the blob when the status of class has changed
to completed state.
</p>
        <p>
The other way of notification is using.Net Service Bus by Web Role. In this case,
Worker Role, which is to be notified of class’s Execute method completion, creates
a request to Service Bus. .Net Service Bus raises an event when the class’s Execute
method has finished work, and all Web Role Instances subscribed to the event have
been notified. Notified Web Role gets results from the blob and sends it to the customer.
An address to the blob is stored to notification. If Web Role expects some results
data, but there isn’t any data to return to the user, Web Role puts the class to Worker
Role to repeat the performance.
</p>
        <p>
We have investigated the case when only one of the collaborating users makes a request
to Web Role to do some work and is notified of the task's completion. But other users
have to be notified of changes made by the requested work, too. 
</p>
        <p>
There are three options that can be used by a developer:
</p>
        <ol>
          <li>
A developer can implement an individual operation contract in WCF that checks the
Task table and returns all changes if there are any in loop. 
</li>
          <li>
A developer can use .Net Service Bus for notification of users directly. 
</li>
          <li>
A developer can implement a class that inherits from ITask. This class can take results
requested by the user using some processing. 
</li>
        </ol>
        <p>
In the second case, users subscribe to event from .Net Service Bus. This event is
raised if there are any changes in the system made by other users. The changes can
be transmitted either inside event arguments or via calling the individual operation
contract in WCF. So a developer can implement any algorithm of getting concrete results. 
</p>
        <p>
You can see the architecture of a scalable cloud application based on our framework
in figure 4, as well as the sequence diagram in figure 3. 
</p>
        <p>
          <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_4.png" target="_blank">
            <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Multidraw-GetShapes" border="0" alt="Multidraw-GetShapes" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_thumb_1.png" width="752" height="484" />
          </a>
        </p>
        <p align="center">
          <a name="_Ref244967518">
            <b>Figure </b>
          </a>
          <b>3. Sequence diagram shows processing
of user’s request using Service Bus.</b>
        </p>
        <p align="center">
          <strong>
            <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_2.png" target="_blank">
              <img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Multidraw" border="0" alt="Multidraw" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_thumb.png" width="747" height="709" />
            </a>
          </strong>
        </p>
        <p align="center">
          <a name="_Ref244967535">
            <b>Figure </b>
          </a>
          <b>4. Architecture of a scalable cloud application
based on our framework</b>
        </p>
        <p>
The main framework capabilities are as follows. The workflow of performing any work
depends on a scenario selected by a developer and can be expanded to achieve more
complex goals. The flexibility of the workflow is controlled by the properties determined
in the ITask interface. The rest of the logic and code remain the same for different
kinds of goals. The behavior depends only on the type of the class inherited from
ITask that is created in Web Role for each particular client request. Usage of .NET
Service Bus adds flexibility to the Silverlight Client – Web Role communication.
</p>
        <p>
Our solution for user notification is an alternative to polling duplex for Windows
Azure platform, which was in a stage of development at that moment. 
</p>
        <h4>Demo applications
</h4>
        <p>
To show our framework in action, we implemented a cloud application that allows multiple
users to draw many-colored shapes on the same board. Each user can see the changes
made by others. It’s a real-time collaborative drawing cloud application, using Silverlight
and Microsoft Windows Azure, and you are welcome to test-drive it at <a href="http://multidraw.cloudapp.net">http://multidraw.cloudapp.net</a>.
The framework can be easily adapted for any similar task. A good sample of an application
that can be created with the help of our architecture is a multi-edit grid that allows
a multiuser edition of the same grid. You can see the demo at <a href="http://multidraw.cloudapp.net/grid/SomeSession">http://multidraw.cloudapp.net/grid/SomeSession</a>.
</p>
        <p align="center">
          <strong>
            <a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_4.png" target="_blank">
              <img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb_1.png" width="710" height="569" />
            </a>
          </strong>
        </p>
        <p align="center">
          <strong>Figure 5. Screenshot of Multidraw application working in different browsers</strong>
        </p>
        <h3>Conclusion
</h3>
        <p>
We looked into new implementation of cloud computing presented in the Windows Azure
platform by Microsoft. We developed a universal framework architecture that allows
you to implement similar tasks with multiple-user interaction easily. We implemented
working prototypes that allow multiple users to draw many-colored shapes on the same
board and edit the same grid.
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=00a85692-e300-4a4d-af31-38de8d35e1ca" />
      </body>
      <title>Microsoft’s Windows Azure Cloud Computing in Action</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Microsofts-Windows-Azure-Cloud-Computing-In-Action.aspx</link>
      <pubDate>Thu, 04 Mar 2010 00:12:33 GMT</pubDate>
      <description>&lt;p&gt;
&lt;em&gt;By Denis, a &lt;a href="http://www.muranosoft.com/services/microsoftnet.aspx"&gt;.NET
Developer&lt;/a&gt; on Murano Software’s team&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The growing popularity of cloud computing can easily be explained by the high ROI
that users get. In contrast to using SOA, with cloud computing, users receive a great
number of benefits with minimal capital expenditures. According to many studies, the
main advantages of cloud technologies are the reduction in the costs of building and
extending on-premises resources, the reduction in the effort and costs of IT management,
and the increase in flexibility and scalability. There is no question that &lt;em&gt;cloud
computing&lt;/em&gt; is going to play a big part in the future hosting, scaling and managing
of Web applications. Microsoft introduced a new operation system, Windows Azure, as
“a cloud service operation system that serves as the development, service hosting
and service management environment for Windows Azure platform”. The goal of &lt;a href="http://www.microsoft.com/windowsazure/windowsazure/"&gt;Windows
Azure&lt;/a&gt; is to provide developers “with on-demand compute and storage to host, scale
and manage Web applications on the Internet through Microsoft&lt;sup&gt;®&lt;/sup&gt; data centers”.
&lt;/p&gt;
&lt;p&gt;
As a software development outsourcing company, &lt;a href="http://www.muranosoft.com"&gt;Murano
Software&lt;/a&gt; has always been on the cutting edge of technology. This has enabled us
to develop &lt;a href="http://muranosoft.com/stories/successstories.aspx"&gt;successful
Web-based software solutions&lt;/a&gt; quickly and make our customers happy. That’s why
we probed into Microsoft’s cloud computing immediately after the initial presentation
of Microsoft Windows Azure - &lt;a href="http://go.microsoft.com/fwlink/?LinkId=158011"&gt;Community
Technology Preview (CTP)&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
We aimed at designing such a solution that would ensure real-time Web collaboration
for multiple users. The solution had to be based on the Windows Azure platform and
generalized into a framework.
&lt;/p&gt;
&lt;p&gt;
The implementation of this solution gave us a good sense of Windows Azure technologies,
capabilities and limitations.
&lt;/p&gt;
&lt;h4&gt;1. Capabilities and limitations of various Azure technologies
&lt;/h4&gt;
&lt;p&gt;
During the exploration phase of the project, we analyzed the capabilities and limitations
of various Azure technologies. The main parts of Microsoft’s Windows Azure platform
are the following cloud technologies:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
Windows AzureCompute service 
&lt;ul&gt;
&lt;li&gt;
Storage service 
&lt;/li&gt;
&lt;li&gt;
Fabric 
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
SQL Azure (&lt;a href="http://www.microsoft.com/windowsazure/sqlazure/"&gt;Learn more&lt;/a&gt;) 
&lt;/li&gt;
&lt;li&gt;
.NET Services (&lt;a href="http://www.microsoft.com/windowsazure/sqlazure/"&gt;Learn more&lt;/a&gt;) 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The Compute service runs applications and provides two different “instance” (virtual
machines) types for developers to use: Web Role Instances and Worker Role Instances.
Web Role can accept incoming HTTP and HTTPS requests, but can’t initiate its own request
for output. Windows Azure can’t ensure that multiple requests from the same user will
be sent to the same Web Role. So the Web Role must be stateless to make an application
scalable, and any client-specific state has to be written to Windows Azure storage,
SQL Azure or passed back to the client after each request. Worker Role can’t accept
requests from the outside. As a rule, it gets input via Queue (see figure 1). Worker
Role can send output to outside via Queue or outside connections, and it is used for
batch work.
&lt;/p&gt;
&lt;p&gt;
Windows Azure storage is exploited to exchange data between different parts of an
application, and it provides developers with blobs, tables and queues. Blobs are used
to save binary data up to 50 gigabytes. Tables aren’t relational tables. They contain
a set of entities with properties. A table has no fixed structure, so one table can
contain entities with different amount of properties. Different entities can even
have some properties that have equal names, but different types. A single table can
hold terabytes of data. Windows Azure storage offers a way to partition a table between
many servers to improve performance. It can be done by using different partition keys
for different groups of data.
&lt;/p&gt;
&lt;p&gt;
The main goal of Queue is to allow communication between different parts of Windows
Azure applications. So Queues provide a way for Web Role Instances to communicate
with Worker Role Instances. Data that’s part of a Queue’s message can reach up to
eight kilobytes, which isn’t much, in fact. 
&lt;/p&gt;
&lt;h4&gt;2. Preliminaries (Solution concept)
&lt;/h4&gt;
&lt;p&gt;
We have to solve several tasks to find a solution that will allow multiple users to
cooperate:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
What technologies of Windows Azure platform have to be used to process server side
work? 
&lt;/li&gt;
&lt;li&gt;
How to notify a user of changes made by other users in a system. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;h4&gt;2.1. Technologies of the Windows Azure platform we use
&lt;/h4&gt;
&lt;p&gt;
Microsoft suggests we use Web Roles only for simple work processing, while Web Roles
and Worker Roles should be used in conjunction to process time-consuming work. We
decided to implement both variants in our solution to process simple and complex work.
Then we implemented a simple mechanism of switching between the two variants, which
entrusted a decision on task complexity to a developer. 
&lt;/p&gt;
&lt;p&gt;
When we use Web Role only, everything is simple. Let’s look at the variant when Web
Roles and Worker Roles are used in conjunction (see figure 1).
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_2.png"&gt;&lt;img style="border-right-width: 0px; display: block; float: none; border-top-width: 0px; border-bottom-width: 0px; margin-left: auto; border-left-width: 0px; margin-right: auto" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb.png" width="682" height="373" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 1. This is the general scheme of the Compute service work originally
offered by &lt;/strong&gt;&lt;a href="http://www.davidchappell.com/"&gt;&lt;strong&gt;David Chappell&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;.&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Sending a lot of data to Worker Role makes Queue vulnerable. We decided to use a blob
to save both input and result data for Worker Role. A link to this blob can be saved
to Queue. Thus we avoid the Queue’s restriction.
&lt;/p&gt;
&lt;p&gt;
Users communicate with Web Role using WCF, so each operation contract in Web role
is the work requested by the user. If Web Role carries out simple work then everything
is clear. But how will Worker Role know what kind of work it has to perform? Taking
into account that our solution has to be generalized into a framework, we decided
to implement the following interface:
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public interface ITask : ICloneable
{
// Date and time of task created
	DateTime CreatedDate { get; set; }
// Task’s unique identifier
Guid TaskId { get; set; }
// Property defines usage of background processing
bool IsBackgroundProcessing { get; set; }
// Current state of a task: Success, Skipped, Postponed, Failed, Unknown
	TaskState State { get; set; }	
// Property used for saving task’s result
object ResultData { get; set; } 
// Property used for saving task’s input data
	object InputData { get; set; }
// Property used transfering exception, occured while task execution 
	Exception ExecutionException { get; set; }

	// Method defines essence of the task  
object Execute(); 
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 2. General task interface&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Developers have to implement a class that inherits from the interface. Execute method
of the class determines work that has to be processed by an application based on our
framework. 
&lt;/p&gt;
&lt;p&gt;
Using the interface gives us the following advantages:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A developer needs only to implement any logic in Execute method without any changes
in the framework. 
&lt;/li&gt;
&lt;li&gt;
Class can be serialized and sent to Worker Role from Web Role via Queue. Thus any
free Worker Role can get the class, deserialize it and run Execute method. 
&lt;/li&gt;
&lt;li&gt;
Implemented class can be performed either by Web Role or Worker Role. A developer
can choose which type of Role processes work. The IsBackgroundProcessing property
determines what kind of processing has to be done. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Our framework implements various applications to allow multiple users to work together
while the code is not changed inside the framework.
&lt;/p&gt;
&lt;p&gt;
Any modern application can’t work without a database. Microsoft provides two types
of storages: SQL Azure and Windows Azure storage. Usage of SQL Azure is similar to
SQL Server. So Azure storage is more interesting for us as part of the Windows Azure
platform. We decided to use Windows Azure storage in our solution. We implemented
a mechanism that allows creating tables in Azure storage in the simplest way. This
is a BaseEntity class implemented in the framework. 
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public abstract class BaseEntity : TableServiceEntity
{
	protected BaseEntity()
	{
		CreatedDate = DateTime.UtcNow;
	}
	public DateTime CreatedDate { get; set; }
	protected abstract void RebuildBuildRowKey();
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A developer only needs to implement his own class that inherits from BaseEntity to
determine a table in Azure storage.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public class ShapeEntity : BaseEntity
{
	public string ShapeType { get; set; }
	public long Color { get; set; }
	public double Thickness { get; set; }
	public double Opacity { get; set; }
	public string XYPoints { get; set; }
	public string BoardName { get; set; }
	// This method can be overriden to implement 
	protected override void RebuildBuildRowKey()
	{
		throw new NotImplementedException();
	}
}&lt;/pre&gt;
&lt;/div&gt;
&lt;p&gt;
A developer implements context that creates all tables.
&lt;/p&gt;
&lt;div style="border-bottom: silver 1px solid; border-left: silver 1px solid; border-top: silver 1px solid; border-right: silver 1px solid"&gt;
&lt;pre class="brush: csharp; toolbar: true; gutter: false; bloggerMode:true;"&gt;public class PaintContext : TableServiceContext
{
	public const string BoardTable = &amp;quot;Boards&amp;quot;;
	public const string ShapeTable = &amp;quot;Shapes&amp;quot;;

	public PaintContext(string baseAddress, StorageCredentials credentials) : base(baseAddress, credentials)
	{ }

	public IQueryable&lt;boardentity&gt;
Boards { get { return CreateQuery&lt;boardentity&gt;
(BoardTable); } } public IQueryable&lt;shapeentity&gt;
Shapes { get { return CreateQuery&lt;shapeentity&gt;
(ShapeTable); } } }
&lt;/pre&gt;
&lt;/div&gt;
&lt;h4&gt;2.2. User notification
&lt;/h4&gt;
&lt;p&gt;
The solution that allows multiple users to cooperate has to include a mechanism to
notify users of changes. Let’s call any work requested by a user a task. We considered
three cases:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
One table is used for all tasks. Each task has a status showing if a task is completed
or is in use. Each Web role makes requests to this table and checks the presence of
tasks completed. If there is a completed task, then the task’s result is sent back
to the user. 
&lt;/li&gt;
&lt;li&gt;
Web Role creates new Queue for each user who makes request to it. The notification
“task completed” will be added to all users’ Queues when a task is completed. Web
Role checks these Queues to see if there is any notification of a completed task in
loop. Web Role gets a link to a blob, which contains result data from the notification
and sends it to the user. 
&lt;/li&gt;
&lt;li&gt;
.Net Service Bus can be used to notify users or Web Role of the task’s completion. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
We decided include the first and third cases in our solution. The first option is
easy to implement, but produces a high load on the Storage Service, while a lot of
Web Role Instances are constantly pulling the table. But the table contains all history
of performed work. It can be used in a decision-making process about the sequence
for the different tasks performing the same actions. Usage of .Net Service Bus is
more complex in implementation, but it allows you to notify a user of the task’s completion
either directly or through Web Role. 
&lt;/p&gt;
&lt;h4&gt;2.3. Other features implemented in the framework
&lt;/h4&gt;
&lt;p&gt;
It is worth mentioning that Worker Role is a virtual machine (VM). This VM uses one
of the processor’s cores. There may arise a situation when our processor’s core isn’t
being used fully. For example, Worker Role is calling outside services, such as the
storage service or other services in the Internet, is waiting for a response. The
processor is idle while waiting for a response. We implemented a simple mechanism
to manage several threads under one Worker Role Instance. It allows you to load Worker
Role as much as possible.
&lt;/p&gt;
&lt;h4&gt;
&lt;/h4&gt;
&lt;h4&gt;3. Overview of solution generalized to framework
&lt;/h4&gt;
&lt;p&gt;
Web Role accepts a request and selects one of the classes inherited from the task,
depending on the called operation contract. Then the class's TaskId, InputData and
IsBackgroundProcessing properties are filled by new Guid, Input data and IsBackgroundProcessing
flag from the request. This class is put to a task manager where the class’s properties
are saved to the Task table. Then the task manager either runs the class’s Execute
method or sends the class to Worker Role.
&lt;/p&gt;
&lt;p&gt;
Let’s look at the case when Web Role runs Execute method by itself. Web Role calls
Execute method of the current instance of class and saves the results to a blob. It
saves a link to this blob and updates the status into a Task table for the current
instance of class. Web Role returns the result data to the user as a result of the
called operation contract. 
&lt;/p&gt;
&lt;p&gt;
Now, let’s look at the case of using background processing. Task Manager saves the
class’s InputData to a blob with the name “InputData”+TaskId, and a link to that blob
is saved to Queue with the serialized instance of the class. Any free Worker Role
gets a serialized class from Queue, deserializes it and fills Input data from the
blob. Then Worker Role calls Execute method of the class. The results of Execute method
working are saved to a blob with the name “ResultData”+TaskId. A link to the blob
and the status “Task completed” are saved to the Task table. Web Role checks the Task
table in loop and returns the results from the blob when the status of class has changed
to completed state.
&lt;/p&gt;
&lt;p&gt;
The other way of notification is using.Net Service Bus by Web Role. In this case,
Worker Role, which is to be notified of class’s Execute method completion, creates
a request to Service Bus. .Net Service Bus raises an event when the class’s Execute
method has finished work, and all Web Role Instances subscribed to the event have
been notified. Notified Web Role gets results from the blob and sends it to the customer.
An address to the blob is stored to notification. If Web Role expects some results
data, but there isn’t any data to return to the user, Web Role puts the class to Worker
Role to repeat the performance.
&lt;/p&gt;
&lt;p&gt;
We have investigated the case when only one of the collaborating users makes a request
to Web Role to do some work and is notified of the task's completion. But other users
have to be notified of changes made by the requested work, too. 
&lt;/p&gt;
&lt;p&gt;
There are three options that can be used by a developer:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
A developer can implement an individual operation contract in WCF that checks the
Task table and returns all changes if there are any in loop. 
&lt;/li&gt;
&lt;li&gt;
A developer can use .Net Service Bus for notification of users directly. 
&lt;/li&gt;
&lt;li&gt;
A developer can implement a class that inherits from ITask. This class can take results
requested by the user using some processing. 
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
In the second case, users subscribe to event from .Net Service Bus. This event is
raised if there are any changes in the system made by other users. The changes can
be transmitted either inside event arguments or via calling the individual operation
contract in WCF. So a developer can implement any algorithm of getting concrete results. 
&lt;/p&gt;
&lt;p&gt;
You can see the architecture of a scalable cloud application based on our framework
in figure 4, as well as the sequence diagram in figure 3. 
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Multidraw-GetShapes" border="0" alt="Multidraw-GetShapes" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw-GetShapes_thumb_1.png" width="752" height="484" /&gt;&lt;/a&gt; 
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a name="_Ref244967518"&gt;&lt;b&gt;Figure &lt;/b&gt;&lt;/a&gt;&lt;b&gt;3. Sequence diagram shows processing
of user’s request using Service Bus.&lt;/b&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_2.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; border-top: 0px; border-right: 0px" title="Multidraw" border="0" alt="Multidraw" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Multidraw_thumb.png" width="747" height="709" /&gt;&lt;/a&gt; &lt;/strong&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;a name="_Ref244967535"&gt;&lt;b&gt;Figure &lt;/b&gt;&lt;/a&gt;&lt;b&gt;4. Architecture of a scalable cloud application
based on our framework&lt;/b&gt;
&lt;/p&gt;
&lt;p&gt;
The main framework capabilities are as follows. The workflow of performing any work
depends on a scenario selected by a developer and can be expanded to achieve more
complex goals. The flexibility of the workflow is controlled by the properties determined
in the ITask interface. The rest of the logic and code remain the same for different
kinds of goals. The behavior depends only on the type of the class inherited from
ITask that is created in Web Role for each particular client request. Usage of .NET
Service Bus adds flexibility to the Silverlight Client – Web Role communication.
&lt;/p&gt;
&lt;p&gt;
Our solution for user notification is an alternative to polling duplex for Windows
Azure platform, which was in a stage of development at that moment. 
&lt;/p&gt;
&lt;h4&gt;Demo applications
&lt;/h4&gt;
&lt;p&gt;
To show our framework in action, we implemented a cloud application that allows multiple
users to draw many-colored shapes on the same board. Each user can see the changes
made by others. It’s a real-time collaborative drawing cloud application, using Silverlight
and Microsoft Windows Azure, and you are welcome to test-drive it at &lt;a href="http://multidraw.cloudapp.net"&gt;http://multidraw.cloudapp.net&lt;/a&gt;.
The framework can be easily adapted for any similar task. A good sample of an application
that can be created with the help of our architecture is a multi-edit grid that allows
a multiuser edition of the same grid. You can see the demo at &lt;a href="http://multidraw.cloudapp.net/grid/SomeSession"&gt;http://multidraw.cloudapp.net/grid/SomeSession&lt;/a&gt;.
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;&lt;a href="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_4.png" target="_blank"&gt;&lt;img style="border-bottom: 0px; border-left: 0px; display: inline; margin-left: 0px; border-top: 0px; margin-right: 0px; border-right: 0px" title="Clipboard01" border="0" alt="Clipboard01" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/MicrosoftsWindowsAzureCloudComputinginAc_18D4/Clipboard01_thumb_1.png" width="710" height="569" /&gt;&lt;/a&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p align="center"&gt;
&lt;strong&gt;Figure 5. Screenshot of Multidraw application working in different browsers&lt;/strong&gt;
&lt;/p&gt;
&lt;h3&gt;Conclusion
&lt;/h3&gt;
&lt;p&gt;
We looked into new implementation of cloud computing presented in the Windows Azure
platform by Microsoft. We developed a universal framework architecture that allows
you to implement similar tasks with multiple-user interaction easily. We implemented
working prototypes that allow multiple users to draw many-colored shapes on the same
board and edit the same grid.
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=00a85692-e300-4a4d-af31-38de8d35e1ca" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,00a85692-e300-4a4d-af31-38de8d35e1ca.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=0b39a3d3-27f1-4a35-be06-1c8a488c0a79</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=0b39a3d3-27f1-4a35-be06-1c8a488c0a79</wfw:commentRss>
      <slash:comments>2</slash:comments>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
We are proud to announce the release of the <a href="http://blogs.msdn.com/ales/archive/2009/12/06/what-is-rca-rich-cloud-application.aspx">Rich
Cloud Application</a> (RCA) that Microsoft hired us to develop for showcasing Azure
and Silverlight. This application is a proof-of-concept, simple product support and
feedback system that provides these features:
</p>
        <ul>
          <li>
Issue-tracking system that supports attachments and hierarchical user comments 
</li>
          <li>
Peer-to-peer messaging for user collaboration 
</li>
          <li>
5-star rating system for user comments and point rating system for issues and users 
</li>
          <li>
Item search, both in-place and with external providers, such as <a href="http://support.microsoft.com/fixit">Microsoft
FixIt</a></li>
          <li>
User profile management and usage statistics 
</li>
        </ul>
        <p>
Click below to take a look at screenshots of the application in action or try it online
at <a href="http://pso.cloudapp.net">http://pso.cloudapp.net</a>!
</p>
        <div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:8120d191-4e26-4f79-adc1-e89509f9bdb9" class="wlWriterEditableSmartContent">
          <a style="border:0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!111&amp;ct=photos">
            <img style="border:0px" alt="View RCA Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationisreleased_2F36/InlineRepresentation83a51123-3f47-4706-b780-86e154d75c78.jpg" />
          </a>
          <div style="width:400px;text-align:right;">
            <a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;resid=F279FBD2C1838CBF!111&amp;ct=photos">View
Full Album</a>
          </div>
        </div>
        <p>
The application provides a great set of best practices for building scalable Windows
Azure applications with rich Silverlight UI. It shows how to implement MVVM in Silverlight
3, work with Azure Storage from Silverlight just like any WCF data source, and use
Live ID authentication with Silverlight and Windows Azure.
</p>
        <p>
Let me remind you that the application uses Azure Storage. It is a fast and scalable
non-relational storage that has a lot of advantages, but also imposes a set of limitations.
For instance, you can't get a number of entities in a table or perform a wildcard
search. And we are going to write a series of blog posts where we will describe how
to get around these limitations. If you don't want to wait, I have good news for you
:) The full source code is available for download at <a href="http://code.msdn.microsoft.com/rca">MSDN
Code Gallery</a> under <a href="http://www.microsoft.com/opensource/licenses.mspx">MS-PL
license</a>. Thus you can reuse these components in your applications!
</p>
        <p>
And one more piece of good news: Our team is working on a new version of the application.
The new version will be finished in the middle of March and will provide SQL Azure
support and include a lot of nice features made possible with release of Silverlight
4 RC, such as printing support, integration with a microphone and a webcam, and UDP
multicast to peer-to-peer collaboration.
</p>
        <p>
So stay tuned and subscribe to our blog to get fresh news about the Rich Cloud Application!
</p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=0b39a3d3-27f1-4a35-be06-1c8a488c0a79" />
      </body>
      <title>Rich Cloud Application is released!</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/Rich-Cloud-Application-Is-Released.aspx</link>
      <pubDate>Wed, 17 Feb 2010 14:15:03 GMT</pubDate>
      <description>&lt;p&gt;
We are proud to announce the release of the &lt;a href="http://blogs.msdn.com/ales/archive/2009/12/06/what-is-rca-rich-cloud-application.aspx"&gt;Rich
Cloud Application&lt;/a&gt; (RCA) that Microsoft hired us to develop for showcasing Azure
and Silverlight. This application is a proof-of-concept, simple product support and
feedback system that provides these features:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
Issue-tracking system that supports attachments and hierarchical user comments 
&lt;/li&gt;
&lt;li&gt;
Peer-to-peer messaging for user collaboration 
&lt;/li&gt;
&lt;li&gt;
5-star rating system for user comments and point rating system for issues and users 
&lt;/li&gt;
&lt;li&gt;
Item search, both in-place and with external providers, such as &lt;a href="http://support.microsoft.com/fixit"&gt;Microsoft
FixIt&lt;/a&gt; 
&lt;/li&gt;
&lt;li&gt;
User profile management and usage statistics 
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Click below to take a look at screenshots of the application in action or try it online
at &lt;a href="http://pso.cloudapp.net"&gt;http://pso.cloudapp.net&lt;/a&gt;!
&lt;/p&gt;
&lt;div style="padding-bottom: 0px; margin: 0px; padding-left: 0px; width: 400px; padding-right: 0px; display: inline; float: none; padding-top: 0px" id="scid:66721397-FF69-4ca6-AEC4-17E6B3208830:8120d191-4e26-4f79-adc1-e89509f9bdb9" class="wlWriterEditableSmartContent"&gt;&lt;a style="border:0px" href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!111&amp;amp;ct=photos"&gt;&lt;img style="border:0px" alt="View RCA Screenshots" src="http://www.muranosoft.com/Outsourcingblog/content/binary/WindowsLiveWriter/RichCloudApplicationisreleased_2F36/InlineRepresentation83a51123-3f47-4706-b780-86e154d75c78.jpg" /&gt;&lt;/a&gt;
&lt;div style="width:400px;text-align:right;" &gt;&lt;a href="http://cid-f279fbd2c1838cbf.skydrive.live.com/redir.aspx?page=browse&amp;amp;resid=F279FBD2C1838CBF!111&amp;amp;ct=photos"&gt;View
Full Album&lt;/a&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;
The application provides a great set of best practices for building scalable Windows
Azure applications with rich Silverlight UI. It shows how to implement MVVM in Silverlight
3, work with Azure Storage from Silverlight just like any WCF data source, and use
Live ID authentication with Silverlight and Windows Azure.
&lt;/p&gt;
&lt;p&gt;
Let me remind you that the application uses Azure Storage. It is a fast and scalable
non-relational storage that has a lot of advantages, but also imposes a set of limitations.
For instance, you can't get a number of entities in a table or perform a wildcard
search. And we are going to write a series of blog posts where we will describe how
to get around these limitations. If you don't want to wait, I have good news for you
:) The full source code is available for download at &lt;a href="http://code.msdn.microsoft.com/rca"&gt;MSDN
Code Gallery&lt;/a&gt; under &lt;a href="http://www.microsoft.com/opensource/licenses.mspx"&gt;MS-PL
license&lt;/a&gt;. Thus you can reuse these components in your applications!
&lt;/p&gt;
&lt;p&gt;
And one more piece of good news: Our team is working on a new version of the application.
The new version will be finished in the middle of March and will provide SQL Azure
support and include a lot of nice features made possible with release of Silverlight
4 RC, such as printing support, integration with a microphone and a webcam, and UDP
multicast to peer-to-peer collaboration.
&lt;/p&gt;
&lt;p&gt;
So stay tuned and subscribe to our blog to get fresh news about the Rich Cloud Application!
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=0b39a3d3-27f1-4a35-be06-1c8a488c0a79" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,0b39a3d3-27f1-4a35-be06-1c8a488c0a79.aspx</comments>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Silverlight</category>
      <category>Software Development</category>
      <category>Visual Studio</category>
    </item>
    <item>
      <trackback:ping>http://www.muranosoft.com/Outsourcingblog/Trackback.aspx?guid=656f9ee2-43df-4c7e-a400-e03e546a1bbc</trackback:ping>
      <pingback:server>http://www.muranosoft.com/Outsourcingblog/pingback.aspx</pingback:server>
      <pingback:target>http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,656f9ee2-43df-4c7e-a400-e03e546a1bbc.aspx</pingback:target>
      <dc:creator>Muranosoft admin</dc:creator>
      <wfw:comment>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,656f9ee2-43df-4c7e-a400-e03e546a1bbc.aspx</wfw:comment>
      <wfw:commentRss>http://www.muranosoft.com/Outsourcingblog/SyndicationService.asmx/GetEntryCommentsRss?guid=656f9ee2-43df-4c7e-a400-e03e546a1bbc</wfw:commentRss>
      <body xmlns="http://www.w3.org/1999/xhtml">
        <p>
October 27, 2009 has become a significant date in the cloud battle. Amazon released
its answer to <a href="http://www.microsoft.com/windowsazure/sqlazure/">SQL Azure</a> offered
by Microsoft.  Amazon Web Services is out with a relational database service,
the <a href="http://aws.amazon.com/rds/">Amazon RDS</a> (Amazon Relational Database).
Amazon RDS is a fully MySQL 5.1-compatible database as a service offering and now
in beta. 
</p>
        <p>
Amazon RDS allows users to select from 5GB to 1TB of associated storage capacity and
supports five DB instance classes: 
<br />
•    Small DB Instance: 1.7 GB memory, 1 ECU (1 virtual core with 1
ECU*) 
<br />
•    Large DB Instance: 7.5 GB memory, 4 ECUs (2 virtual cores with
2 ECUs each) 
<br />
•    Extra Large DB Instance: 15 GB of memory, 8 ECUs (4 virtual cores
with 2 ECUs each) 
<br />
•    Double Extra Large DB Instance: 34 GB of memory, 13 ECUs (4 virtual
cores with 3,25 ECUs each) 
<br />
•    Quadruple Extra Large DB Instance: 68 GB of memory, 26 ECUs (8
virtual cores with 3.25 ECUs each) 
</p>
        <p>
          <em>* One ECU provides the equivalent CPU capacity of a 1.0-1.2 GHz 2007 Opteron or
2007 Xeon processor. </em>
        </p>
        <p>
Now let’s look at each of them closer and examine them by feature:
</p>
        <table border="1" cellspacing="0" cellpadding="1" width="698">
          <tbody>
            <tr>
              <td valign="top" width="159">
 </td>
              <td valign="top" width="268">
                <p>
                  <strong>Amazon RDS</strong>
                </p>
              </td>
              <td valign="top" width="269">
                <p>
                  <strong>SQL Azure</strong>
                </p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="161">
Based on DBMS</td>
              <td valign="top" width="267">
MySQL 5.1</td>
              <td valign="top" width="269">
SQL Server 2008</td>
            </tr>
            <tr>
              <td valign="top" width="162">
Scalability</td>
              <td valign="top" width="267">
Limited by DB Instance Classes (see above). 
</td>
              <td valign="top" width="268">
Pay-as-you-grow, multi-tenant, scalable service model.</td>
            </tr>
            <tr>
              <td valign="top" width="163">
Minimum Database Size</td>
              <td valign="top" width="266">
5 GB</td>
              <td valign="top" width="268">
1 GB</td>
            </tr>
            <tr>
              <td valign="top" width="164">
Maximum Database Size</td>
              <td valign="top" width="266">
1 TB</td>
              <td valign="top" width="268">
10 GB</td>
            </tr>
            <tr>
              <td valign="top" width="165">
High Availability</td>
              <td valign="top" width="265">
RDS backs up a database, storing the backups for a user-defined retention period.</td>
              <td valign="top" width="267">
                <p>
Multiple redundant copies of user databases for fast failover and high availability
in case of failures, and automatic load balancing for optimal resource utilization
and performance.
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="165">
Management</td>
              <td valign="top" width="265">
Support for MySQL application and <a href="http://dev.mysql.com/downloads/gui-tools/5.0.html">tools</a>,
simple set of Web services <a href="http://aws.amazon.com/rds/#details">APIs</a> and <a href="http://aws.typepad.com/aws/2009/10/introducing-rds-the-amazon-relational-database-service-.html">command-line
tools</a>.</td>
              <td valign="top" width="267">
                <p>
Support for SQL Server Management Studio, SQL Server PowerShell™ and programmatic
access via SQL Server Management Objects (SMO).
</p>
              </td>
            </tr>
            <tr>
              <td valign="top" width="165">
DB Instance Pricing</td>
              <td valign="top" width="265">
                <p>
~$79 - $2,200 / month, depending on DB instance classes:
</p>
                <table border="1" cellspacing="0" cellpadding="0">
                  <tbody>
                    <tr>
                      <td valign="top" width="178">
                        <p>
                          <b>DB Instance Class</b>
                        </p>
                      </td>
                      <td valign="top" width="56">
                        <p>
                          <b>Per Hr</b>
                        </p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="178">
                        <p>
Small DB
</p>
                      </td>
                      <td valign="top" width="56">
                        <p>
$0.11
</p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="178">
                        <p>
Large DB 
</p>
                      </td>
                      <td valign="top" width="56">
                        <p>
$0.44
</p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="178">
                        <p>
Extra Large DB 
</p>
                      </td>
                      <td valign="top" width="56">
                        <p>
$0.88
</p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="178">
                        <p>
Double Extra Large DB 
</p>
                      </td>
                      <td valign="top" width="56">
                        <p>
$1.55
</p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="178">
                        <p>
Quadruple Extra Large DB
</p>
                      </td>
                      <td valign="top" width="56">
                        <p>
$3.10
</p>
                      </td>
                    </tr>
                  </tbody>
                </table>
              </td>
              <td valign="top" width="267">
                <p>
$9.99 - $99.99* / month, depending on DB edition:
</p>
                <table border="1" cellspacing="0" cellpadding="0" width="238">
                  <tbody>
                    <tr>
                      <td valign="top" width="172">
                        <p>
                          <b>DB Edition</b>
                        </p>
                      </td>
                      <td valign="top" width="64">
                        <p>
                          <b>Per month</b>
                        </p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="172">
                        <p>
Web Edition, up to 1 GB
</p>
                      </td>
                      <td valign="top" width="64">
                        <p>
$9.99
</p>
                      </td>
                    </tr>
                    <tr>
                      <td valign="top" width="172">
                        <p>
Business Edition, up to 10 GB
</p>
                      </td>
                      <td valign="top" width="64">
                        <p>
$99.99
</p>
                      </td>
                    </tr>
                  </tbody>
                </table>
              </td>
            </tr>
            <tr>
              <td valign="top" width="165">
Data Transfer Pricing</td>
              <td valign="top" width="265">
$0.10 in / $0.10 - $0.17 out / GB</td>
              <td valign="top" width="267">
$0.10 in / $0.15 out / GB</td>
            </tr>
            <tr>
              <td valign="top" width="165">
Database Storage Pricing</td>
              <td valign="top" width="265">
$0.10 per GB-month of provisioned storage.</td>
              <td valign="top" width="267">
Included in DB Instance Pricing.</td>
            </tr>
            <tr>
              <td valign="top" width="165">
I/O Request Pricing</td>
              <td valign="top" width="265">
$0.10 per 1 million I/O requests.</td>
              <td valign="top" width="268">
Included in DB instance pricing.</td>
            </tr>
          </tbody>
        </table>
        <p>
          <em>* Windows Azure is currently in Community Technology Preview (CTP), and the services
are free to evaluate through January 2010.</em>
        </p>
        <img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=656f9ee2-43df-4c7e-a400-e03e546a1bbc" />
      </body>
      <title>SQL Azure vs. Amazon RDS</title>
      <guid isPermaLink="false">http://www.muranosoft.com/Outsourcingblog/PermaLink,guid,656f9ee2-43df-4c7e-a400-e03e546a1bbc.aspx</guid>
      <link>http://www.muranosoft.com/Outsourcingblog/SQL-Azure-Vs-Amazon-RDS.aspx</link>
      <pubDate>Tue, 17 Nov 2009 10:10:55 GMT</pubDate>
      <description>&lt;p&gt;
October 27, 2009 has become a significant date in the cloud battle. Amazon released
its answer to &lt;a href="http://www.microsoft.com/windowsazure/sqlazure/"&gt;SQL Azure&lt;/a&gt; offered
by Microsoft.&amp;#160; Amazon Web Services is out with a relational database service,
the &lt;a href="http://aws.amazon.com/rds/"&gt;Amazon RDS&lt;/a&gt; (Amazon Relational Database).
Amazon RDS is a fully MySQL 5.1-compatible database as a service offering and now
in beta. 
&lt;/p&gt;
&lt;p&gt;
Amazon RDS allows users to select from 5GB to 1TB of associated storage capacity and
supports five DB instance classes: 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Small DB Instance: 1.7 GB memory, 1 ECU (1 virtual core with 1
ECU*) 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Large DB Instance: 7.5 GB memory, 4 ECUs (2 virtual cores with
2 ECUs each) 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Extra Large DB Instance: 15 GB of memory, 8 ECUs (4 virtual cores
with 2 ECUs each) 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Double Extra Large DB Instance: 34 GB of memory, 13 ECUs (4 virtual
cores with 3,25 ECUs each) 
&lt;br /&gt;
•&amp;#160;&amp;#160;&amp;#160; Quadruple Extra Large DB Instance: 68 GB of memory, 26 ECUs (8
virtual cores with 3.25 ECUs each) 
&lt;/p&gt;
&lt;p&gt;
&lt;em&gt;* One ECU provides the equivalent CPU capacity of a 1.0-1.2 GHz 2007 Opteron or
2007 Xeon processor. &lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
Now let’s look at each of them closer and examine them by feature:
&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="1" width="698"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="159"&gt;
&amp;#160;&lt;/td&gt;
&lt;td valign="top" width="268"&gt;
&lt;p&gt;
&lt;strong&gt;Amazon RDS&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="269"&gt;
&lt;p&gt;
&lt;strong&gt;SQL Azure&lt;/strong&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="161"&gt;
Based on DBMS&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
MySQL 5.1&lt;/td&gt;
&lt;td valign="top" width="269"&gt;
SQL Server 2008&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="162"&gt;
Scalability&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
Limited by DB Instance Classes (see above). 
&lt;/td&gt;
&lt;td valign="top" width="268"&gt;
Pay-as-you-grow, multi-tenant, scalable service model.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="163"&gt;
Minimum Database Size&lt;/td&gt;
&lt;td valign="top" width="266"&gt;
5 GB&lt;/td&gt;
&lt;td valign="top" width="268"&gt;
1 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="164"&gt;
Maximum Database Size&lt;/td&gt;
&lt;td valign="top" width="266"&gt;
1 TB&lt;/td&gt;
&lt;td valign="top" width="268"&gt;
10 GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
High Availability&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
RDS backs up a database, storing the backups for a user-defined retention period.&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
&lt;p&gt;
Multiple redundant copies of user databases for fast failover and high availability
in case of failures, and automatic load balancing for optimal resource utilization
and performance.
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
Management&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
Support for MySQL application and &lt;a href="http://dev.mysql.com/downloads/gui-tools/5.0.html"&gt;tools&lt;/a&gt;,
simple set of Web services &lt;a href="http://aws.amazon.com/rds/#details"&gt;APIs&lt;/a&gt; and &lt;a href="http://aws.typepad.com/aws/2009/10/introducing-rds-the-amazon-relational-database-service-.html"&gt;command-line
tools&lt;/a&gt;.&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
&lt;p&gt;
Support for SQL Server Management Studio, SQL Server PowerShell™ and programmatic
access via SQL Server Management Objects (SMO).
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
DB Instance Pricing&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
&lt;p&gt;
~$79 - $2,200 / month, depending on DB instance classes:
&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
&lt;b&gt;DB Instance Class&lt;/b&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
&lt;b&gt;Per Hr&lt;/b&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
Small DB
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
$0.11
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
Large DB 
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
$0.44
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
Extra Large DB 
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
$0.88
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
Double Extra Large DB 
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
$1.55
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="178"&gt;
&lt;p&gt;
Quadruple Extra Large DB
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="56"&gt;
&lt;p&gt;
$3.10
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
&lt;p&gt;
$9.99 - $99.99* / month, depending on DB edition:
&lt;/p&gt;
&lt;table border="1" cellspacing="0" cellpadding="0" width="238"&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td valign="top" width="172"&gt;
&lt;p&gt;
&lt;b&gt;DB Edition&lt;/b&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="64"&gt;
&lt;p&gt;
&lt;b&gt;Per month&lt;/b&gt;
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="172"&gt;
&lt;p&gt;
Web Edition, up to 1 GB
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="64"&gt;
&lt;p&gt;
$9.99
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="172"&gt;
&lt;p&gt;
Business Edition, up to 10 GB
&lt;/p&gt;
&lt;/td&gt;
&lt;td valign="top" width="64"&gt;
&lt;p&gt;
$99.99
&lt;/p&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
Data Transfer Pricing&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
$0.10 in / $0.10 - $0.17 out / GB&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
$0.10 in / $0.15 out / GB&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
Database Storage Pricing&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
$0.10 per GB-month of provisioned storage.&lt;/td&gt;
&lt;td valign="top" width="267"&gt;
Included in DB Instance Pricing.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td valign="top" width="165"&gt;
I/O Request Pricing&lt;/td&gt;
&lt;td valign="top" width="265"&gt;
$0.10 per 1 million I/O requests.&lt;/td&gt;
&lt;td valign="top" width="268"&gt;
Included in DB instance pricing.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
&lt;em&gt;* Windows Azure is currently in Community Technology Preview (CTP), and the services
are free to evaluate through January 2010.&lt;/em&gt;
&lt;/p&gt;
&lt;img width="0" height="0" src="http://www.muranosoft.com/Outsourcingblog/aggbug.ashx?id=656f9ee2-43df-4c7e-a400-e03e546a1bbc" /&gt;</description>
      <comments>http://www.muranosoft.com/Outsourcingblog/CommentView,guid,656f9ee2-43df-4c7e-a400-e03e546a1bbc.aspx</comments>
      <category>ASP.NET</category>
      <category>Azure</category>
      <category>Cloud Computing</category>
      <category>Software Development</category>
    </item>
  </channel>
</rss>