<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:blogger='http://schemas.google.com/blogger/2008' xmlns:georss='http://www.georss.org/georss' xmlns:gd="http://schemas.google.com/g/2005" xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-1142903694429052539</id><updated>2024-09-04T18:11:58.500-07:00</updated><category term="Windows Azure"/><category term="Cloud"/><category term="Windows Azure Storage"/><category term="AppFabric Service Bus"/><category term="Blobs"/><category term="Enterprise Service Bus"/><category term="масштабируемость"/><category term="производительность"/><category term="Access Control Service"/><category term="AppFabric"/><category term="Drives"/><category term="SQL Azure"/><category term="SQL Azure Data Sync"/><category term="Service Management API"/><category term="VHD"/><category term="Windows AZure Connect"/><category term="распределенный кеш"/><category term="Amazon Web Services"/><category term="Azure Queues"/><category term="Azure Tables"/><category term="Azure VM"/><category term="Datacenter"/><category term="Deployment Server"/><category term="ESB"/><category term="Fault Domain"/><category term="Fault Handling"/><category term="Git"/><category term="Hyper-V"/><category term="IaaS"/><category term="Memcached"/><category term="PaaS"/><category term="Project Daytona"/><category term="Project Houston"/><category term="SOA"/><category term="SaaS"/><category term="Security"/><category term="Upgrade Domain"/><category term="VM-Role"/><category term="Windows Azure CDN"/><category term="Windows Azure Diagnostics"/><category term="Отказоустойчивость"/><title type='text'>Blog about Microsoft Azure Platform</title><subtitle type='html'>Here I am blogging a lot about Microsoft Azure and little bit about other cloud computing platforms.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default?start-index=26&amp;max-results=25'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>53</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-2365422467444675639</id><published>2017-01-13T08:59:00.001-08:00</published><updated>2017-01-13T08:59:40.187-08:00</updated><title type='text'>Azure Container Service</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! Второй доклад был посвящен не менее интересной теме - Azure Container Service. В рамках доклада мы познакомились с принципами контейнеризации приложений, используя Docker, а также развернули кластер ACS на базе оркестратора DC/OS от Mesosphere. Чуть ниже представлены материалы доклада&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Презентация:&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/J9i1lDl0V56ooY&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt;&lt;/center&gt;
&lt;br /&gt;
Видеозапись:&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/3wimxqvp2e0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/2365422467444675639/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/2365422467444675639' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/2365422467444675639'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/2365422467444675639'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2017/01/azure-container-service.html' title='Azure Container Service'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/3wimxqvp2e0/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-6139897303998623161</id><published>2017-01-11T07:17:00.000-08:00</published><updated>2017-01-11T07:17:38.691-08:00</updated><title type='text'>Introduction to Microsoft Azure Automation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет!&lt;br /&gt;
Совсем недавно в рамках проектного тренинга мне довелось провести пару докладов на достаточно интересные темы , одной из которых и будет посвящен сегодняшний пост. Это введение в автоматизацию Azure. В рамках доклада мы обсудили предназначение автоматизации, развертывание Automation аккаунта в облаке и создание нескольких сценариев автоматизирующих процессы деплоймента приложений в Azure App Services. Презентация и видеозапись доступны ниже.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/7IE2KQROTeUAgc&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/CkAMP0-EHnA&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/6139897303998623161/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/6139897303998623161' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6139897303998623161'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6139897303998623161'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2017/01/introduction-to-microsoft-azure.html' title='Introduction to Microsoft Azure Automation'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/CkAMP0-EHnA/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-963804629729984447</id><published>2016-02-29T14:19:00.003-08:00</published><updated>2016-02-29T14:19:28.650-08:00</updated><title type='text'>Microsoft Azure. Диагностика и мониторинг</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! Наконец-то дошли руки выложить материалы третьего доклада, посвященного на этот раз диагностике и мониторингу приложений в Azure. В течение лекции мы познакомились с тем как получать доступ к логами приложения, управлять удаленным дебагингом, стримить логи, а также увидели как использовать продукты ElasticSearch для аггрегации логов. Чуть ниже вы увидите ссылк у на презентацию и видеозапись доклада.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/NHEi87SFkYjQ9E&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt;
&lt;/center&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/9Ud_G1h54u0&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/963804629729984447/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/963804629729984447' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/963804629729984447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/963804629729984447'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2016/02/microsoft-azure.html' title='Microsoft Azure. Диагностика и мониторинг'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/9Ud_G1h54u0/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-4042538629603004605</id><published>2016-01-18T06:11:00.000-08:00</published><updated>2016-01-18T06:11:58.504-08:00</updated><title type='text'>Azure Powershell. Azure Automation</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Здравствуйте, друзья! Наконец-то состоялась вторая лекция в EPAM, посвященная Microsoft Azure. На этот раз мы больше сконцентрировались на развертывании инфраструктуры нашего приложения, используя связку PowerShell + Azure Resource Manager. Кроме того, познакомились с основами Azure Automation. Все , кого заинтересовала данная тематика смогут найти подкатом видеозапись презентации, а также ссылку на слайды.&lt;br /&gt;
&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Презентация:&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/Lav4Ho4FzicPSR&quot; style=&quot;border-width: 1px; border: 1px solid #ccc; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt; 
&lt;/center&gt;
&lt;br /&gt;
Видеозапись доклада:
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/fx8tldERSxY&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/4042538629603004605/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/4042538629603004605' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4042538629603004605'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4042538629603004605'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2016/01/azure-powershell-azure-automation.html' title='Azure Powershell. Azure Automation'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/fx8tldERSxY/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-6597162818361097560</id><published>2015-12-22T02:50:00.001-08:00</published><updated>2015-12-22T02:50:32.179-08:00</updated><title type='text'>Azure App Service Architecture. Web Apps.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! 16 декабря в компании EPAM Systems состоялась первая лекция из 3-х, посвященная новинкам платформы Windows Azure. В рамках первого доклада мы знакомились с Azure App Services и Azure Web Apps. Кроме того были рассмотрены такие вопросы как:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;Развертывание вебсайтов напрямую из Visual Studio а также используя VSO&lt;/li&gt;
&lt;li&gt;Использование стейджинг слотов&lt;/li&gt;
&lt;li&gt;App Service Environments&lt;/li&gt;
&lt;/ul&gt;
и многое другое. Видеозапись презентации, а также сама презентация представлены ниже&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/1zXmL4F9zAs&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;/center&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;485&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;//www.slideshare.net/slideshow/embed_code/key/9Y9uLqEsVwk68T&quot; style=&quot;border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;&quot; width=&quot;595&quot;&gt; &lt;/iframe&gt; &lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/6597162818361097560/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/6597162818361097560' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6597162818361097560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6597162818361097560'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2015/12/azure-app-service-architecture-web-apps.html' title='Azure App Service Architecture. Web Apps.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/1zXmL4F9zAs/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-1171786024685949279</id><published>2015-05-17T14:06:00.001-07:00</published><updated>2015-05-17T14:10:26.808-07:00</updated><title type='text'>Automating Azure VMs with PowerShell</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет!&lt;br /&gt;
25 апреля состоялся Global Azure Bootcamp. В Харькове, при содействии компании EPAM Systems, это событие происходило впервые. Я, как докладчик, принимал в нем участие. Темой моего доклада была автоматизация создания виртуальных машин при помощи Powershell. И вот сегодня наконец-то дошли руки выложить в публичный доступ материалы доклада. Чуть ниже добавлена ссылка на презентацию а также видеозапись доклада.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Презентация:&lt;br /&gt;
&lt;iframe src=&quot;//www.slideshare.net/slideshow/embed_code/key/IAkghqyRP6aBNT&quot; width=&quot;595&quot; height=&quot;485&quot; frameborder=&quot;0&quot; marginwidth=&quot;0&quot; marginheight=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;&quot; allowfullscreen&gt; &lt;/iframe&gt; &lt;br /&gt;
Видеозапись доклада:&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;https://www.youtube.com/embed/nV7xTv1bSBo&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;&lt;br /&gt;
Ссылка на исходники скриптов: &lt;a href=&quot;https://dl.dropboxusercontent.com/u/18522369/Virtual%20Machines%20Automated%20Deployment.zip&quot; target=&quot;_blank&quot;&gt;PowerShell Scripts&lt;/a&gt; &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/1171786024685949279/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/1171786024685949279' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1171786024685949279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1171786024685949279'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2015/05/automating-azure-vms-with-powershell.html' title='Automating Azure VMs with PowerShell'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/nV7xTv1bSBo/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-3419447497225704275</id><published>2013-06-13T05:35:00.000-07:00</published><updated>2013-06-13T05:35:18.598-07:00</updated><title type='text'>Новинки Service Bus 2.0. Shared Access Signatures.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;!--[if gte mso 9]&gt;&lt;xml&gt;
 &lt;o:OfficeDocumentSettings&gt;
  &lt;o:RelyOnVML/&gt;
  &lt;o:AllowPNG/&gt;
 &lt;/o:OfficeDocumentSettings&gt;
&lt;/xml&gt;&lt;![endif]--&gt;&lt;span id=&quot;goog_1367965532&quot;&gt;&lt;/span&gt;&lt;span id=&quot;goog_1367965533&quot;&gt;&lt;/span&gt;Совсем недавно в мире Windows Azure произошло знаменательное событие – вышел в свет новый Windows Azure SDK 2.0, который привнес большое количество изменений в процесс разработки под платформу. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Кратко напомню о том, что же нового мы увидели в версии 2.0:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;Веб сайты&lt;/b&gt;. Были значительно расширены инструменты разработки для Visual Studio, изменения в основном коснулись процессов разворачивания, управления и мониторинга облачных приложений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Облачные сервисы&lt;/b&gt;. Добавлена поддержка высокопроизводительных машин A6 и A7. Ускорен процесс публикации сервисов.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Хранилище&lt;/b&gt;. Добавлена возможность работы с Azure Tables прямо из Visual Studio Server Explorer.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Service Bus&lt;/b&gt;. Добавлен целый ряд функциональных возможностей среди которых message pump, shared access signatures, поддержка получения сообщений из очереди без их блокировки и т.д.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Командлеты Powershell&lt;/b&gt;. Расширен набор команд для работы с облачными сервисами и сайтами.&lt;/li&gt;
&lt;/ul&gt;
Для более детального ознакомления со списком обновлений рекомендую проследовать на блогпост Скота Гатри, посвященный новой версии SDK 2.0:&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2013/04/30/announcing-the-release-of-windows-azure-sdk-2-0-for-net.aspx&quot; target=&quot;_blank&quot;&gt; http://weblogs.asp.net/scottgu/archive/2013/04/30/announcing-the-release-of-windows-azure-sdk-2-0-for-net.aspx&lt;/a&gt;&lt;br /&gt;
Сегодняшняя публикация будет посвящена &lt;b&gt;Shared Access Signatures &lt;/b&gt;для &lt;b&gt;Service Bus 2.0&lt;/b&gt;. Как я уже отметил возможность использовать SAS для Service Bus появилась лишь с выходом версии 2.0.&amp;nbsp; До этого SAS были доступны только для хранилища. Основное назначение в принципе не изменилось. Shared Access Signatures позволяют предоставлять доступ к Service Bus при помощи предварительного сконфигурированного криптографического ключа. Под доступом подразумевается возможность беспрепятственно работать с такими компонентами Service Bus как очереди, темы и нотификационные хабы (в будущем будет добавлена поддержка relay). Сам по себе криптографический ключ входит в состав правила. Каждое правило определяет уровни доступа, предоставляемые владельцу ключа. При создании правила обязательными параметрами являются первичный ключ, название правила и уровни доступа. Существует ограничение на количество применяемых правил для одной сущности – сейчас это 12. Для того, чтобы получить доступ к защищенному компоненту Service Bus при помощи SAS, клиент обязан предоставить security-токен. Такой токен состоит из URL ресурса, к которому клиент пытается получить доступ, цифровой подписи, вычисляемой при помощи HMAC-SHA256, названия самого правила и времени жизни токена. Токен сохраняется в заголовке Authorization при создании HTTP запроса к Service Bus. В общем виде его структура следующая:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:text&quot;&gt;SharedAccessSignature sig=&amp;lt;signature-string&amp;gt;&amp;amp;se=&amp;lt;expiry&amp;gt;&amp;amp;skn=&amp;lt;keyName&amp;gt;&amp;amp;sr=&amp;lt;URL-encoded-resourceURI&amp;gt;
&lt;/pre&gt;
&lt;br /&gt;
При получении токена инфраструктура Service Bus запускает процесс его валидации и определения разрешена ли указанным правилом запрашиваемая компонентом операция. В случае положительного результата проверки требуемая операция успешно выполняется. &lt;br /&gt;
Давайте теперь на примере посмотрим как использовать Shares Access Signatures для аутентификации и получения доступа к Service Bus. Специально для публикации я подготовил простейший солюшен, состоящий из 2-х проектов. Первый проект называется &lt;b&gt;SASRulesManager&lt;/b&gt; – это обычное веб-приложение позволяющее создавать правила. Второй проект называется &lt;b&gt;QueueClient &lt;/b&gt;– это консольное приложение, при помощи которого мы будем проверять работоспособность созданных правил. Чуть ниже на скриншоте можно увидеть, как выглядит проект в Visual Studio&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://2.bp.blogspot.com/-1NlH6buLBCY/UbjmWZ52N8I/AAAAAAAAAlo/740Jdbmj5WI/s1600/Service+Bus+Shared+Access+Signature.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://2.bp.blogspot.com/-1NlH6buLBCY/UbjmWZ52N8I/AAAAAAAAAlo/740Jdbmj5WI/s1600/Service+Bus+Shared+Access+Signature.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
Как я уже говорил, правило можно применять практически к каждой сущности Service Bus, но в нашем случае мы будем использовать очередь под названием &lt;b&gt;sasdemo&lt;/b&gt;. Предварительно ее можно создать, используя расширенный в последней версии VS Server Explorer. Давайте вкратце рассмотрим содержимое основных классов проекта. Итак, начнем прежде всего с &lt;b&gt;ServiceBusManager.cs&lt;/b&gt; – здесь собрана вся логика по взаимодействий с Service Bus в общем и с очередью в частности.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;namespace SASRulesManager.Models
{
    public class ServiceBusManager
    {
        private const string DEMO_QUEUE_NAME = &quot;sasdemo&quot;;
        private NamespaceManager currentNamespaceManager;
        private QueueDescription demoQueue;

        public ServiceBusManager()
        {
            Uri serviceBusUri = ServiceBusEnvironment.CreateServiceUri(&quot;https&quot;, WebConfigurationManager.AppSettings[&quot;ServiceBusNamespace&quot;], String.Empty);
            TokenProvider tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
                WebConfigurationManager.AppSettings[&quot;ManagementKeyName&quot;], 
                WebConfigurationManager.AppSettings[&quot;ManagementKey&quot;]);
            currentNamespaceManager = new NamespaceManager(serviceBusUri, tokenProvider);
            demoQueue = currentNamespaceManager.GetQueue(DEMO_QUEUE_NAME);
        }

        public IEnumerable&amp;lt;SB.AuthorizationRule&amp;gt; GetQueueRules()
        {
            return demoQueue.Authorization.ToList();
        }

        public IEnumerable&amp;lt;SB.AuthorizationRule&amp;gt; AddRule(string keyName, IEnumerable&amp;lt;AccessRights&amp;gt; accessRights)
        {
            var currentRules = GetQueueRules();
            if (currentRules.Count(rule =&amp;gt; rule.KeyName.Equals(keyName)) &amp;gt; 0)
            {
                return currentRules;
            }
            var authorizationRule = new SharedAccessAuthorizationRule(keyName, SharedAccessAuthorizationRule.GenerateRandomKey(), accessRights);
            demoQueue.Authorization.Add(authorizationRule);
            currentNamespaceManager.UpdateQueue(demoQueue);
            return GetQueueRules();
        }
    }
}

&lt;/pre&gt;
Код относительно прост. Как видим у нас есть 2 основных метода и конструктор класса, в котором происходит инициализация очереди. Первый метод &lt;b&gt;GetQueueList &lt;/b&gt;возвращает нам список уже существующих правил для выбранной очереди. Второй метод позволяет добавить новое правило к очереди (всего таких правил может быть до 12 штук для одной сущности). Следует отметить, что для получения данных очереди и добавления правил все запросы должны быть аутентифицированы. Достигается это при помощи все тех же &lt;b&gt;Shared Access Signatures&lt;/b&gt;, как видим название правила и криптографический ключ берутся из Web.config при создании экземпляра класса &lt;b&gt;TokenProvider&lt;/b&gt;. По умолчанию при создании очереди создается правило с полным набором прав, посмотреть которое можно в диалоге &lt;b&gt;ConnectionInformation &lt;/b&gt;на портале разработчика.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-kOdiZMsjB7Q/UbjrBRsRXDI/AAAAAAAAAmg/xBdR53PtY5Q/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;494&quot; src=&quot;http://4.bp.blogspot.com/-kOdiZMsjB7Q/UbjrBRsRXDI/AAAAAAAAAmg/xBdR53PtY5Q/s640/Untitled.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Следующий важный элемент – это MVC контроллер &lt;b&gt;SASController&lt;/b&gt;. Исходный код контроллера представлен ниже:&lt;/div&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt; namespace SASRulesManager.Controllers
{
    public class SASController : Controller
    {
        //
        // GET: /SAS/

        public ActionResult Index()
        {
            var serviceBusManager = new ServiceBusManager();
            return View(serviceBusManager.GetQueueRules());
        }

        [HttpPost]
        public ActionResult Index(string ruleKeyName, string ruleAccessRights)
        {
            var serviceBusManager = new ServiceBusManager();
            var accessRights = ruleAccessRights.Split(new string[] { &quot;|&quot; }, StringSplitOptions.RemoveEmptyEntries).
                ToList().
                Select(entry =&amp;lt; (AccessRights)Enum.Parse(typeof(AccessRights), entry));
            serviceBusManager.AddRule(ruleKeyName, accessRights);
            return View(&quot;Index&quot;, serviceBusManager.GetQueueRules());
        }
    }
}

&lt;/pre&gt;
Здесь мы видим 2 экшена, первый для отображения странички с созданными правилам и контрола для создания новых. Вот как она выглядит:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-WSgHgHTKkao/Ubjoz1uoaII/AAAAAAAAAmE/edcrBI2zfd8/s1600/Shared+Access+Rules+Manager.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;199&quot; src=&quot;http://4.bp.blogspot.com/-WSgHgHTKkao/Ubjoz1uoaII/AAAAAAAAAmE/edcrBI2zfd8/s640/Shared+Access+Rules+Manager.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
На скриншоте можно заметить 3 правила, каждое из которых содержит различный набор прав. Всего существует 3 вида прав:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;b&gt;Listen&lt;/b&gt;. На чтение очереди&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Send&lt;/b&gt;. На отправку сообщений в очередь&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Manage&lt;/b&gt;. На управление очередью.&lt;/li&gt;
&lt;/ul&gt;
Естественно их можно комбинировать в любой последовательности. &lt;br /&gt;
Второй экшен контроллера предназначен для приема POST запросов от страницы, разбора параметров и добавления созданного правила к тестовой очереди. &lt;br /&gt;
Давайте теперь перейдем к проекту &lt;b&gt;QueueClient &lt;/b&gt;– он очень простой. Основной код сосредоточен в Program.cs. &lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;namespace QueueClient
{
    class Program
    {
        static void Main(string[] args)
        {
            Uri serviceBusUri = ServiceBusEnvironment.CreateServiceUri(&quot;sb&quot;, &quot;feschenko&quot;, String.Empty);
            TokenProvider tokenProvider = TokenProvider.CreateSharedAccessSignatureTokenProvider(
                &quot;SimpleSendRule&quot;, &quot;J9SCe/giY2aO6vaY1mcB2oCtXeRANHiUmhlzLAibDtg=&quot;);
            MessagingFactory factory = MessagingFactory.Create(serviceBusUri, tokenProvider);
            var queueClient = factory.CreateQueueClient(&quot;sasdemo&quot;);
            var message = new BrokeredMessage(&quot;Test Rule Message&quot;);
            message.MessageId = Guid.NewGuid().ToString();
            queueClient.Send(message);
        }
    }
}
&lt;/pre&gt;
В коде мы создаем экземпляр очереди и пытаемся отправить тестовое сообщение. В случае если мы используем правило, позволяющее нам это сделать (то есть содержащее право Send) – код выполняется успешно. Иначе, обязательно вылетит исключение, извещающее нас о том, что мы не авторизованы для подобных действий.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/-lVaQqc1LIBg/Ubjpy-osBDI/AAAAAAAAAmU/pURjsEAaeAU/s1600/Exception.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;http://1.bp.blogspot.com/-lVaQqc1LIBg/Ubjpy-osBDI/AAAAAAAAAmU/pURjsEAaeAU/s640/Exception.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
На этом всё, как видим &lt;b&gt;Shared Access Signatures &lt;/b&gt;-&amp;nbsp; это мощное средство, которые можно использовать для получения доступа к элементам Service Bus в удобном и быстром виде с поддержкой различных уровней доступа.&lt;br /&gt;
Ссылка на скачивание разработанного проекта:&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/18522369/Blog/ServiceBusSAS.zip&quot; target=&quot;_blank&quot;&gt;https://dl.dropboxusercontent.com/u/18522369/Blog/ServiceBusSAS.zip&lt;/a&gt; &lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/3419447497225704275/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/3419447497225704275' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3419447497225704275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3419447497225704275'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2013/06/service-bus-20-shared-access-signatures.html' title='Новинки Service Bus 2.0. Shared Access Signatures.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://2.bp.blogspot.com/-1NlH6buLBCY/UbjmWZ52N8I/AAAAAAAAAlo/740Jdbmj5WI/s72-c/Service+Bus+Shared+Access+Signature.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-7704202074621361692</id><published>2013-05-02T11:59:00.003-07:00</published><updated>2013-05-03T13:03:24.428-07:00</updated><title type='text'>Windows Azure Notification Hubs - новый способ отправки push-уведомлений</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! Тема моей сегодняшней публикации будет касаться нового механизма отправки push-уведомлений мобильным клиентам - Windows Azure Notification Hubs. Эта технология была представлена в январе 2013 года. Несмотря на то, что&amp;nbsp; технология находится в режиме превью - она уже успела привлечь внимание многих разработчиков. Если вкратце, то Notification Hubs - это построенная на базе Windows Azure Service Bus система, позволяющая значительно упростить и расширить существующие механизмы отправки push-уведомлений мобильным клиентам (для тех из вас, кто незнаком с понятием пуш уведомлений - вот здесь можно посмотреть краткое описание механизма: &lt;a href=&quot;https://www.youtube.com/watch?v=ATYhOlK11QM&quot; target=&quot;_blank&quot;&gt; Push Notifications: What are they and how do I send them&lt;/a&gt;). При помощи Windows Azure Notification Hubs мы можем с легкостью организовать систему уведомлений для наших мобильных устройств, при этом поддерживаются 2 платформы:&lt;br /&gt;
&lt;ul style=&quot;text-align: left;&quot;&gt;
&lt;li class=&quot;unordered&quot;&gt;      The Windows Push Notification Services (WNS) for Windows 8.&lt;/li&gt;
&lt;li class=&quot;unordered&quot;&gt;      The Apple Push Notification service (APNs)&lt;/li&gt;
&lt;/ul&gt;
В будущем планируется поддержка Google Cloud Messaging for Android. Сегодня мы на примере увидим как отправить push-уведомление Windows 8 устройству, используя Windows Azure Notification Hubs. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Итак, наша цель отправить push-уведомление Windows Store приложению, используя при этом консольную программу и Windows Azure Notification Hubs. Само решение выглядит довольно просто (ссылка на скачивание солюшена находится в конце поста):&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://3.bp.blogspot.com/-Ky932hEWZC0/UX7cOSjM6OI/AAAAAAAAAio/LP6sYAH1eo8/s1600/AzurePushNotifications.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;http://3.bp.blogspot.com/-Ky932hEWZC0/UX7cOSjM6OI/AAAAAAAAAio/LP6sYAH1eo8/s1600/AzurePushNotifications.png&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Солюшен состоит из 2-х проектов. Первый - &lt;b&gt;EventSource&lt;/b&gt;, представляет собой консольное приложение, основная задача которого - это генерация сообщения и коммуникация с хабом с целью отправки push-уведомления. Второй проект - собственно само Windows Store приложение, которое будет получать приходящие уведомления. С него мы и начнем. Это пустое HTML5+Javascript приложение, основная логика которого находится в файле &lt;b&gt;default.js&lt;/b&gt;. Другой важный файл, который можно также увидеть в проекте, это - &lt;b&gt;NotificationHub,js&lt;/b&gt;, он содержит всю логику по взаимодействию с нотификационным хабом. Скачать данный файл можно с MSDN.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Прежде чем мы разберем исходный код приложения необходимо выполнить настройку приложения. Во-первых, для того чтобы оно стало способным принимать пуш уведомления, необходимо включить Toast Notifications в манифесте приложения. На скриншоте внизу можно увидеть как это сделать:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-AIWZwBOpoX4/UX7f97ZItXI/AAAAAAAAAi4/5jXT46VOPgU/s1600/EnablingToastsInWindowsStoreApp.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;295&quot; src=&quot;http://4.bp.blogspot.com/-AIWZwBOpoX4/UX7f97ZItXI/AAAAAAAAAi4/5jXT46VOPgU/s400/EnablingToastsInWindowsStoreApp.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Во-вторых, нам необходимо ассоциировать приложение с Windows Store аккаунтом (если у вас нет аккаунта по следующей ссылке можно прочитать как его создать: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/apps/hh868184.aspx&quot; target=&quot;_blank&quot;&gt;Registering for a Windows Store developer account&lt;/a&gt;). Связывание приложения можно осуществить при помощи пункта меню &lt;b&gt;Store &amp;gt;Associate App With The Store&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-i09c7xyctI4/UX7hkQ3yJ9I/AAAAAAAAAjM/wMiY3cdbVMU/s1600/AssociateAppWithTheStore.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;283&quot; src=&quot;http://4.bp.blogspot.com/-i09c7xyctI4/UX7hkQ3yJ9I/AAAAAAAAAjM/wMiY3cdbVMU/s400/AssociateAppWithTheStore.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
После чего откроется простой диалог, выполнив все шаги которого,&amp;nbsp; мы перейдем на сайт Windows Store разработчика, где нас попросят ввести имя приложения и задать дополнительные характеристики. Из этих характеристик нас интересуют &lt;b&gt;Advanced Features&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-hcbCACJrqKg/UX7irfdimwI/AAAAAAAAAjc/h7ScxfFZHCA/s1600/WindowsStoreAdvancedFeatures.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;236&quot; src=&quot;http://4.bp.blogspot.com/-hcbCACJrqKg/UX7irfdimwI/AAAAAAAAAjc/h7ScxfFZHCA/s400/WindowsStoreAdvancedFeatures.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
При выборе этого пункта откроется новая страница, на которой следует кликнуть на ссылке &lt;b&gt;Push Notifications And Live Services Info&lt;/b&gt;, после чего нас перебросят на следующую страницу, позволяющую увидеть ключи доступа (они понадобятся нам при насстройке самого хаба). Вот как выглядит конечная страница:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://3.bp.blogspot.com/-MsY0JbpxUOA/UX7kN75x9uI/AAAAAAAAAjo/Z4Aqk2O1zyA/s1600/PushNotificationsAndLiveConnect.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;284&quot; src=&quot;http://3.bp.blogspot.com/-MsY0JbpxUOA/UX7kN75x9uI/AAAAAAAAAjo/Z4Aqk2O1zyA/s640/PushNotificationsAndLiveConnect.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Следующим шагом в настройке проекта будет создание хаба. Делается это на портале Windows Azure выбором пункта &lt;b&gt;New &amp;gt; App Services &amp;gt; Service Bus &amp;gt; Notification Hub&lt;/b&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/-ccgycWS41F0/UX7mat1ZYnI/AAAAAAAAAj8/KclJfpAQ0Tg/s1600/NotificationHub.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;392&quot; src=&quot;http://1.bp.blogspot.com/-ccgycWS41F0/UX7mat1ZYnI/AAAAAAAAAj8/KclJfpAQ0Tg/s640/NotificationHub.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Нас попросят задать имя хаба, географический регион и &lt;b&gt;Service Bus неймспейс&lt;/b&gt;, в рамках которого будет функционировать хаб. После этого новый хаб будет создан и мы сможем задать ключи безопасности для отправки уведомлений Windows 8 клиентам. Делается это в разделе &lt;b&gt;Configure&lt;/b&gt;.&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-pIjLB4yEjqI/UX7oAv3IGyI/AAAAAAAAAkY/NXZk3YtH3zc/s1600/WindowsNotificationSettings.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;308&quot; src=&quot;http://4.bp.blogspot.com/-pIjLB4yEjqI/UX7oAv3IGyI/AAAAAAAAAkY/NXZk3YtH3zc/s640/WindowsNotificationSettings.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://2.bp.blogspot.com/-CPgV9262lA0/UX7nz7CTeGI/AAAAAAAAAkQ/0BJCE8fCoMg/s1600/PushNotificationsAndLiveConnect.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;br /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
&lt;b&gt;PACKAGE SID &lt;/b&gt;и &lt;b&gt;CLIENT SECRET &lt;/b&gt;мы получили в момент ассоциирования Windows Store приложения с аккаунтом Windows 8 разработчика, поэтому все, что нам необходимо это перенести значения в настройки хаба.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
На этом этап настройки инфраструктуры можно считать завершенным. Давайте перейдем непосредственно к коду. Исходный код Windows Store приложения представлен в листинге ниже:&lt;/div&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;(function () {
    &quot;use strict&quot;;

    WinJS.Binding.optimizeBindingReferences = true;

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;
    var messaging = Microsoft.WindowsAzure.Messaging;

    var hub = new messaging.NotificationHub(&quot;https://[YOUR_SB_NAMESPACE].servicebus.windows.net/&quot;, &quot;[NOTIFICATION_HUB_KEY]&quot;, &quot;pushdemo&quot;);

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {
            if (args.detail.previousExecutionState !== activation.ApplicationExecutionState.terminated) {
                var toastTemplate = &#39;&lt;toast&gt;&lt;visual&gt;&lt;binding template=&quot;ToastText01&quot;&gt;&lt;text id=&quot;1&quot;&gt;$(message)&lt;/text&gt;&lt;/binding&gt;&lt;/visual&gt;&lt;/toast&gt;&#39;;
                var pushNotifications = Windows.Networking.PushNotifications;
                var channelOperation = pushNotifications.PushNotificationChannelManager.createPushNotificationChannelForApplicationAsync();

                channelOperation.then(function (newChannel) {
                    return newChannel.uri;
                }).then(function (channelUri) {
                    return hub.registerTemplateForApplicationAsync(channelUri, &#39;toast1&#39;, [], { &#39;X-WNS-Type&#39;: &#39;wns/toast&#39; }, toastTemplate);
                }).done();
            }
            args.setPromise(WinJS.UI.processAll());
        }
    };

    app.oncheckpoint = function (args) {
    };

    app.start();
})();

&lt;/pre&gt;
Начнем с наиболее интересных участках кода. Первый важный фрагмент - это создание экземпляра хаба.&amp;nbsp;
&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;var hub = new messaging.NotificationHub(&quot;https://[YOUR_SB_NAMESPACE].servicebus.windows.net/&quot;, &quot;[NOTIFICATION_HUB_KEY]&quot;, &quot;pushdemo&quot;);&lt;/pre&gt;
Для того, чтобы создать хаб нам необходимо задать имя &lt;b&gt;Service Bus неймспейса&lt;/b&gt;, в рамках которого функционирует хаб, и ключ безопасности (третьим параметром идет название хаба, задаваемое на портале). Ключ безопасности берется из настроек хаба, на картинке ниже можно увидеть, что для нашего приложения достаточно ключа только с правами прослушивания канала.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://4.bp.blogspot.com/-6Y9ZuEVrA2g/UYLBZg_34AI/AAAAAAAAAks/8XQOYtRNcVk/s1600/ViewSaSKey.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;502&quot; src=&quot;http://4.bp.blogspot.com/-6Y9ZuEVrA2g/UYLBZg_34AI/AAAAAAAAAks/8XQOYtRNcVk/s640/ViewSaSKey.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Далее, в обработчике события запуска приложения происходит его регистрации на хабе путем вызова метода &lt;b&gt;hub.registerTemplateForApplicationAsync&lt;/b&gt;. Регистрация принимает адрес канала, по которому будет происходит коммуникация, название используемого шаблона уведомлений (весь список поддерживаемых темплейтов &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windows/apps/hh761494.aspx&quot; target=&quot;_blank&quot;&gt;здесь&lt;/a&gt;) и само содержимое уведомления. В нашем случае мы используем простой текстовый темплейт, который содержит подстановочный элемент &lt;b&gt;$(message)&lt;/b&gt;. Данный элемент позволяет динамически подменять содержимое уведомлений.&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Давайте теперь посмотрим на содержимое файла &lt;b&gt;Program.cs&lt;/b&gt; проекта &lt;b&gt;EventSource&lt;/b&gt;. &lt;/div&gt;
&lt;pre class=&quot;brush: csharp&quot;&gt;using Microsoft.ServiceBus;
using Microsoft.ServiceBus.Messaging;
using Microsoft.ServiceBus.Notifications;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace EventSource
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine(&quot;Please, enter the message: &quot;);
            var message = Console.ReadLine();
            var cn = ServiceBusConnectionStringBuilder.CreateUsingSharedAccessSecretWithFullAccess(new Uri(&quot;sb://[YOUR_SB_NAMESPACE].servicebus.windows.net&quot;), &quot;[NOTIFICATION_HUB_KEY]&quot;);
            var hubClient = NotificationHubClient.CreateClientFromConnectionString(cn, &quot;pushdemo&quot;);
            hubClient.SendTemplateNotification(new Dictionary&amp;lt;string, string&amp;gt; { { &quot;message&quot;, message } });
        }
    }
}&lt;/pre&gt;
После своего запуска, консольное приложение просит ввести текст отправляемого уведомления. Далее происходит создание клиента к хабу, для чего необходимо опять же задать название Service Bus неймспейса и ключ безопасности (теперь нам нужен ключ с полными правами доступа к хабу). Как только клиент будет создан, можно отправлять уведомление. Делается это при помощи метода &lt;b&gt;hubClient.SendTemplateNotification&lt;/b&gt;. Метод принимает набор ключей и их значений. При отправке уведомления инфраструктура хаба самостоятельно подменит все упоминания названий ключей на их значения. Для&amp;nbsp; того, чтобы приложение успешно скомпилировалось необходимо предвартельно установить Nuget-пакет &lt;a href=&quot;http://nuget.org/packages/ServiceBus.Preview&quot; target=&quot;_blank&quot;&gt;ServiceBus.Preview.dll&lt;/a&gt;&lt;br /&gt;
В итоге, после запуска приложения и ввода сообщения мы должны получить долгожданное&amp;nbsp; уведомление.&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;http://1.bp.blogspot.com/-gzLZiZaeBjo/UYLGe_bwtsI/AAAAAAAAAk8/ep4c9Yq-XXQ/s1600/PushNotification.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;175&quot; src=&quot;http://1.bp.blogspot.com/-gzLZiZaeBjo/UYLGe_bwtsI/AAAAAAAAAk8/ep4c9Yq-XXQ/s400/PushNotification.png&quot; width=&quot;400&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
На этом всё! Код разработанного проекта можно найти по&amp;nbsp;&lt;a href=&quot;https://dl.dropboxusercontent.com/u/18522369/Blog/AzurePushNotifications.zip&quot; target=&quot;_blank&quot;&gt;ссылке&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
Для более детального знакомства с Windows Azure Notification Hubs рекомендую ознакомиться с дополнительным материалами по следующим ссылкам:&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;http://channel9.msdn.com/Blogs/Subscribe/Service-Bus-Notification-Hubs-Code-Walkthrough-Windows-8-Edition&quot; target=&quot;_blank&quot;&gt;http://channel9.msdn.com/Blogs/Subscribe/Service-Bus-Notification-Hubs-Code-Walkthrough-Windows-8-Edition&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/jj927170.aspx&quot; target=&quot;_blank&quot;&gt;http://msdn.microsoft.com/en-us/library/windowsazure/jj927170.aspx&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;http://channel9.msdn.com/Shows/Cloud+Cover/Episode-100-Introduction-to-the-Windows-Azure-Service-Bus-Notification-Hubs&quot; target=&quot;_blank&quot;&gt;http://channel9.msdn.com/Shows/Cloud+Cover/Episode-100-Introduction-to-the-Windows-Azure-Service-Bus-Notification-Hubs&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;text-align: left;&quot;&gt;
&lt;a href=&quot;http://channel9.msdn.com/Blogs/Subscribe/Service-Bus-Notification-Hubs-with-ElioDamaggio&quot; target=&quot;_blank&quot;&gt;http://channel9.msdn.com/Blogs/Subscribe/Service-Bus-Notification-Hubs-with-ElioDamaggio&lt;/a&gt;&amp;nbsp;&lt;/div&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/7704202074621361692/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/7704202074621361692' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7704202074621361692'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7704202074621361692'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2013/05/windows-azure-notification-hubs-push.html' title='Windows Azure Notification Hubs - новый способ отправки push-уведомлений'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/-Ky932hEWZC0/UX7cOSjM6OI/AAAAAAAAAio/LP6sYAH1eo8/s72-c/AzurePushNotifications.png" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-6922610189274182674</id><published>2013-02-06T06:29:00.001-08:00</published><updated>2013-02-06T06:29:38.873-08:00</updated><title type='text'>Введение в Windows Azure IaaS</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! 23 января я читал доклад на тему &quot;Введение в Windows Azure IaaS&quot; в рамках мероприятия IT-Share, которое проводится еженедельно в компании Epam Systems. Доклад был посвящен технологиям Windows Azure, предлагаемых в рамках услуги инфраструктура как сервис. Мы подробно рассмотрели вопросы создания и разворачивания виртуальных машин в облаке Windows Azure, а также поверхностно познакомились с предназначением и особенностями виртуальных сетей Windows Azure (Azure Virtual Private Networks).&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Сегодня я хотел бы поделиться материалами доклада. Чуть ниже можно найти презентацию, а также видеозапись моего доклада.&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;356&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; mozallowfullscreen=&quot;&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/16381384&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px;&quot; webkitallowfullscreen=&quot;&quot; width=&quot;427&quot;&gt; &lt;/iframe&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/8WBWypG8s80&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;315&quot; src=&quot;http://www.youtube.com/embed/JvrP4zRdHuk&quot; width=&quot;560&quot;&gt;&lt;/iframe&gt;
&lt;/center&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/6922610189274182674/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/6922610189274182674' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6922610189274182674'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6922610189274182674'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2013/02/windows-azure-iaas.html' title='Введение в Windows Azure IaaS'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://img.youtube.com/vi/8WBWypG8s80/default.jpg" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-1147683293803829128</id><published>2012-10-22T07:25:00.003-07:00</published><updated>2013-05-02T12:03:23.332-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Azure VM"/><category scheme="http://www.blogger.com/atom/ns#" term="Deployment Server"/><category scheme="http://www.blogger.com/atom/ns#" term="Git"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Настраиваем Git развертывание для виртуальных машин Windows Azure.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем! Сегодня я постараюсь подробно описать процесс настройки Git-публикации для виртуальных машин в &lt;b&gt;Windows Azure&lt;/b&gt;. Многие из Вас уже знают, что &lt;b&gt;Windows Azure&lt;/b&gt; предоставляет разработчикам возможность публикации приложений в облаке посредством Git (подробное описание этого процесса можно найти здесь &lt;a href=&quot;http://habrahabr.ru/company/microsoft/blog/150086/&quot;&gt;http://habrahabr.ru/company/microsoft/blog/150086/&lt;/a&gt;), но немногие знают что Git публикация функционирует за счет так называемого проекта Kudu.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;b&gt;Kudu &lt;/b&gt;- это механизм, обеспечивающий в &lt;b&gt;Windows Azure &lt;/b&gt;возможность развертывания Ваших приложений при помощи &lt;b&gt;Git&lt;/b&gt;. Он распространяется под open source лицензией и доступен на &lt;b&gt;GitHub &lt;/b&gt;(&lt;a href=&quot;https://github.com/projectkudu/kudu&quot;&gt;https://github.com/projectkudu/kudu&lt;/a&gt;). Большим преимуществом данного механизма является то, что он имеет способность запускаться вне среды &lt;b&gt;Windows Azure&lt;/b&gt;. Это значит, что мы можем беспрепятственно загрузить его себе на машину и настроить &lt;b&gt;Git &lt;/b&gt;развертывание в своей локальной среде. Учитывая эту особенность, было бы очень неплохо настроить подобный механизм для виртуальных машин &lt;b&gt;Windows Azure&lt;/b&gt;. Именно это мы и попытаемся сделать.  &lt;br /&gt;
Итак, прежде всего нам необходима целевая виртуальная машина, на которой будет разворачиваться наше приложение. Создать ее можно на портале &lt;a href=&quot;http://manage.windowsazure.com/&quot; target=&quot;_blank&quot;&gt;Windows Azure&lt;/a&gt; в разделе &lt;b&gt;Virtual Machines&lt;/b&gt;. Для наших целей можно воспользоваться опцией поднятия машины из галереи, что является наиболее быстрым вариантом.&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-SboGRPy-ibI/UIRXZsn1OqI/AAAAAAAAAe8/AHB1cU2aMfU/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Windows Server 2012 Azure&quot; border=&quot;0&quot; height=&quot;372&quot; src=&quot;http://lh6.ggpht.com/-XYJLJDVYrZQ/UIRXbgoDv2I/AAAAAAAAAfE/yXN4ZE--vVg/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Windows Server 2012 Azure&quot; width=&quot;495&quot; /&gt;&lt;/a&gt;  &lt;/div&gt;
&lt;br /&gt;
Как только виртуальная машина будет настроена и запущена, мы сможем удаленно зайти на нее посредством протокола RDP и перейти к следующему шагу. На втором шаге нам необходимо склонировать удаленный репозиторий &lt;b&gt;Kudu &lt;/b&gt;на нашу виртуальную машину и запустить мастер настройки нового приложения. Давайте последовательно это выполним. В первую очередь установим клиент &lt;b&gt;Git &lt;/b&gt;для &lt;b&gt;Windows&lt;/b&gt;. Для этого перейдем на сайт &lt;a href=&quot;http://msysgit.github.com/&quot; title=&quot;http://msysgit.github.com/&quot;&gt;http://msysgit.github.com/&lt;/a&gt;, скачаем и установим программный комплекс (можно воспользоваться любым альтернативным клиентом Git). Как только инсталляция завершится, запустим &lt;b&gt;git bash&lt;/b&gt; и склонируем репозиторий в любой каталог на диске С: (для тестирования жизнеспособности решения этот диск нас полностью устроит). Адрес репозитория можно найти на &lt;a href=&quot;https://github.com/projectkudu/kudu&quot; title=&quot;https://github.com/projectkudu/kudu&quot;&gt;https://github.com/projectkudu/kudu&lt;/a&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-3vrnJrGjpDw/UIRXfcmHa3I/AAAAAAAAAfM/g34bIqy9lQU/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Безымянный&quot; border=&quot;0&quot; height=&quot;30&quot; src=&quot;http://lh5.ggpht.com/-H1mlihMZ5vQ/UIRXgEto4bI/AAAAAAAAAfQ/YsP6Xf2gGgc/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Безымянный&quot; width=&quot;558&quot; /&gt;&lt;/a&gt;  &lt;br /&gt;
Для клонирования &lt;b&gt;Kudu &lt;/b&gt;запустим следующую команду в &lt;b&gt;git bash&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;git clone https://github.com/projectkudu/kudu.git&lt;/pre&gt;
&lt;br /&gt;
Результат операции должен выглядеть следующим образом.&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-9Qh11qqqDAo/UIRXgwKVxfI/AAAAAAAAAfY/C_aBf1qO3wQ/s1600-h/GitKudu%25255B6%25255D.png&quot;&gt;&lt;img alt=&quot;GitKudu&quot; border=&quot;0&quot; height=&quot;368&quot; src=&quot;http://lh3.ggpht.com/-lHJz0d1z2aA/UIRXhrdEqzI/AAAAAAAAAfg/rxKnyyPg5Qk/GitKudu_thumb%25255B4%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;GitKudu&quot; width=&quot;563&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Следующим шагом будет билд проекта. Для этого найдем в нашем каталоге файл &lt;b&gt;[kudu_installation_dir]/kudu/build.cmd&lt;/b&gt; и запустим его с правами администратора. Процесс сборки проекта может длиться до 1 минуты, после чего нам необходимо будет создать новый сайт на локальном инстансе IIS для запуска консоли управления&lt;b&gt; Kudu&lt;/b&gt;. Новый сайт необходимо направить на подкаталог &lt;b&gt;[kudu_installation_dir]/kudu/Kudu.Web&lt;/b&gt;. Вот как это выглядит на IIS-инстансе виртуальной машины:&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh3.ggpht.com/-hCc6ll_17YE/UIRXifkxczI/AAAAAAAAAfs/5BT-hMU2JWk/s1600-h/KuduEnv%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;KuduEnv&quot; border=&quot;0&quot; height=&quot;471&quot; src=&quot;http://lh3.ggpht.com/-JvEQuAzVhzo/UIRXj9ZjkrI/AAAAAAAAAfw/mUvT6L-aOHc/KuduEnv_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;KuduEnv&quot; width=&quot;467&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Мы используем кастомный 8080 порт, оставляя свободным 80-й порт, который будет использоваться основным приложением. Так как &lt;b&gt;Kudu &lt;/b&gt;требует для своего правильного функционирования прав администратора, необходимо запустить наш пул приложений под менее ограниченным аккаунтом. Для этого перейдем в раздел &lt;b&gt;Application Pools&lt;/b&gt; и в расширенных настройках пула сменим его &lt;b&gt;Identity&lt;/b&gt;. На моей машине есть пользователь &lt;b&gt;Administrator&lt;/b&gt;, который вполне нам подойдет.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-7teCANEnsco/UIRXkxAtBII/AAAAAAAAAf4/rtRv2Osk6X0/s1600-h/AppPool%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;AppPool&quot; border=&quot;0&quot; height=&quot;260&quot; src=&quot;http://lh5.ggpht.com/-U_v34H0vxhw/UIRXl6SB3OI/AAAAAAAAAgE/tvePIKk0mfc/AppPool_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-color: -moz-use-text-color; border-style: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;AppPool&quot; width=&quot;585&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
После этого, не выходя из удаленного терминала, откроем браузер и проверим правильно ли работает сайт путем перехода по ссылке &lt;b&gt;http://localhost:8080&lt;/b&gt;. Если все удачно настроено, мы должны увидеть консоль управления &lt;b&gt;Kudu&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCCBaqxdx_Mg91vytcN_eCESupYkbcXrgRzH7SZkF0W1Te7gbKMC23kdaVJf8Mh_lwxJEW53whnViAEI3VO34u4B_MOTBVg-5GcqhV2OE2It-6eEf-RpLN-ZD6FzW6mO2DP7tbMC3eBhkq/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;449&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhCCBaqxdx_Mg91vytcN_eCESupYkbcXrgRzH7SZkF0W1Te7gbKMC23kdaVJf8Mh_lwxJEW53whnViAEI3VO34u4B_MOTBVg-5GcqhV2OE2It-6eEf-RpLN-ZD6FzW6mO2DP7tbMC3eBhkq/s640/Untitled.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Как видим при первом запуске установленных приложений нет, поэтому нам необходимо создать новое. Делается это очень просто, путем выбора пункта меню &lt;b&gt;Create Application&lt;/b&gt;, при этом все что нам необходимо будет сделать дальше - это выбрать имя создаваемого приложения Давайте остановимся на имени &lt;b&gt;GitWithKudu&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsuEl9ivQ2730IooCUGrDk-lciYiEGVLmTbKQYX_P0NpSxpHn1L0lvf_5rNXxLZ4gxnGxa_woNQJFdllL-uxYWI9xUTBXwU1_yB_ZGyDt4id3pi769oEOsix4mx_Hg-hVzZryIezzkjUCR/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhsuEl9ivQ2730IooCUGrDk-lciYiEGVLmTbKQYX_P0NpSxpHn1L0lvf_5rNXxLZ4gxnGxa_woNQJFdllL-uxYWI9xUTBXwU1_yB_ZGyDt4id3pi769oEOsix4mx_Hg-hVzZryIezzkjUCR/s1600/Untitled.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Как только мы нажмем кнопку &quot;&lt;b&gt;Create Application&lt;/b&gt;&quot;, на локальном для виртуальной машины веб-сервере будут созданы 2 сайта: один предназначен для запуска основного приложения, а второй для поддержки Git-развёртывания. Вот как созданная нами инфраструктура будет выглядеть в итоге:&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggh57j4Ad2dl4lwJ4aaZC3lNbxsI7Z-A4AOep93r0YK7z3gW5u2k8Vd8cLfJGomhT8oaEyChsJfuXhrHVTeyzGBxVd3Mi40uURH06xTAlUWFvSoUxAeBhWgJItnx-1j7x0-hM-2e_X71hG/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEggh57j4Ad2dl4lwJ4aaZC3lNbxsI7Z-A4AOep93r0YK7z3gW5u2k8Vd8cLfJGomhT8oaEyChsJfuXhrHVTeyzGBxVd3Mi40uURH06xTAlUWFvSoUxAeBhWgJItnx-1j7x0-hM-2e_X71hG/s1600/Untitled.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Сайт &lt;b&gt;Kudu Enrironment&lt;/b&gt; - это Kudu-консоль управления всеми приложениями веб-сервера. Сайт &lt;b&gt;kudu_gitwithkudu&lt;/b&gt; - наше приложение, разворачиваемое посредством &lt;b&gt;Git&lt;/b&gt;. Сайт &lt;b&gt;kudu_service_gitwithkudu&lt;/b&gt; -&amp;nbsp; вспомогательное приложение, через которое будет происходить публикация. Давайте теперь снова на минутку вернемся к консоли управления &lt;b&gt;Kudu&lt;/b&gt;. После создания нового приложения мы увидим следующий результат:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10-2xM0ybF36Lv7y9DuNP55p9XiNmqd5E6pBfRJN0LWBl8wDGKYN_Lg7kmzHFjPY-jbsy-XEY-fsE1F0a0m_HH9JKhJh4yZDnVlqjeJRAKgFYVt7L4rzueIMuSesRtzzvNReKTzNHYDvo/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg10-2xM0ybF36Lv7y9DuNP55p9XiNmqd5E6pBfRJN0LWBl8wDGKYN_Lg7kmzHFjPY-jbsy-XEY-fsE1F0a0m_HH9JKhJh4yZDnVlqjeJRAKgFYVt7L4rzueIMuSesRtzzvNReKTzNHYDvo/s1600/Untitled.png&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Как видим на этой странице представлена очень полезная информация. Тут мы можем найти адрес нашего Git-репозитория, адрес самого приложения, а также несколько вспомогательных вкладок, позволяющих отслеживать историю публикаций, изменять конфигурацию и т.д. По умолчанию &lt;b&gt;Kudu &lt;/b&gt;использует простой механизм случайного выбора портов для основного приложения и deployment-сервиса, поэтому мы видим, что наше приложение будет использовать не стандартный порт &lt;b&gt;36263&lt;/b&gt;. Для его смены можно воспользоваться обычной техникой изменения привязок сайта в IIS Manager, что собственно мы и сделаем для перевода сайта на 80-й порт.&amp;nbsp;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
На этом все работы, связанные с настройкой нашей целевой виртуальной машины, можно считать завершенными. Все, что нам осталось сделать - это развернуть наше приложение посредством созданной инфраструктуры. Напомню, что после окончания настройки &lt;b&gt;Kudu &lt;/b&gt;у нас появилось 3 сайта:&lt;/div&gt;
&lt;ol style=&quot;text-align: left;&quot;&gt;
&lt;li&gt;&lt;a href=&quot;http://gitdeploy.cloudapp.net:8080/&quot;&gt;http://gitdeploy.cloudapp.net:8080&lt;/a&gt; -&amp;nbsp; консоль управления &lt;b&gt;Kudu&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gitdeploy.cloudapp.net/&quot;&gt;http://gitdeploy.cloudapp.net&lt;/a&gt; - тестовое приложение&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gitdeploy.cloudapp.net:60972/&quot;&gt;http://gitdeploy.cloudapp.net:60972&lt;/a&gt; - deployment-сервис&lt;/li&gt;
&lt;/ol&gt;
*gitdeploy.cloudapp.net - это доменное имя нашей виртуальной машины, задается на стадии ее создания.&lt;br /&gt;
Но прежде чем приступить к разворачиванию приложения необходимо добавить порт &lt;b&gt;60972 &lt;/b&gt;в список разрешенных портов на портале &lt;b&gt;Windows Azure&lt;/b&gt;. В конечном итоге наша секция &lt;b&gt;Endpoints &lt;/b&gt;должна выглядеть подобным образом:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9FOTe5JCQACusY2GaJhBY-SsMVGc5_THb1TpcDntj6deXEVOPjgCBlAe3dbz8MsomqPC-4CR5Uce4VakE0e_tts9k43h5IsycF5ME3bbjIrsJPEm33RaYt4yQSueHWIUCkM9lqg0uC3t_/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;120&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9FOTe5JCQACusY2GaJhBY-SsMVGc5_THb1TpcDntj6deXEVOPjgCBlAe3dbz8MsomqPC-4CR5Uce4VakE0e_tts9k43h5IsycF5ME3bbjIrsJPEm33RaYt4yQSueHWIUCkM9lqg0uC3t_/s640/Untitled.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Как только новая точка с портом 60972 будет добавлена можно приступить к публикации. Для этого нам необходимо выполнить простую последовательность действий. Сначала создадим пустой каталог на диске и запустим &lt;b&gt;git bash &lt;/b&gt;для него. Воспользуемся командой&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;git init&lt;/pre&gt;
&lt;/div&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
,для инициализации нового Git-репозитория. Добавим новый файл в репозиторий под названием index.html. Содержимое данного файла представлено ниже:&lt;br /&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;
Windows Azure Kudu Engine!
&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;body&amp;gt;
&amp;lt;h1&amp;gt;
Hello Windows Azure!
&amp;lt;/h1&amp;gt;
&amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
После создания файла последовательно выполним 2 git-команды:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;git add .
git commit -m &quot;First commit&quot;
&lt;/pre&gt;
Нам осталось развернуть новый файл в облаке. Для этого выполним следующую git-комманду:&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;git push http://gitdeploy.cloudapp.net:60972/gitwithkudu.git
&lt;/pre&gt;
Для проверки откроем в браузере сайт &lt;a href=&quot;http://gitdeploy.cloudapp.net/&quot;&gt;http://gitdeploy.cloudapp.net&lt;/a&gt;. Мы должны увидеть наши изменения на сервере:&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibZT8zvrU5_l3nXDlotDVhBfn7Q7O4zTnrJwVq-hhFB-jVHrOtqi6LLqzChFrKHMnSFngZxOG5WFDHGcPnpYZPt2cQ8d0NRNG1r3DlH-9IEC2qzgr7CKCUsCileGycaf-EARmbdYW_ZQlu/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEibZT8zvrU5_l3nXDlotDVhBfn7Q7O4zTnrJwVq-hhFB-jVHrOtqi6LLqzChFrKHMnSFngZxOG5WFDHGcPnpYZPt2cQ8d0NRNG1r3DlH-9IEC2qzgr7CKCUsCileGycaf-EARmbdYW_ZQlu/s1600/Untitled.png&quot; /&gt;&amp;nbsp;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Кроме того в консоли управления Kudu во вкладке Deployments можно отследить всю историю развертываний:&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_0aT4Qm6juWv1Ls45I46yUvcikAC5ENEBR2Re_YdOKlHNwaPLsRJlMsSZgrE1VigU8woIALupxqNZtipvQqgLS7QiqRRrODUlm2I88eHtEaS2Pie5pAUh80cx3qIhD1rDf-fbCQIlrZnM/s1600/Untitled.png&quot; imageanchor=&quot;1&quot; style=&quot;margin-left: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;263&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg_0aT4Qm6juWv1Ls45I46yUvcikAC5ENEBR2Re_YdOKlHNwaPLsRJlMsSZgrE1VigU8woIALupxqNZtipvQqgLS7QiqRRrODUlm2I88eHtEaS2Pie5pAUh80cx3qIhD1rDf-fbCQIlrZnM/s640/Untitled.png&quot; width=&quot;640&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: left;&quot;&gt;
Как видим мы успешно настроили Git-развёртывание для виртуальной машины Windows Azure на базе проекта &lt;a href=&quot;https://github.com/projectkudu/kudu&quot; target=&quot;_blank&quot;&gt;Kudu&lt;/a&gt;. Несмотря на то, что этот проект еще молод и имеет ряд недостатков, я считаю его достаточно перспективным и интересным. На этом всё, спасибо за внимание! Надеюсь пост был интересным и познавательным.&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/1147683293803829128/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/1147683293803829128' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1147683293803829128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1147683293803829128'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/10/git-windows-azure.html' title='Настраиваем Git развертывание для виртуальных машин Windows Azure.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-XYJLJDVYrZQ/UIRXbgoDv2I/AAAAAAAAAfE/yXN4ZE--vVg/s72-c/Image.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-1701307835058831307</id><published>2012-08-20T09:10:00.002-07:00</published><updated>2012-08-20T09:32:15.265-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppFabric Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Запускаем Windows Azure Service Bus локально.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет! Совсем недавно в мире Windows Azure произошло очень важное событие, а именно был выпущен набор компонентов, позволяющих эмулировать &lt;b&gt;Windows Azure Service Bus&lt;/b&gt; на локальной машине. Именно этой новой возможности и будет посвящен мой сегодняшний пост. Мы узнаем как установить эмулятор Service Bus себе на машину, как сконфигурировать его, а также напишем небольшое приложение для проверки его работоспособности.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Итак, согласно определению из MSDN, &lt;b&gt;Windows Azure Service Bus for Windows Server&lt;/b&gt; – это набор инсталлируемых компонентов, предоставляющих возможность эмулирования соответствующей облачной технологии на ваших собственных серверах, с предустановленной ОС &lt;b&gt;Windows Server&lt;/b&gt;. Программная модель абсолютна идентична облачной версии поэтому переключиться с локальной на облачную не составит большого труда и Вам не нужно будет переписывать приложение. &lt;br /&gt;
Основные возможности:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;Симметричная модель программирования. Написав код один раз для локальной версии его не надо будет менять при переключении на облачную.  &lt;/li&gt;
&lt;li&gt;Отлаживать и тестировать приложения стало намного проще так как шина находится локально, что позволяет нам настраивать большинство ее параметров.  &lt;/li&gt;
&lt;li&gt;Быть может сейчас Вы не готовы переходить в облако по каким-то причинам (безопасность, юридические аспекты и др.). Эмулятор позволяет начать писать приложение сразу, а перейти на облачную версию тогда, когда вы будете готовы. &lt;/li&gt;
&lt;/ul&gt;
Для установки эмулятора можем воспользоваться &lt;b&gt;Web Platform Installer&lt;/b&gt;. Компонент носит название &lt;b&gt;Service Bus 1.0 Beta&lt;/b&gt;. Кроме установки самих компонентов необходимо также проверить следующие характеристики вашей машины:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;У Вас есть доступ к инстансу SQL Server (Express версия также подходит)  &lt;/li&gt;
&lt;li&gt;Сервис SQL Browser должен быть разрешен и запущен  &lt;/li&gt;
&lt;li&gt;TCP/IP должен быть разрешен&lt;/li&gt;
&lt;/ul&gt;
Как только установка компонентов будет завершена необходимо настроить кластер. Здесь необходимо дать некоторые пояснения. Дело в том, что &lt;b&gt;Service Bus for Windows Server&lt;/b&gt; имеет встроенную поддержку высокой доступности сервиса. Достигается это за счет использования кластеров вычислительных машин. Добавив как минимум 3 машины в кластер – Вы получите отказоустойчивое и высокодоступное решение. Схема такого решения представлена чуть ниже.&lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-ncNma58b2VY/UDIaJiFgSdI/AAAAAAAAAc8/sUGu1k_9GiQ/s1600-h/IC593637%25255B12%25255D.jpg&quot;&gt;&lt;img alt=&quot;Service Bus High Availability&quot; border=&quot;0&quot; height=&quot;200&quot; src=&quot;http://lh5.ggpht.com/-xinveTbw42E/UDIaKafNJEI/AAAAAAAAAdE/MI-tBo17sB4/IC593637_thumb%25255B8%25255D.jpg?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Service Bus High Availability&quot; width=&quot;475&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Следует отметить, что данная схема работает только для вычислительных инстансов. Для слоя хранения данных встроенной поддержки отказоустойчивости нет, необходимо использовать сторонние подходы, например, &lt;b&gt;SQL Server Mirroring&lt;/b&gt;. Итак, первоначально нам необходимо создать новый кластер и добавить туда нашу девелоперскую машину. Делается это при помощи следующих &lt;b&gt;PowerShell&lt;/b&gt; команд:&lt;br /&gt;
&lt;pre class=&quot;brush:powershell&quot;&gt;$mycert=ConvertTo-SecureString -string &amp;lt;password&amp;gt; -force -AsPlainText
New-SBFarm -FarmMgmtDBConnectionString &quot;data source=localhost\sqlexpress;integrated security=true&quot; –CertAutoGenerationKey $mycert
Add-SBHost -certautogenerationkey $mycert -FarmMgmtDBConnectionString &quot;data source=localhost\sqlexpress; integrated security=true&quot;&lt;/pre&gt;
Здесь, в первой строке мы определяем пароль, который будет использоваться при генерации сертификата безопасности. Во второй строке мы создаем кластер/ферму, при этом необходимо указать правильный адрес SQL Server и криденшиалы для доступа к нему. Последней командой мы добавляем текущую машину в только что созданный кластер (здесь также следует обратить внимание на строку соединения). Как только все вышеуказанные команды выполняться успешно, на используемом экземпляре SQL Server мы должны увидеть 3 базы данных, которые буду служить как центром конфигурации кластера так и хранилищем данных для сообщений, курсирующих по шине. &lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-RsYEP_cH_2I/UDI0zgU_HZI/AAAAAAAAAdU/3qx1qb-d9_M/s1600-h/Databases%25255B3%25255D.png&quot;&gt;&lt;img alt=&quot;Azure Service Bus For Windows Server Databases&quot; border=&quot;0&quot; height=&quot;109&quot; src=&quot;http://lh6.ggpht.com/-bZnyy-ZkQdI/UDI00vOBPII/AAAAAAAAAdY/OKABHioPsPQ/Databases_thumb%25255B1%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Azure Service Bus For Windows Server Databases&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Для проверки работоспособности кластера можно запустить специальную команду:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;Get-SBFarmStatus&lt;/pre&gt;
В результате выполнения команды мы должны получить следующую информацию:&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-lV5Ya3WUQnI/UDI01aXIY3I/AAAAAAAAAdg/4NmBIRxkpP4/s1600-h/Services%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;Services&quot; border=&quot;0&quot; height=&quot;105&quot; src=&quot;http://lh4.ggpht.com/-p87gwIm9WaI/UDI02WIgKtI/AAAAAAAAAdo/OhBMl_SkGUI/Services_thumb%25255B2%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Services&quot; width=&quot;350&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Если какой либо из сервисов Service Bus не находится в состоянии Running, значит на предыдущем этапе возникли ошибки. В случае успешного запуска всех сервисов на следующем шаге нам необходимо создать неймспейс (как мы помним в облачной версии этот шаг выполняется на портале). Для этого необходимо выполнить следующую команду:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;New-SBNamespace –Name TestSbNamespace –ManageUsers  yourDomain\yourUsername&lt;/pre&gt;
В параметре –&lt;b&gt;Name &lt;/b&gt;мы задаем название создаваемого неймспейса. В параметре –&lt;b&gt;ManageUsers&lt;/b&gt; задается список пользователей, которые будут иметь права по управлению создаваемым неймспейсом. Как только команда выполнится успешно мы сможем перейти к написанию своего первого приложения, использующего локальную сервисную шину. &lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-family: Trebuchet MS; font-size: medium;&quot;&gt;Реализация сценария Sender/Receiver на базе Windows Server Service Bus&lt;/span&gt;&lt;br /&gt;
&lt;br /&gt;
Для тестирования напишем простое решение, позволяющее отправлять сообщения и принимать их посредством запущенной локально сервисной шины. Структура проекта относительно проста. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://lh6.ggpht.com/-2aIhzjwgjRU/UDJWafiOveI/AAAAAAAAAeE/xV77F29HI74/s1600-h/ServiceBus%25255B5%25255D.png&quot;&gt;&lt;img alt=&quot;ServiceBus&quot; border=&quot;0&quot; height=&quot;248&quot; src=&quot;http://lh6.ggpht.com/-olHl2t9nr5E/UDJWbetuVbI/AAAAAAAAAeM/rNkndiaJg9k/ServiceBus_thumb%25255B3%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ServiceBus&quot; width=&quot;372&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Это 2 консольных приложения.Одно из них используется для отправки сообщений, другое для приема. Давайте посмотрим на исходный код отправителя (Sender.cs).&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;namespace Microsoft.Samples.MessagingWithQueues
{
    using System;
    using System.Collections.Generic;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Messaging;
    using System.Net.NetworkInformation;
    using System.Collections.Generic;

    public class Sender
    {
        const string QueueName = &quot;MessagesQueue&quot;;
        static string ServiceNamespace;
        static string ServerDomainName = &quot;localhost&quot;;
        static int HttpPort = 4446;
        static int TcpPort = 9354; 

        static void Main(string[] args)
        {
            GetUserCredentials();    
            
            Uri rootAddressManagement = ServiceBusEnvironment.CreatePathBasedServiceUri(&quot;sb&quot;, ServiceNamespace, string.Format(&quot;{0}:{1}&quot;, ServerDomainName, HttpPort));
            Uri rootAddressRuntime = ServiceBusEnvironment.CreatePathBasedServiceUri(&quot;sb&quot;, ServiceNamespace, string.Format(&quot;{0}:{1}&quot;, ServerDomainName, TcpPort));


            MessagingFactorySettings mfSettings = new MessagingFactorySettings();
            mfSettings.TokenProvider = TokenProvider.CreateWindowsTokenProvider(
                           new List&amp;lt;Uri&amp;gt;() { rootAddressManagement });           

            MessagingFactory factory = MessagingFactory.Create(rootAddressRuntime, mfSettings); 


            try
            {     
                NamespaceManagerSettings nmSettings = new NamespaceManagerSettings();               
                nmSettings.TokenProvider = TokenProvider.CreateWindowsTokenProvider(new List&amp;lt;Uri&amp;gt;() { rootAddressManagement });
                
                NamespaceManager namespaceManager = new NamespaceManager(rootAddressManagement, nmSettings);
                Console.WriteLine(&quot;\nCreating Queue &#39;{0}&#39;...&quot;, Sender.QueueName);

                // Delete if exists
                if (namespaceManager.QueueExists(Sender.QueueName))
                {
                    namespaceManager.DeleteQueue(Sender.QueueName);
                }
                namespaceManager.CreateQueue(Sender.QueueName);
                QueueClient myQueueClient = factory.CreateQueueClient(Sender.QueueName);
                string message = String.Empty;
                do
                {
                    message = Console.ReadLine();
                    myQueueClient.Send(CreateMessage(Guid.NewGuid().ToString(), message));
                } while (!String.IsNullOrEmpty(message));
            }
            catch (Exception e)
            {
                Console.WriteLine(&quot;Unexpected exception {0}&quot;, e.ToString());
                throw;
            }
            finally
            {
                // Closing factory close all entities created from the factory.
                if(factory != null)
                    factory.Close();
            }
            
        }

        static void GetUserCredentials()
        {
            Console.Write(&quot;Please provide the server Fully Quaified Domain Name to use (blank for localhost): &quot;);
            ServerDomainName = Console.ReadLine();
            if (ServerDomainName.Equals(&quot;localhost&quot;) || String.IsNullOrEmpty(ServerDomainName))
            {
                var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
                ServerDomainName = string.Format(&quot;{0}.{1}&quot;, ipProperties.HostName, ipProperties.DomainName);
            }
            
            Console.Write(&quot;Please provide the service namespace to use: &quot;);
            ServiceNamespace = Console.ReadLine();
        }

        private static BrokeredMessage CreateMessage(string messageId, string messageBody)
        {            
            BrokeredMessage message = new BrokeredMessage(messageBody);
            message.MessageId = messageId;
            return message;
        }
    }
}
&lt;/pre&gt;
В первую очередь для начала отправки сообщений необходимо собрать информацию о месторасположении сервера и неймспейсе. Это происходит в методе &lt;b&gt;GetUserCredentials&lt;/b&gt;, где мы запрашиваем DNS-имя сервера (в случае запуска шины локально можно ничего не вводить) и название неймспейса (в нашем случае это будет &lt;b&gt;TestSbNamespace&lt;/b&gt;). Как облачная так и серверная версия Service Bus используют access-токены для предоставления доступа к своим внутренним элементам (subsriptions, topics, queues, entities ...). Но в отличие от серверной версии, облачная тесно интегрирована с &lt;b&gt;Windows Azure Access Control Service&lt;/b&gt; поэтому для локальной версии была разработана своя подсистема, называемая &lt;b&gt;Service Bus Security Token Service (SBST)&lt;/b&gt;. Эта подсистема интегрирована с моделью безопасности Windows и позволяет генерировать токены, базируясь на Windows аккаунтах (поддерживается как локальное хранилище так и &lt;b&gt;Active Directory&lt;/b&gt;). Для получения токена от локальной &lt;b&gt;SBST &lt;/b&gt;мы используем метод &lt;b&gt;TokenProvider.CreateWindowsTokenProvider&lt;/b&gt;, принимающий список защищаемых неймспейсов. В нашем случае нам необходимо сгенерировать токен дважды: для объекта класса &lt;b&gt;MessagingFactory &lt;/b&gt;и для &lt;b&gt;NamespaceManagerSettings&lt;/b&gt;. Для отправки сообщения в очередь необходимо создать объект класса &lt;b&gt;BrokeredMessage &lt;/b&gt;и передать его методу &lt;b&gt;Send&lt;/b&gt;, который доступен у объекта класса &lt;b&gt;QueueClient&lt;/b&gt;. &lt;br /&gt;
Если в процессе написания кода вы столкнетесь в проблемой отсутствующих сборок, то скорее всего Вам необходимо будет инсталлировать пакет под названием &lt;b&gt;Service Bus 1.0 Beta (for Windows Server)&lt;/b&gt; – делается это из окна пакетного менеджера Nuget&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-Q6U2bRVs23A/UDJWcbH1d0I/AAAAAAAAAeU/pLIPNXFxOh8/s1600-h/ServiceBus%25255B15%25255D.png&quot;&gt;&lt;img alt=&quot;ServiceBus&quot; border=&quot;0&quot; height=&quot;456&quot; src=&quot;http://lh6.ggpht.com/-tQ6CFwvJ6Jc/UDJWde-i2qI/AAAAAAAAAec/qlSMJH8dEhg/ServiceBus_thumb%25255B8%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;ServiceBus&quot; width=&quot;639&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Код обработчика сообщений очень похож на код отправителя&amp;nbsp; за исключением того, что здесь мы входим в бесконечный цикл ожидания сообщений и для их получения из очереди используем метод Receive. Полностью код обработчика сообщений представлен ниже:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;namespace Microsoft.Samples.MessagingWithQueues
{
    using System;
    using Microsoft.ServiceBus;
    using Microsoft.ServiceBus.Messaging;
    using System.Net.NetworkInformation;
    using System.Collections.Generic;
    using System.Threading;

    public class Receiver
    {
        const string QueueName = &quot;MessagesQueue&quot;;
        static string ServiceNamespace;
        static string ServerDomainName = &quot;localhost&quot;;
        static int HttpPort = 4446;
        static int TcpPort = 9354; 

        static void Main(string[] args)
        {
            GetUserCredentials();

            Uri rootAddressManagement = ServiceBusEnvironment.CreatePathBasedServiceUri(&quot;sb&quot;, ServiceNamespace, string.Format(&quot;{0}:{1}&quot;, ServerDomainName, HttpPort));
            Uri rootAddressRuntime = ServiceBusEnvironment.CreatePathBasedServiceUri(&quot;sb&quot;, ServiceNamespace, string.Format(&quot;{0}:{1}&quot;, ServerDomainName, TcpPort));


            MessagingFactorySettings mfSettings = new MessagingFactorySettings();
            mfSettings.TokenProvider = TokenProvider.CreateWindowsTokenProvider(
                           new List&amp;lt;Uri&amp;gt;() { rootAddressManagement });

            MessagingFactory factory = MessagingFactory.Create(rootAddressRuntime, mfSettings); 

            try
            { 
                QueueClient myQueueClient = factory.CreateQueueClient(Receiver.QueueName, ReceiveMode.PeekLock);
                Console.WriteLine(&quot;\nReceiving messages from Queue &#39;{0}&#39;...&quot;, Receiver.QueueName);

                while (true)
                {
                    var message = myQueueClient.Receive();
                    if (message != null)
                    {
                        Console.WriteLine(String.Format(&quot;Message received: Id = {0}, Body = {1}&quot;, message.MessageId, message.GetBody&amp;lt;string&amp;gt;()));
                        message.Complete();
                    }
                }
            }
            catch (Exception e)
            {
                Console.WriteLine(&quot;Unexpected exception {0}&quot;, e.ToString());
                throw;
            }
            finally
            {
                // Closing factory close all entities created from the factory.
                if (factory != null)
                    factory.Close();
            }
        }

        static void GetUserCredentials()
        {
            Console.Write(&quot;Please provide the server FQDN to use (blank for localhost): &quot;);
            ServerDomainName = Console.ReadLine();
            if ((string.Compare(ServerDomainName, &quot;localhost&quot;, true) == 0) || string.IsNullOrEmpty(ServerDomainName))
            {
                var ipProperties = IPGlobalProperties.GetIPGlobalProperties();
                ServerDomainName = string.Format(&quot;{0}.{1}&quot;, ipProperties.HostName, ipProperties.DomainName);
            }

            Console.Write(&quot;Please provide the service namespace to use: &quot;);
            ServiceNamespace = Console.ReadLine();
        }
    }
}&lt;/pre&gt;
Метод Complete необходим для оповещения сервисной шины о том, что сообщение успешно обработано. После вызова этого метода сообщение физически удаляется из очереди. Если в обработчике произойдет сбой во время обработки сообщения, то оно снова станет доступным по истечение определенного промежутка времени. Это один из вариантов функционирования очереди, называемый PeekLock (Все варианты получения сообщений описаны на сайте &lt;a href=&quot;https://www.windowsazure.com/en-us/develop/net/how-to-guides/service-bus-queues/#receive-messages&quot; target=&quot;_blank&quot;&gt;Windows Azure&lt;/a&gt;). Сам процесс взаимодействия отправителя и получателя хорошо продемонстрирован на видео:&lt;br /&gt;
&lt;center&gt;
&lt;object align=&quot;&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; codebase=&quot;http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,0,0&quot; height=&quot;440&quot; id=&quot;ServiceBusForWindowsServerMessageBrokering&quot; width=&quot;700&quot;&gt;&lt;br /&gt;&lt;param NAME=&quot;movie&quot; VALUE=&quot;http://dl.dropbox.com/u/18522369/Service_Bus_For_Windows_Server.swf&quot;&gt; &lt;param NAME=&quot;quality&quot; VALUE=&quot;high&quot;&gt; &lt;param NAME=&quot;bgcolor&quot; VALUE=&quot;#333399&quot;&gt;&lt;embed src=&quot;http://dl.dropbox.com/u/18522369/Service_Bus_For_Windows_Server.swf&quot; quality=&quot;high&quot; bgcolor=&quot;#FFFFFF&quot; WIDTH=&quot;700&quot; HEIGHT=&quot;420&quot; NAME=&quot;Yourfilename&quot; ALIGN=&quot;&quot; TYPE=&quot;application/x-shockwave-flash&quot; PLUGINSPAGE=&quot;http://www.macromedia.com/go/getflashplayer&quot; allowfullscreen=&quot;true&quot;&gt;&lt;/EMBED&gt; &lt;/OBJECT&gt;&lt;/center&gt;
Как видим разработанное приложение на базе Service Bus for Windows Server работает исправно. Надеюсь информация была представлена в максимально удобном и понятном виде. Если будут вопросы или предложения, пишите в комментариях, будем обсуждать :) Спасибо за внимание! Ссылка на скачивание готового решения:&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;iframe frameborder=&quot;0&quot; height=&quot;120&quot; scrolling=&quot;no&quot; src=&quot;https://skydrive.live.com/embed?cid=B5F30232C20B4EC1&amp;amp;resid=B5F30232C20B4EC1%21573&amp;amp;authkey=AKdiGQeUDU-2sDk&quot; width=&quot;98&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/1701307835058831307/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/1701307835058831307' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1701307835058831307'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1701307835058831307'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/08/windows-azure-service-bus.html' title='Запускаем Windows Azure Service Bus локально.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-xinveTbw42E/UDIaKafNJEI/AAAAAAAAAdE/MI-tBo17sB4/s72-c/IC593637_thumb%25255B8%25255D.jpg?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-4258081999862892491</id><published>2012-08-17T04:38:00.000-07:00</published><updated>2012-08-17T04:41:52.363-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Blobs"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Асинхронная загрузка больших файлов в Blob Storage.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем! Сегодня я хотел бы подробно описать процедуру загрузки больших файлов в хранилище блобов. Данная задача возникла пару месяцев назад на одном из наших проектов и заставила меня искать возможные варианты ее решения. Предложенный подход не является чем-то совершенно новым и скорее всего не вызовет у Вас удивления. Он заключается в использовании такой распространенной библиотеки как &lt;b&gt;JQuery File Upload&lt;/b&gt; (&lt;a href=&quot;http://blueimp.github.com/jQuery-File-Upload/&quot; title=&quot;http://blueimp.github.com/jQuery-File-Upload/&quot;&gt;http://blueimp.github.com/jQuery-File-Upload/&lt;/a&gt;) в связке с возможностью поблочной загрузки блобов в хранилище. Процесс загрузки должен оптимально использовать канал и в меньшей степени нагружать промежуточный веб-сервер, поэтому собственно и было принято решение не загружать файл целиком, а предварительно разбивать его на небольшие фрагменты. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Итак, для демонстрации я создал простое тестовое веб-приложение, в котором существует одна простая страница. На этой странице пользователь имеет возможность выбрать файл и стартовать процесс загрузки. Механизм загрузки файла естественно должен быть асинхронным и пользователь должен иметь возможность отслеживать прогресс операции. Давайте посмотрим на последовательность операций, необходимых для успешной загрузки файла в хранилище.&lt;br /&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-zfJ9r0eaf6I/UC4P62DyVDI/AAAAAAAAAcQ/iNuqeUQZ0S4/s1600-h/Untitled%25255B4%25255D.png&quot;&gt;&lt;img alt=&quot;Untitled&quot; border=&quot;0&quot; height=&quot;223&quot; src=&quot;http://lh6.ggpht.com/-6AkHrafoOOY/UC4P7iZF6tI/AAAAAAAAAcY/PtzhcHTnzrw/Untitled_thumb%25255B2%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: block; float: none; margin-left: auto; margin-right: auto; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Untitled&quot; width=&quot;608&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Прежде чем инициировать загрузку нового файла, клиент (в нашем случае браузер) создает новую загрузочную сессию и присваивает ей уникальный идентификатор. После чего файл автоматически разбивается на части и загружается последовательно на сервер. Сервер в свою очередь принимает входящий поток байтов и отправляет его в виде блока в хранилище блобов (для этого используется операция &lt;b&gt;PutBlock&lt;/b&gt;). Как только все фрагменты файла успешно загружены на сервер, клиент инициирует операцию их слияния. Для этого отправляется HTTP запрос на сервер, где он трансформируется в операцию &lt;b&gt;PutBlockList&lt;/b&gt;, после чего исходный файл становится доступным в хранилище блобов.&lt;br /&gt;
Давайте посмотрим на то, как этот процесс реализован в Visual Studio. Проект относительно простой, на следующей картинке можно увидеть его структуру.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-bmbsJ-ksIyo/UC4P8yMqUOI/AAAAAAAAAcg/lT-SlOd-ApI/s1600-h/Untitled2%25255B7%25255D.png&quot;&gt;&lt;img alt=&quot;Untitled2&quot; border=&quot;0&quot; height=&quot;414&quot; src=&quot;http://lh4.ggpht.com/-flFqeb4tIYU/UC4P-6aCyUI/AAAAAAAAAco/1ah7ukpESTA/Untitled2_thumb%25255B5%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Untitled2&quot; width=&quot;321&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div align=&quot;left&quot;&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div align=&quot;left&quot;&gt;
Из всех присутствующих файлов нас интересуют лишь 5. Прежде всего очень важно представление &lt;b&gt;Index.chtml &lt;/b&gt;– здесь сосредоточена вся логика связанная с клиентской частью. Исходный код этого файла представлен ниже.&lt;/div&gt;
&lt;pre class=&quot;brush:html&quot;&gt;&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
    &amp;lt;link href=&quot;../../Content/bootstrap.css&quot; rel=&quot;stylesheet&quot; type=&quot;text/css&quot; /&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot; src=&quot;https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;../../Scripts/jquery.ui.widget.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;../../Scripts/jquery.iframe-transport.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script src=&quot;../../Scripts/jquery.fileupload.js&quot; type=&quot;text/javascript&quot;&amp;gt;&amp;lt;/script&amp;gt;
    &amp;lt;script type=&quot;text/javascript&quot;&amp;gt;
        function guidGenerator() {
            var S4 = function () {
                return (((1 + Math.random()) * 0x10000) | 0).toString(16).substring(1);
            };
            return (S4() + S4() + &quot;-&quot; + S4() + &quot;-&quot; + S4() + &quot;-&quot; + S4() + &quot;-&quot; + S4() + S4() + S4());
        }
        function MergeBlocks(filename) {
            $.post(&#39;/upload/mergeblocks&#39;, { FileName: filename, SessionId: $(&#39;#sessionId&#39;).val() });
        }
        $(function () {
            $(&#39;#dictionaryFileInputContainer&#39;).fileupload({
                url: &#39;/filetransfer.ashx&#39;,
                paramName: &quot;dictionaryFile&quot;,
                maxChunkSize: 4194304,
                add: function (e, data) {
                    $(&#39;#createButton&#39;).on(&#39;click&#39;, function () {
                        $(&#39;#sessionId&#39;).val(guidGenerator());
                        data.submit();
                    })
                }
            })
                .bind(&#39;fileuploadprogressall&#39;, function (e, data) {
                    var progress = parseInt(data.loaded / data.total * 100, 10);
                    progress = progress == 99 ? 100 : progress;
                    $(&#39;#uploadingProgressBar&#39;).css(&#39;width&#39;, progress + &#39;%&#39;);
                })
                .bind(&#39;fileuploadalways&#39;, function (e, data) {
                    $(&#39;#uploadingProgressBar&#39;).css(&#39;width&#39;, &#39;100%&#39;);
                    MergeBlocks(data.files[0].name);
                })
        })
    &amp;lt;/script&amp;gt;
&amp;lt;/head&amp;gt;
    &amp;lt;body&amp;gt;
        &amp;lt;div class=&quot;container&quot;&amp;gt;
            &amp;lt;form class=&quot;form-horizontal&quot; enctype=&quot;multipart/form-data&quot; id=&quot;dictionaryCreationForm&quot; action=&quot;upload&quot; method=&quot;POST&quot;&amp;gt;
                &amp;lt;fieldset&amp;gt;
                    &amp;lt;input type=&quot;hidden&quot; name=&quot;sessionId&quot; id=&quot;sessionId&quot; /&amp;gt;
                    &amp;lt;div class=&quot;control-group&quot;&amp;gt;
                        &amp;lt;div class=&quot;controls&quot;&amp;gt;
                            &amp;lt;input type=&quot;file&quot; id=&quot;dictionaryFileInputContainer&quot; name=&quot;uploadedFileName&quot; /&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;control-group&quot;&amp;gt;
                        &amp;lt;label class=&quot;control-label&quot; for=&quot;uploadingProgressBar&quot;&amp;gt;
                            Uploading Progress&amp;lt;/label&amp;gt;
                        &amp;lt;div class=&quot;controls&quot;&amp;gt;
                            &amp;lt;div class=&quot;progress progress-info&quot; style=&quot;width: 30%&quot;&amp;gt;
                                &amp;lt;div class=&quot;bar&quot; style=&quot;width: 0%;&quot; id=&quot;uploadingProgressBar&quot;&amp;gt;
                                &amp;lt;/div&amp;gt;
                            &amp;lt;/div&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                    &amp;lt;div class=&quot;control-group&quot;&amp;gt;
                        &amp;lt;div class=&quot;controls&quot;&amp;gt;
                            &amp;lt;input type=&quot;button&quot; id=&quot;createButton&quot; class=&quot;btn&quot; value=&quot;Submit&quot;&amp;gt;
                        &amp;lt;/div&amp;gt;
                    &amp;lt;/div&amp;gt;
                &amp;lt;/fieldset&amp;gt;
        &amp;lt;/form&amp;gt;
        &amp;lt;/div&amp;gt;
    &amp;lt;/body&amp;gt;
&amp;lt;/html&amp;gt;
&lt;/pre&gt;
Визуальных элементов на этой странице минимум – это кнопки выбора файла и начала загрузки. Больший интерес представляет js-код. Здесь используется библиотека &lt;b&gt;JQuery File Upload&lt;/b&gt;. Все, что нам необходимо это сконфигурировать движок и “подвеситься” на необходимые нам обработчики событий.&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;        $(function () {
            $(&#39;#dictionaryFileInputContainer&#39;).fileupload({
                url: &#39;/filetransfer.ashx&#39;,
                paramName: &quot;dictionaryFile&quot;,
                maxChunkSize: 4194304,
                add: function (e, data) {
                    $(&#39;#createButton&#39;).on(&#39;click&#39;, function () {
                        $(&#39;#sessionId&#39;).val(guidGenerator());
                        data.submit();
                    })
                }
            })
                .bind(&#39;fileuploadprogressall&#39;, function (e, data) {
                    var progress = parseInt(data.loaded / data.total * 100, 10);
                    progress = progress == 99 ? 100 : progress;
                    $(&#39;#uploadingProgressBar&#39;).css(&#39;width&#39;, progress + &#39;%&#39;);
                })
                .bind(&#39;fileuploadalways&#39;, function (e, data) {
                    $(&#39;#uploadingProgressBar&#39;).css(&#39;width&#39;, &#39;100%&#39;);
                    MergeBlocks(data.files[0].name);
                })
        })&lt;/pre&gt;
Как видим обрабатывать фрагменты файлов будет хендлер &lt;b&gt;filetransfer.ashx&lt;/b&gt;, а максимальный размер запроса не будет превышать 4Мб (это обусловлено ограничением на размер одного блока в хранилище блобов). Как только файл будет выбран и пользователь нажмет на кнопку его отправки – будет создана новая сессия и клиент начнет отправлять файл. Вот как это реализовано:&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;  add: function (e, data) {
                    $(&#39;#createButton&#39;).on(&#39;click&#39;, function () {
                        $(&#39;#sessionId&#39;).val(guidGenerator());
                        data.submit();
                    })
                }&lt;/pre&gt;
&lt;br /&gt;
Для того, чтобы отслеживать прогресс загрузки мы используем 2 обработчика события – это &lt;b&gt;fileuploadprogressall&lt;/b&gt; и &lt;b&gt;fileuploadalways&lt;/b&gt;. Последний срабатывает в момент завершения загрузки финального фрагмента. В этом обработчике мы отправляем запрос на слияние предварительно загруженных фрагментов путем вызова метода MergeBlocks. Вот его код.&lt;br /&gt;
&lt;pre class=&quot;brush:javascript&quot;&gt;        function MergeBlocks(filename) {
            $.post(&#39;/upload/mergeblocks&#39;, { FileName: filename, SessionId: $(&#39;#sessionId&#39;).val() });
        }&lt;/pre&gt;
Как видим мы просто отправляем POST-запрос на определенный URL с указанием названия файла и идентификатора сессии. &lt;br /&gt;
&lt;br /&gt;
Следующий, интересующий нас файл, это &lt;b&gt;FileTranfer.ashx&lt;/b&gt;. Он обрабатывает приходящие фрагменты файлов и отправляет их в хранилище. Вот его исходный код:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.IO;
using Newtonsoft.Json;
using System.Text;
using AsyncLargeFilesUpload.Web.Models;

namespace AsyncLargeFilesUpload.Web
{
    public class FileTransfer : IHttpHandler
    {
        private const string SessionIdKeyName = &quot;sessionId&quot;;

        public void ProcessRequest(HttpContext context)
        {
            if (!context.Request.Params.AllKeys.Contains(SessionIdKeyName))
            {
                throw new ArgumentNullException(&quot;Session id required&quot;);
            }
            SessionsManager.CreateIfNotExists(context.Request[SessionIdKeyName]);
            context.Response.AddHeader(&quot;Pragma&quot;, &quot;no-cache&quot;);
            context.Response.AddHeader(&quot;Cache-Control&quot;, &quot;private, no-cache&quot;);
            UploadFile(context);
        }

        private void UploadFile(HttpContext context)
        {
            var headers = context.Request.Headers;

            if (!String.IsNullOrEmpty(headers[&quot;X-File-Name&quot;]))
            {
                UploadPartialFile(Path.GetFileName(headers[&quot;X-File-Name&quot;]), context);
            }

            WriteResponse(context);
        }

        private void WriteResponse(HttpContext context)
        {
            context.Response.AddHeader(&quot;Vary&quot;, &quot;Accept&quot;);
            try
            {
                if (context.Request[&quot;HTTP_ACCEPT&quot;].Contains(&quot;application/json&quot;))
                    context.Response.ContentType = &quot;application/json&quot;;
                else
                    context.Response.ContentType = &quot;text/plain&quot;;
            }
            catch
            {
                context.Response.ContentType = &quot;text/plain&quot;;
            }

            context.Response.Write(@&quot;{ Result: 1, Message: &quot;&quot;Chunk Uploaded&quot;&quot; }&quot;);
        }

        private void UploadPartialFile(string fullName, HttpContext context)
        {
            if (context.Request.Files.Count != 1)
                throw new HttpRequestValidationException(&quot;Attempt to upload chunked file containing more than one fragment per request&quot;);
            var inputStream = context.Request.Files[0].InputStream;
            byte[] fileBytes;
            using (var reader = new BinaryReader(inputStream))
            {
                fileBytes = reader.ReadBytes((int)inputStream.Length);
            }
            var blockId = Guid.NewGuid().ToString();
            SessionsManager.AddItem(context.Request[SessionIdKeyName], blockId);
            var storageAccount = CloudStorageAccount.Parse(&quot;UseDevelopmentStorage=true&quot;);
            var blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference(MvcApplication.FilesContainerName);
            container.CreateIfNotExist();
            var permission = container.GetPermissions();
            permission.PublicAccess = BlobContainerPublicAccessType.Container;
            container.SetPermissions(permission);
            CloudBlockBlob blob = container.GetBlockBlobReference(fullName);
            using (var stream = new MemoryStream(fileBytes, true))
            {
                blob.PutBlock(Convert.ToBase64String(Encoding.UTF8.GetBytes(blockId)), stream, null);
            }
        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}&lt;/pre&gt;
Код относительно прост и не требует особых пояснений. В нем можно отметить лишь процесс отправки блока. Для этого используется метод &lt;b&gt;PutBlock&lt;/b&gt;, он принимает идентификатор блока (в кодировке &lt;b&gt;base64&lt;/b&gt;) и собственно сам набор байтов. Так как нам для слияния блоков в дальнейшем потребуются их идентификаторы – необходимы их где-то хранить. Для этого был разработан класс &lt;b&gt;SessionsManager&lt;/b&gt;. Вот его исходный код:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;

namespace AsyncLargeFilesUpload.Web.Models
{
    public static class SessionsManager
    {
        static Dictionary&amp;lt;string, IList&amp;lt;string&amp;gt;&amp;gt; fileParts = new Dictionary&amp;lt;string, IList&amp;lt;string&amp;gt;&amp;gt;();

        public static void AddItem(string key, string value)
        {
            fileParts[key].Add(value);
        }

        public static bool CreateIfNotExists(string key)
        {
            bool result = false;
            if (
          !fileParts.Keys.Contains(key) ||
          fileParts[key] == null ||
          fileParts[key].Count == 0)
            {
                fileParts.Add(key, new List&amp;lt;string&amp;gt;());
                result = true;
            }
            return result;
        }

        public static IList&amp;lt;string&amp;gt; GetBlockListBySessionId(string sessionId)
        {
            return fileParts[sessionId];
        }

        public static void RemoveSessionBlocks(string sessionId)
        {
            fileParts.Remove(sessionId);
        }
    }
}&lt;/pre&gt;
Для тестирования решения мы просто храним идентификаторы блоков в статической коллекции (в производственной среде возможно следует подумать о другом хранилище). Каждая такая коллекция привязана к одной сессии поэтому используется структура &lt;b&gt;Dictionary&amp;lt;string, IList&amp;lt;string&amp;gt;&amp;gt;&lt;/b&gt;. Последний проектный файл, который необходимо рассмотреть – это &lt;b&gt;UploadController&lt;/b&gt;. Вот его исходный код:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.Mvc;
using AsyncLargeFilesUpload.Web.Models;
using Microsoft.WindowsAzure;
using Microsoft.WindowsAzure.StorageClient;
using System.Text;

namespace AsyncLargeFilesUpload.Web.Controllers
{
    public class UploadController : Controller
    {
        public ActionResult Index()
        {
            return View();
        }

        public JsonResult MergeBlocks(CompleteFileUploadRequest file)
        {
            var storageAccount = CloudStorageAccount.Parse(&quot;UseDevelopmentStorage=true&quot;);
            var blobClient = storageAccount.CreateCloudBlobClient();
            CloudBlobContainer container = blobClient.GetContainerReference(MvcApplication.FilesContainerName);
            var blockList = SessionsManager.GetBlockListBySessionId(file.SessionId);
            var blob = container.GetBlockBlobReference(file.FileName);
            blob.PutBlockList(blockList.Select(entry =&amp;gt; Convert.ToBase64String(Encoding.UTF8.GetBytes(entry))));
            SessionsManager.RemoveSessionBlocks(file.SessionId);
            return Json(&quot;Ok&quot;);
        }
    }
}
&lt;/pre&gt;
Для слияния блоков используется экшен &lt;b&gt;MergeBlocks&lt;/b&gt;, он принимает комплексный объект &lt;b&gt;CompleteFileUploadRequest&lt;/b&gt;, содержащий название файла и идентификатор сессии. Последовательность действий очень проста:&lt;br /&gt;
&lt;ol&gt;
&lt;li&gt;Получить ссылку на интересующий блоб &lt;/li&gt;
&lt;li&gt;Получить список блоков для переданной в параметре сессии &lt;b&gt;var blockList = SessionsManager.GetBlockListBySessionId(file.SessionId)&lt;/b&gt; &lt;/li&gt;
&lt;li&gt;Слить блоки в один блоб &lt;b&gt;blob.PutBlockList(blockList.Select(entry =&amp;gt; Convert.ToBase64String(Encoding.UTF8.GetBytes(entry)))); &lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
Вот собственно и все. Ссылку на скачивание готового решения можно найти чуть ниже. Аргументированная критика и возможности по улучшению подхода приветствуются :) Спасибо за внимание!&lt;br /&gt;
&lt;iframe frameborder=&quot;0&quot; height=&quot;120&quot; scrolling=&quot;no&quot; src=&quot;https://skydrive.live.com/embed?cid=B5F30232C20B4EC1&amp;amp;resid=B5F30232C20B4EC1%21563&amp;amp;authkey=AOQgN2Dj-L1vqbo&quot; width=&quot;98&quot;&gt;&lt;/iframe&gt;
&lt;/div&gt;
</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/4258081999862892491/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/4258081999862892491' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4258081999862892491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4258081999862892491'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/08/blob-storage.html' title='Асинхронная загрузка больших файлов в Blob Storage.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh6.ggpht.com/-6AkHrafoOOY/UC4P7iZF6tI/AAAAAAAAAcY/PtzhcHTnzrw/s72-c/Untitled_thumb%25255B2%25255D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-5473522091457117373</id><published>2012-06-30T06:14:00.002-07:00</published><updated>2012-06-30T06:14:27.509-07:00</updated><title type='text'>Тренинг по Windows Azure. Масштабирование и кеширование.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Последний день тренинга был посвящен разновидностям масштабирования приложений в облаке (Scale Up vs Scale Out), технике распределенного кеширования данных в Windows Azure (Azure Caching Service), а также основам функционирования Windows Azure Traffic Manager. Презентация доступна чуть ниже, скачать ее можно на сайте Slideshare.&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;div id=&quot;__ss_13502103&quot; style=&quot;width: 595px;&quot;&gt;
&lt;b style=&quot;display: block; margin: 12px 0 4px;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/KBA3AP/windows-azure-scaling-caching-and-performance&quot; target=&quot;_blank&quot; title=&quot;Windows Azure. Scaling, Caching and Performance&quot;&gt;Windows Azure. Scaling, Caching and Performance&lt;/a&gt;&lt;/b&gt; &lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;497&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/13502103?rel=0&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC;&quot; width=&quot;595&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;/center&gt;
&lt;br /&gt;
Для загрузки практической части можно воспользоваться следующей ссылкой: &lt;a href=&quot;https://skydrive.live.com/redir?resid=B5F30232C20B4EC1%21557&amp;amp;authkey=%21AM6mSxPpQVHKBk0&quot; target=&quot;_blank&quot;&gt;Windows Azure Caching Service&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/5473522091457117373/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/5473522091457117373' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/5473522091457117373'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/5473522091457117373'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/06/windows-azure_4510.html' title='Тренинг по Windows Azure. Масштабирование и кеширование.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-3656988139132894175</id><published>2012-06-30T06:06:00.002-07:00</published><updated>2012-06-30T06:06:34.599-07:00</updated><title type='text'>Тренинг по Windows Azure. Безопасность и диагностика.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Третий день был целиком и полностью посвящен безопасности приложений в облаке и их диагностике. В течение занятия слушатели познакомились с уровнями безопасности, предлагаемые платформой, начиная от физической и заканчивая информационной. Во второй части занятия был рассмотрен облачный сервис Access Control Service, его предназначение и принципы работы. В заключительной части занятия были рассмотрены средства диагностирования приложений в облаке при помощи Windows Azure Diagnostics. &lt;/div&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;div id=&quot;__ss_13502081&quot; style=&quot;width: 595px;&quot;&gt;
&lt;b style=&quot;display: block; margin: 12px 0 4px;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/KBA3AP/windows-azure-security-and-diagnostics&quot; target=&quot;_blank&quot; title=&quot;Windows Azure Security and Diagnostics&quot;&gt;Windows Azure Security and Diagnostics&lt;/a&gt;&lt;/b&gt; &lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;497&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/13502081&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC;&quot; width=&quot;595&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;/center&gt;
&lt;br /&gt;
Для скачивания практической части можно воспользоваться следующей ссылкой: &lt;a href=&quot;https://skydrive.live.com/redir?resid=B5F30232C20B4EC1%21556&amp;amp;authkey=%21ANNIM7cR0jLwUk8&quot; target=&quot;_blank&quot;&gt;Windows Azure Security and Diagnostics&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/3656988139132894175/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/3656988139132894175' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3656988139132894175'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3656988139132894175'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/06/windows-azure_30.html' title='Тренинг по Windows Azure. Безопасность и диагностика.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-7753004822081397198</id><published>2012-06-30T05:52:00.001-07:00</published><updated>2012-06-30T05:53:58.566-07:00</updated><title type='text'>Тренинг по Windows Azure. Windows Azure Storage.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Второй день был посвящен хранилищу данных в Windows Azure. В течение занятия кратко рассмотрели варианты реализации реляционной и нереляционной моделей в Windows Azure. Большая часть занятия была посвящена Windows Azure Storage, а если конкретнее, то такими популярным абстракциям как Blobs, Tables, Queues, Drives. &lt;/div&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;div id=&quot;__ss_13501951&quot; style=&quot;width: 595px;&quot;&gt;
&lt;b style=&quot;display: block; margin: 12px 0 4px;&quot;&gt;&lt;a href=&quot;http://www.slideshare.net/KBA3AP/windows-azure-storage-13501951&quot; target=&quot;_blank&quot; title=&quot;Windows Azure Storage&quot;&gt;Windows Azure Storage&lt;/a&gt;&lt;/b&gt; &lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;497&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/13501951?rel=0&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC;&quot; width=&quot;595&quot;&gt;&lt;/iframe&gt; &lt;/div&gt;
&lt;/center&gt;&lt;/div&gt;
Скачать практическую часть можно по следующей ссылке: &lt;a href=&quot;https://skydrive.live.com/redir?resid=B5F30232C20B4EC1%21555&amp;amp;authkey=%21AAyVcM6R0PnxXu0&quot; target=&quot;_blank&quot;&gt;Windows Azure Storage Demo&lt;/a&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/7753004822081397198/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/7753004822081397198' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7753004822081397198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7753004822081397198'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/06/windows-azure-windows-azure-storage.html' title='Тренинг по Windows Azure. Windows Azure Storage.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-128218344360051417</id><published>2012-06-30T05:38:00.002-07:00</published><updated>2012-06-30T05:38:38.690-07:00</updated><title type='text'>Тренинг по Windows Azure. Обзор платформы и жизненный цикл приложения</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем! Совсем недавно я прочитал тренинг, посвященный платформе Windows Azure. Тренинг проходил на базе Харьковского Национального Университета Радиоэлектроники. Желающих послушать присутствовать было на удивление очень много, но к сожалению Microsoft Innovation Center принять всех не смог. Занятия были разбиты на 4 дня по 2 часа каждое. И сегодня я начинаю публикацию материалов и презентаций.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Первый день был вводным. В течение занятия было рассказано о облачных вычислениях и платформе Windows Azure. Во второй части доклада больший упор был сделан на жизненном цикле облачного приложения. Презентацию можно посмотреть чуть ниже, а скачать на сайте Slideshare&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;div id=&quot;__ss_13501816&quot; style=&quot;width: 595px;&quot;&gt;
&lt;iframe allowfullscreen=&quot;&quot; frameborder=&quot;0&quot; height=&quot;497&quot; marginheight=&quot;0&quot; marginwidth=&quot;0&quot; scrolling=&quot;no&quot; src=&quot;http://www.slideshare.net/slideshow/embed_code/13501816&quot; style=&quot;border-width: 1px 1px 0; border: 1px solid #CCC;&quot; width=&quot;595&quot;&gt;&lt;/iframe&gt;&lt;/div&gt;
&lt;/center&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/128218344360051417/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/128218344360051417' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/128218344360051417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/128218344360051417'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/06/windows-azure.html' title='Тренинг по Windows Azure. Обзор платформы и жизненный цикл приложения'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-1005076416366310616</id><published>2012-05-19T06:55:00.002-07:00</published><updated>2012-05-19T06:55:32.649-07:00</updated><title type='text'>Uneta 18.05.2012. Материалы доклада.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
18-го мая в Харькове прошла очередная встреча юзер-группы Uneta, на которой я выступал в качестве докладчика с темой &quot;Высокопроизводительные приложения на базе Windows Azure. Пример реального проекта&quot;. Несмотря на теплый майский вечер встречу посетило достаточно много IT-людей. В течение своего доклада я рассказал о примере запуска нашей компанией высоконагруженного проекта &lt;a href=&quot;http://sqlserverlaunch.com/&quot;&gt;SQL Server Launch&lt;/a&gt;. И хотя доклад получился относительно коротким, надеюсь он понравился слушателям и принес немало пользы. Посмотреть или скачать презентацию заново можно на сервис Slideshare, куда я заблаговременно ее загрузил.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;object height=&quot;355&quot; id=&quot;__sse12992658&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=highloadedwebapps-windowsazure-120519084031-phpapp02&amp;stripped_title=windows-azure-12992658&amp;userName=KBA3AP&quot; /&gt;


&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;


&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;


&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;/&gt;


&lt;embed name=&quot;__sse12992658&quot; src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=highloadedwebapps-windowsazure-120519084031-phpapp02&amp;stripped_title=windows-azure-12992658&amp;userName=KBA3AP&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;center&gt;&lt;/center&gt;&lt;/center&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/1005076416366310616/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/1005076416366310616' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1005076416366310616'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1005076416366310616'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/05/uneta-18052012.html' title='Uneta 18.05.2012. Материалы доклада.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-7150390035319088265</id><published>2012-04-17T14:54:00.000-07:00</published><updated>2012-04-17T15:00:10.023-07:00</updated><title type='text'>Анонсирован новый набор Azure-сервисов по работе с медиа контентом</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Совсем недавно на официальном блоге Скота Гатри был анонсирован новый набор облачных сервисов по работе с медиа контентом. Новая услуга будет распространяться согласно модели PaaS и будет предоставлять пользователям возможности по построению и доставке эффективных медиа-решений конечным пользователям. Наиболее распространенные сценарии применения новой услуги представлены на рисунке ниже (взято с официального сайта &lt;a href=&quot;http://windowsazure.com/&quot;&gt;http://windowsazure.com&lt;/a&gt;)&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://lh6.ggpht.com/-RrDL1K3Gbtc/T43lkHsU6NI/AAAAAAAAAZ4/E4upGyX0eGg/s1600-h/MediaServicesArch%25255B6%25255D.png&quot;&gt;&lt;img alt=&quot;MediaServicesArch&quot; border=&quot;0&quot; height=&quot;457&quot; src=&quot;http://lh3.ggpht.com/-clDHMEAz5gk/T43llcDERAI/AAAAAAAAAaA/FKD_wGo_8Wo/MediaServicesArch_thumb%25255B4%25255D.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom: 0px; border-left: 0px; border-right: 0px; border-top: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;MediaServicesArch&quot; width=&quot;624&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
Контент может доставляться к любым клиентам, начиная от HTML5, Silverlight, Flash и заканчивая Windows 8, IPad, Android и WP7. При этом поддерживаются различные варианты стриминга содержимого – Smooth Streaming, Http Live Streaming и Flash Media Streaming. Услугу можно будет использовать для построения как облачных решений так и гибридных, в которых будет использоваться лишь небольшая часть функциональности медиа сервисов (примером, может послужить загрузка видео-файлов для последующей конвертации в различные форматы и распространения их через системы доставки контента). Построена услуга на базе популярной медиа платформы Microsoft (&lt;a href=&quot;http://www.microsoft.com/en-us/mediaplatform/&quot; title=&quot;http://www.microsoft.com/en-us/mediaplatform/&quot;&gt;http://www.microsoft.com/en-us/mediaplatform/&lt;/a&gt;). Среди большого списка заявленных возможностей хотелось бы отметить следующие:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Кодирование&lt;/b&gt;. Сервисом поддерживается целый набор кодеков и форматов кодирования видео, включая Smooth Streaming, HTTP Live Streaming, MPEG-DASH и Flash. Кроме того у разработчика всегда есть возможность воспользоваться либо встроенным декодером Windows Azure Media Encoder либо любым другим внешним решением.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Конвертирование&lt;/b&gt;. Сервис предлагает ряд средств по конвертации медиа-файлов в любой формат. При этом процесс абсолютно прозрачен и контролируем.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Защита содержимого&lt;/b&gt;. Система поддерживает такие глобально известные системы по защите медиа-содержимого как MPEG Common Encryption и Microsoft PlayReady, с помощью которых Вы можете с легкостью добавлять DRM-подобную защиту к вашему содержимому.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Стриминг содержимого по требованию&lt;/b&gt;. Системой поддерживается доставка контента при помощи Windows Azure CDN, а также при помощи сторонних сетей доставки содержимого. При этом, как всегда в облаке, обеспечиваются широкие возможности по масштабированию таких решений.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Живой стриминг (Live Streaming).&lt;/b&gt; При помощи Azure медиа сервисов каждый разработчик сможет создавать свои собственные live-стриминг каналы, используя такие возможности платформы как DVR и Instant Replay&lt;/li&gt;
&lt;/ul&gt;
В общем звучит это очень интересно и загадочно. Пока что медиа сервисы находятся в стадии CTP, но уже сейчас их можно попробовать (подробности получения доступа можно прочитать на блоге Скота Гатри). &lt;br /&gt;
Если кого-то заинтересовала новая функциональность платформы, то поверхностно можно ознакомиться с ней по следующим ссылкам:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://weblogs.asp.net/scottgu/archive/2012/04/16/announcing-windows-azure-media-services.aspx&quot; title=&quot;http://weblogs.asp.net/scottgu/archive/2012/04/16/announcing-windows-azure-media-services.aspx&quot;&gt;http://weblogs.asp.net/scottgu/archive/2012/04/16/announcing-windows-azure-media-services.aspx&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://www.windowsazure.com/en-us/home/features/media-services/&quot; title=&quot;https://www.windowsazure.com/en-us/home/features/media-services/&quot;&gt;https://www.windowsazure.com/en-us/home/features/media-services/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
Ждем более подробного описания услуги ибо заявленная функциональность впечатляет и однозначно будет востребована на рынке разработки программного обеспечения. &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/7150390035319088265/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/7150390035319088265' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7150390035319088265'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/7150390035319088265'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/04/azure.html' title='Анонсирован новый набор Azure-сервисов по работе с медиа контентом'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh3.ggpht.com/-clDHMEAz5gk/T43llcDERAI/AAAAAAAAAaA/FKD_wGo_8Wo/s72-c/MediaServicesArch_thumb%25255B4%25255D.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-6691481395864928710</id><published>2012-04-09T14:45:00.001-07:00</published><updated>2012-04-09T14:45:31.755-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Fault Handling"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><category scheme="http://www.blogger.com/atom/ns#" term="Отказоустойчивость"/><title type='text'>Повышение отказоустойчивости облачных приложений при помощи Transient Fault Handling Block.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем ! Сегодня речь пойдет об отказоустойчивости облачных приложений. В принципе механизм, который будет рассматриваться в сегодняшней публикации, не новый. Мы все его прекрасно знаем – это обработка временных сбоев программы при помощи Retry Logic. Данная техника славится своей простотой и высокой надежностью. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
В процессе написания облачного приложения, программист сталкивается с большим количеством программных сбоев, особое место среди которых занимают так называемые временные сбои. Это могут быть как проблемы с сетевой коммуникацией, так и проблемы связанные с определенными ограничениями используемого сервиса. Вероятность появления такого рода ошибок в облаке возрастает в разы, так как каждый сервис, предоставляемый платформой, содержит ряд ограничений. Например, в &lt;b&gt;Azure Caching&lt;/b&gt; сервисе присутствует целый ряд ограничений, начиная от количества транзакций в час и заканчивая максимально допустимым количеством одновременных соединений (&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/hh697522.aspx#C_BKMK_FAQ8&quot; title=&quot;http://msdn.microsoft.com/en-us/library/windowsazure/hh697522.aspx#C_BKMK_FAQ8&quot;&gt;http://msdn.microsoft.com/en-us/library/windowsazure/hh697522.aspx#C_BKMK_FAQ8&lt;/a&gt;). Если ваше приложений превысит установленную квоту – сработает так называемый механизм тротлинга (throttling). При этом в приложении выскочит исключение, что естественно не порадует конечного пользователя. Как правило подобного рода сбои носят временный характер и если повторить операцию через определенный промежуток времени – она завершится успешно. Учитывая тот факт, что все облачные сервисы содержат ряд квот – данная проблема становится очень актуальной и важной. &lt;br /&gt;
Именно для решения подобного вида проблем командой &lt;b&gt;Microsoft Patterns&amp;amp;Practices&lt;/b&gt; был разработан модуль библиотеки &lt;b&gt;Enterprise Library&lt;/b&gt;, именуемый &lt;b&gt;Thransient Fault Handling Application Block&lt;/b&gt;. Этот блок повышает отказоустойчивость вашего приложения путем предоставления механизмов для обработки временных сбоев. Блок доступен через NuGet, подключить его к вашему проекту можно при помощи следующей команды:&lt;br /&gt;
&lt;br /&gt;
&lt;pre class=&quot;brush:plain&quot;&gt;Install-Package EnterpriseLibrary.WindowsAzure.TransientFaultHandling&lt;/pre&gt;
&lt;br /&gt;
Блок оперирует таким понятием как &lt;b&gt;стратегия&lt;/b&gt;. Стратегия позволяет блоку, во-первых, определить действительно ли сбой связан с временной проблемой, а во-вторых, предоставляет наилучший способ решения этой проблемы. На сегодняшний день вместе с блоком поставляются 4 стратегии для 4-х облачных сервисов:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;SQL Azure &lt;/li&gt;
&lt;li&gt;Windows Azure Service Bus &lt;/li&gt;
&lt;li&gt;Windows Azure Storage Service &lt;/li&gt;
&lt;li&gt;Windows Azure Caching Service&lt;/li&gt;
&lt;/ul&gt;
Способ решения временных сбоев у блока один – это повторное выполнение операции. Он позволяет настроить интервал времени, по прошествии которого операция будет повторно выполнена. По умолчанию поддерживаются 3 варианта формирования временного отрезка:&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/-wVtxPhsyLHw/T4NS6gH0d-I/AAAAAAAAAZg/5CGXQSdnfh4/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Transient Fault Handling Application Block&quot; border=&quot;0&quot; height=&quot;409&quot; src=&quot;http://lh5.ggpht.com/-_KMfnN9DZD4/T4NS7UC04nI/AAAAAAAAAZo/MkzLivB_FaI/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Transient Fault Handling Application Block&quot; width=&quot;208&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
Кроме того блок позволяет настроить собственную политику формирования временных интервалов, а также механизмы определения временных сбоев, что предоставляет нам прекрасные возможности по расширению этого полезного модуля Enterprise Library. &lt;br /&gt;
Познакомившись с предназначением блока и с принципами его функционирования, давайте посмотрим как программно можно его использовать для повышения отказоустойчивости приложений, использующих SQL Azure.&lt;br /&gt;
&amp;nbsp;SQL Azure, как и многие другие, сервисы Windows Azure содержит ряд ограничений и квот, нарушение которых будет вести к &quot;падениям&quot; ваших приложений. Немного поискав в Интернете список ограничений SQL Azure я наткнулся на следующую табличку:&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; style=&quot;width: 100%;&quot;&gt;&lt;tbody&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Throttling type&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Soft Throttling limit exceeded&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Hard Throttling limit exceeded&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
Temporary disk space problem occurred&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x01&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x02&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
Temporary log space problem occurred&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x04&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x08&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
High-volume transaction/write/update activity exists&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x10&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x20&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
High-volume database input/output (I/O) activity exists&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x40&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x80&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
High-volume CPU activity exists&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x100&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x200&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
Database quota exceeded&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x400&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x800&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
Too many concurrent requests occurred&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x4000&lt;/div&gt;
&lt;/td&gt;&lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
0x8000&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
То есть, например, если наше приложение открыло “тяжелый” курсор на сервере и он стал “пожирать” процессорное время – мы получим в приложении ошибку с кодом 0х100 (на самом деле код ошибки будем немного другим, но нас сейчас это не сильно интересует), на которую необходимо как-то реагировать. Первый и самый простой вариант – это попробовать заново выполнить неудачную операцию. И сделаем мы это при помощи Transient Fault Handling Application Block. Блок содержит в себе механизмы, применимые как к чистому ADO.NET так и к Entity Framework. Вот пример, как изменить программный код с целью добавления логики повторного выполнения неудачной операции:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;RetryPolicy retryPolicy = new RetryPolicy‹SqlAzureTransientErrorDetectionStrategy›(3, TimeSpan.FromSeconds(30));
using (ReliableSqlConnection connection = new ReliableSqlConnection(connectionString, retryPolicy, retryPolicy))
{
    try
    {
        connection.Open();
        using (var command = connection.CreateCommand())
        {
            command.CommandText = &quot;SELECT * FROM Employees&quot;;
            using (var rdr = cnn.ExecuteCommand‹IDataReader›(cmd))
            {
                //
            }
        }
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message.ToString());
    }
}&lt;/idatareader&gt;&lt;/pre&gt;
Как мы видим необходимо лишь задать политику и изменить стандартный класс SQLConnection на ReliableSqlConnection. В данном случае наша политика гласит: “Использовать стратегию определения временных падений SQL Azure. В случае неудачной операции – попробовать выполнить ее снова. Количество попыток равно 3. Интервал между попытками равен 30 секундам. В случае, если ничего не получится – передать исключение внешнему коду”. Похожим образом можно добавить логику повторных операций для приложений, использующих Entity Framework в качестве слоя для доступа к данным:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using (NorthwindEntities dc = new NorthwindEntities())
{
    RetryPolicy myPolicy = new RetryPolicy‹SqlAzureTransientErrorDetectionStrategy›(3);
    Employee e1 = myPolicy.ExecuteAction‹Employee›(() =&amp;gt;
        (from x in dc.Employees
            where x.LastName == &quot;King&quot;
            select x).First());
}&lt;/employee&gt;&lt;/pre&gt;
В данном случае мы снова создаем политику (логика работы такая же как и в предыдущем случае, так как 30-секундный интервал используется блоком по умолчанию). Но сам код немного изменился по сравнению с предыдущим случаем. Процесс создания контекста не изменился, изменился способ выполнения запроса. Он оборачивается методом политики &lt;b&gt;ExecuteAction, &lt;/b&gt;принимающий в качестве параметра &lt;b&gt;Action&lt;/b&gt;.
Если запрос по каким-то причинам не выполнится, инфраструктура блока попробует запустить его заново по прошествии 30 секунд.
&lt;br /&gt;
Как видим техника использования Transient Fault Handling Application Block довольно таки проста и понятна. Поэтому если в приложении вы используете вышеперечисленные Azure-сервисы (Storage, Service Bus, Caching, SQL Azure), не задумываясь прикручивайте retry-логику к нему – это сделает ваше приложение более отказоустойчивым, а ваши ночи более спокойными :)&lt;br /&gt;
Спасибо за внимание ! Надеюсь этот пост был для вас полезным.&lt;br /&gt;
&lt;br /&gt;
Несколько ссылок для более глубокого знакомства с Transient Fault Handling Application Block:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/hh680943%28v=pandp.50%29.aspx&quot; target=&quot;_blank&quot;&gt;Реализация кастомной Retry-логики&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/hh680900%28v=pandp.50%29.aspx&quot; target=&quot;_blank&quot;&gt;Определение Retry-логики в конфигурации&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/hh680934%28v=pandp.50%29.aspx&quot; target=&quot;_blank&quot;&gt;Страничка Transient Fault Handling App Block на MSDN&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/6691481395864928710/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/6691481395864928710' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6691481395864928710'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/6691481395864928710'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/04/transient-fault-handling-block.html' title='Повышение отказоустойчивости облачных приложений при помощи Transient Fault Handling Block.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-_KMfnN9DZD4/T4NS7UC04nI/AAAAAAAAAZo/MkzLivB_FaI/s72-c/Image.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-4572237870440140436</id><published>2012-04-08T15:00:00.000-07:00</published><updated>2012-04-08T15:01:20.614-07:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Datacenter"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Новые центры обработки данных Windows Azure</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем ! Буквально на днях (5 апреля) в семействе датацентров Windows Azure произошло пополнение – были добавлены 2 новых датацентра. Новые центры обработки данных расположены в США. На портале разработчика их можно увидеть под именами &lt;b&gt;West US&lt;/b&gt; и &lt;b&gt;East US. &lt;/b&gt;На сегодняшний день новые центры доступны для сервисов Azure Compute и Azure Storage. В течение нескольких последующих месяцев обещают добавить поддержку новых датацентров в SQL Azure. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Что касается гео-репликации, то американские датацентры будут сгруппированы следующим образом:&lt;br /&gt;
&lt;ul&gt;
&lt;li&gt;US East и West &lt;/li&gt;
&lt;li&gt;US North и South&lt;/li&gt;
&lt;/ul&gt;
Как я говорил, новые датацентры уже доступны на девелоперском портале, поэтому можно прямо сейчас начать их тестировать. Прайсинговая модель не изменилась и распространяется она, как и прежде, на все центры обработки данных Windows Azure. Официальный анонс данного события можно найти по данной &lt;a href=&quot;http://blogs.msdn.com/b/windowsazure/archive/2012/04/05/announcing-new-datacenter-options-for-windows-azure.aspx&quot; target=&quot;_blank&quot;&gt;ссылке&lt;/a&gt;&lt;br /&gt;
Спасибо ! &lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/4572237870440140436/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/4572237870440140436' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4572237870440140436'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4572237870440140436'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/04/windows-azure.html' title='Новые центры обработки данных Windows Azure'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-3828446737846196645</id><published>2012-03-26T13:14:00.003-07:00</published><updated>2012-03-26T13:37:21.757-07:00</updated><title type='text'>Как я выступал на MSSWIT 2012</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем ! Давно я не писал в свой блог. Пора исправлять эту ситуацию, тем более повод появился очень значимый,а именно мое выступление на MSSWIT 2012. Если говорить о том, когда я узнал о своем выступлении, то это произошло приблизительно 2 месяца назад. И хотя тема для меня была выбрана не профильная (я все же больше ожидал темы по Windows Azure, так как являюсь экспертом в данной области), отказываться от выступления на таком масштабном мероприятия было бы глупо. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Поэтому сбор информации с моей стороны начался сразу же после извещения о моем участии в конференции. Тема была связана с HTML5 WebSockets и WebWorkers, что сразу меня несколько обрадовало, так как я слышал, что это интереснейшие технологии, которые могут править Вебом в будущем. В процессе подготовки я не один раз в этом убедился :)&lt;br /&gt;
&lt;br /&gt;
Что касается самого доклада, то он прошел увы не без проблем. О чем говорить,если сама моя поездка началась с приключений на поезде. Был куплен неправильный билет, поэтому пришлось его в экстренном порядке менять и бежать на отправляющийся поезд ! Сама презентация также была омрачена сразу несколькими проблемами. Во-первых каким-то чудом сломалась первая демонстрация функциональности веб-сокетов, причем прогонялась она дома с десяток раз :(( Позднее, уже после доклада, ее удалось снова магическим способом запустить без каких-либо изменений, поэтому все мои подозрения упали на презентер. По-видимому он блокирует 80-й порт, что не позволяет IIS нормально обрабатывать запросы. Вторая проблема возникла&amp;nbsp; в середине доклада, когда внезапно сломался микрофон, к счастью у админов нашелся запасной !&lt;br /&gt;
&lt;br /&gt;
В целом надеюсь мой доклад несмотря на ряд проблем, слушателям понравился и принес немало пользы. Вот собственно сама презентация:&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;center&gt;
&lt;div id=&quot;__ss_12164836&quot; style=&quot;width: 425px;&quot;&gt;
&lt;object height=&quot;355&quot; id=&quot;__sse12164836&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=html5websocketsupdatedlayout-120326150214-phpapp02&amp;stripped_title=html5-websockets-and-webworkers&amp;userName=KBA3AP&quot; /&gt;




&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;




&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;




&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;/&gt;




&lt;embed name=&quot;__sse12164836&quot; src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=html5websocketsupdatedlayout-120326150214-phpapp02&amp;stripped_title=html5-websockets-and-webworkers&amp;userName=KBA3AP&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/div&gt;
&lt;/center&gt;
&lt;/div&gt;
&lt;br /&gt;
По данной ссылке можно скачать исходные коды демонстраций (а их было 3, включая демонстрацию работы веб-сокетов, веб-воркеров и библиотеки SignalR):&lt;br /&gt;
&lt;a href=&quot;http://dl.dropbox.com/u/18522369/WebSockets.zip&quot; target=&quot;_blank&quot;&gt;Забрать демо&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
&amp;nbsp;Спасибо организаторам за прекрасную конференцию и моим слушателям, которые проявили недюжинный интерес к технологии, несмотря на определенные проблемы, возникавшие во время доклада :)&lt;br /&gt;
&lt;br /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/3828446737846196645/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/3828446737846196645' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3828446737846196645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/3828446737846196645'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/03/msswit-2012.html' title='Как я выступал на MSSWIT 2012'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-1379707456595801612</id><published>2012-01-12T14:44:00.000-08:00</published><updated>2012-01-13T02:44:29.531-08:00</updated><title type='text'>Я пополнил ряды MVP !</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
Привет всем ! Сегодня ко мне наконец-то добралась моя посылка от Microsoft, подтвердившая звание Windows Azure MVP. И хотя я узнал о номинации еще в начале января - все ждал пока прибудет мой MVP Kit, чтобы официально запостить эту информацию в своем блоге. 
Для меня это первая номинация поэтому она самая волнующая. &lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Мой путь к MVP был достаточно долгим, учитывая тот факт, что впервые я познакомился с платформой еще в университете, когда выполнял курсовую работу с использованием облака (тогда еще платформа была в стадии CTP и работала через пень-колоду). Еще тогда для меня это было очень интересным - прикоснуться к совершенно новой модели построения и распространения приложений. И сейчас, когда мы уже видим как облачные технологии медленно но уверенно становятся доминирующей силой на рынке, я нисколько не жалею что выбрал именно эту экспертизу. Хотелось бы отдельно поблагодарить &lt;a href=&quot;http://www.linkedin.com/pub/denis-reznik/3/502/234&quot; target=&quot;_blank&quot;&gt;Дениса Резника&lt;/a&gt; и &lt;a href=&quot;http://ua.linkedin.com/in/vladimirleshchinsky&quot; target=&quot;_blank&quot;&gt;Владимира Лещинского&lt;/a&gt;, которые помогали советами и направляли в нужное русло, а также вас - читателей моего блога, также отыгравшим немаловажную роль в получении МVP. Обещаю быть достойным такого звания и продолжать предоставлять сообществу интересную информацию о Windows Azure. See you in 2012 !&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;separator&quot; style=&quot;clear: both; text-align: center;&quot;&gt;
&lt;/div&gt;
&lt;table&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;td width=&quot;50%&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyIfCylaf3tNzVp6i5tDPAmCHhek3pl8ckanqK3Lk9MRllsoCrcB7Z3fmBFypWVzzvQGSGqVTx5hMKvBnqX2hisxyenHDCVKdG1k1fY1lmt48UxmOC61DZE011iGkPmD532dLJO2ItD3_A/s1600/IMG_2192.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: left; float: left; margin-bottom: 1em; margin-right: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyIfCylaf3tNzVp6i5tDPAmCHhek3pl8ckanqK3Lk9MRllsoCrcB7Z3fmBFypWVzzvQGSGqVTx5hMKvBnqX2hisxyenHDCVKdG1k1fY1lmt48UxmOC61DZE011iGkPmD532dLJO2ItD3_A/s320/IMG_2192.JPG&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;td width=&quot;50%&quot;&gt;&lt;a href=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvoYlsPqo5AZ6x4Hxu0n1aeebiCnJwoQHoaBeKim9Uj5Bh3UAJzd1uCjHwdn7cunSL_WRFKlo_1BMu_GVJYpM9fiTx31ftxiU0CTGWKB1FsnXKjDq9jsfW87Jd8oNMerqKwFtkFgKvdU0/s1600/IMG_2194.JPG&quot; imageanchor=&quot;1&quot; style=&quot;clear: right; float: right; margin-bottom: 1em; margin-left: 1em;&quot;&gt;&lt;img border=&quot;0&quot; height=&quot;320&quot; src=&quot;https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHvoYlsPqo5AZ6x4Hxu0n1aeebiCnJwoQHoaBeKim9Uj5Bh3UAJzd1uCjHwdn7cunSL_WRFKlo_1BMu_GVJYpM9fiTx31ftxiU0CTGWKB1FsnXKjDq9jsfW87Jd8oNMerqKwFtkFgKvdU0/s320/IMG_2194.JPG&quot; width=&quot;240&quot; /&gt;&lt;/a&gt;
&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/1379707456595801612/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/1379707456595801612' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1379707456595801612'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/1379707456595801612'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2012/01/mvp.html' title='Я пополнил ряды MVP !'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiyIfCylaf3tNzVp6i5tDPAmCHhek3pl8ckanqK3Lk9MRllsoCrcB7Z3fmBFypWVzzvQGSGqVTx5hMKvBnqX2hisxyenHDCVKdG1k1fY1lmt48UxmOC61DZE011iGkPmD532dLJO2ItD3_A/s72-c/IMG_2192.JPG" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-2330338726498221305</id><published>2011-12-24T11:44:00.001-08:00</published><updated>2011-12-24T12:13:21.799-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Amazon Web Services"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Windows Azure &amp;amp; Amazon Web Services. Сравнительная характеристика.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем ! Сегодня я попытаюсь дать сравнительную характеристику двух гигантов облачного рынка, а именно Windows Azure и Amazon Web Services. В процессе своей работы мне приходилось выполнять проекты, основанные как на одной так и на другой технологии, поэтому идея составить сравнительную характеристику назревала уже довольно таки давно. После анализа большого количества подобных материалов в Интернете, а также основываясь на личном опыте и помощи одного из Windows Azure MVP и было принято решение написать этот пост.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;&lt;br /&gt;
Как мы все знаем обе платформы были введены в эксплуатацию сравнительно недавно (AWS в 2006, Windows Azure в 2008-м), услугами обеих платформ пользуются всемирно известные корпорации (чего стоят только NASA, Ericsson, T-Mobile, Boeing и другие), обе платформы позиционируют себя как лидера в сфере облачных вычислений поэтому их сравнение является едва ли не самой важной альтернативой, позволяющей оценить уровень предоставляемых услуг. Сравнение будет организовано в виде описания основных категорий в сфере облачных вычислений и описания того как та или иная категория реализована в AWS и Windows Azure&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Стратегия развития&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
И начнем мы с наиболее важного как я считаю аспекта – это стратегии развития. Как нам всем известно на сегодняшний день облачные провайдеры умеют предоставлять свои услуги по 3-м схемам – это IaaS, PaaS и SaaS. Углубляться в описание данных терминов я не стану так как они уже “изжеваны” по всей Сети, скажу лишь то, что AWS предоставляет свои услуги по схеме IaaS, Windows Azure в свою очередь по схеме PaaS и этим они кардинально отличаются. Хотя обе платформы делают определенные сподвижки в сторону других схем, их первоначальная “природа” остается той же.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Соглашения о уровне предоставляемых услуг&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Обе платформы предоставляют своим клиентам SLA`s, гарантирующие высокий уровень услуг (вычислительные мощности доступны в течение 99,95 % времени, для других сервисов гарантируется доступность в течение 99,9 % общего времени).&lt;br /&gt;
&lt;br /&gt;
&lt;span style=&quot;font-size: small;&quot;&gt;&lt;b&gt;Масштабируемость&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;
Как Windows Azure так и Amazon Web Services поддерживают автоматическое масштабирование. Это касается как горизонтального (повышение производительности решения за счет увеличения количества виртуальных инстансов, что позволяет распределить полезную нагрузку и тем самым значительно повысить общую производительность системы) так и вертикального масштабирования (увеличение производительности системы за счет добавления ресурсов к отдельным виртуальным машинами, например. за счет увеличения объема оперативной памяти). Помимо горизонтального масштабирования вычислительных мощностей Windows Azure поддерживает масштабирование баз данных за счет технологии Federations, доступной при использовании сервиса SQL Azure. Кроме того существуют решения. позволяющие упростить процесс наращивания ресурсов. У Амазона это Auto Scaling Service, у Windows Azure – Auto-Scaling Application Block.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Дополнительные возможности&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Кроме базовых сервисов (аренда вычислительных мощностей и хранилищ данных) обе платформы предоставляют набор дополнительных услуг. Здесь преимущество остается за Windows Azure, так как список таких сервисов значительно шире&lt;br /&gt;
&lt;br /&gt;
&lt;table align=&quot;center&quot; border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;AWS&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Windows Azure&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt;&lt;ul&gt;
&lt;li&gt;Amazon DevPay – простой сервис биллинга и управления аккаунтом  &lt;/li&gt;
&lt;li&gt;Amazon Marketplace Web Service – сервис благодаря которому продавцы имеют возможность повысить эффективность продаж и качество взаимодействия с клиентами  &lt;/li&gt;
&lt;li&gt;Public Data Sets – централизованный репозиторий открытых данных (включая человеческий геном и статистику посещений портала Wikipedia)&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;50%&quot;&gt;&lt;ul&gt;
&lt;li&gt;Сервисы Bing  &lt;ul&gt;
&lt;li&gt;Bing API  &lt;/li&gt;
&lt;li&gt;Bing Maps&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Онлайн сервисы  &lt;ul&gt;
&lt;li&gt;Exchange Online  &lt;/li&gt;
&lt;li&gt;Sharepoint Online  &lt;/li&gt;
&lt;li&gt;Lync Online  &lt;/li&gt;
&lt;li&gt;Office 365&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Windows Live  &lt;ul&gt;
&lt;li&gt;Skydrive  &lt;/li&gt;
&lt;li&gt;Photogallery  &lt;/li&gt;
&lt;li&gt;Messenger&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Вычислительные мощности&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Обе платформы предоставляют довольно таки широкий спектр размеров виртуальных машин, начиная от микро инстансов и заканчивая чрезвычайно мощными экземплярами. Сравнить предложения от Amazon и Microsoft можно при помощи следующей таблички&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Amazon Web Services&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Windows Azure&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Micro-инстанс&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Micro instance&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Extra-Small instance&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Стандартные предложения&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Small, Large, Extra Large&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Small, Medium, Large, Extra Large&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Память&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
От 1,7 Гб до 15 Гб&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
От 1,7 Гб до 14 Гб&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Процессор&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
От 1 до 4-х ядер&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
От 1 до 8-ми ядер&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Специальные предложения&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
High-memory, High-CPU, Cluster&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Операционные системы&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Linux, Windows Server&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Server&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Хранилища данных&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Обе платформы поддерживают популярные на сегодняшний день системы хранения данных, включая как стандартные реляционные так и NoSQL-решения.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Amazon Web Services&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Windows Azure&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Blob/Object хранилище&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Размер одного объекта в Amazon S3 не может превышать 5 Тб. Нет ограничений на общий объем данных и количество объектов&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Размер одного объекта не может превышать 200 Гб (блочный блоб) и 1 Тб (страничный блоб). Размер всех объектов одного аккаунта не может превышать 100 Тб, на количество таких аккаунтов ограничений не существует&lt;br /&gt;
* Поддерживается гео-репликация данных, что позволяет значительно повысить надежность хранения данных&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Табличное хранилище&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
В Amazon SimpleDB нет ограничения на количество записей. Таблицы организуются в “домены”, размер которых не может превышать 10 Гб. На количество “доменов“ ограничений не существует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
В Windows Azure Table Storage не существует ограничений на количество записей. Запись может иметь до 255 полей и не может превышать 1 Мб&amp;nbsp; размере. Размер объектов в одном аккаунте не может превышать 100 Тб. Нет ограничений на количество аккаунтов&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Реляционное хранилище&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
В данной категории у AWS существует довольно таки интересное предложение. Платформа предлагает клиентам 2 варианта запуска реляционного движка в облаке: управляемый и неуправляемый. В случае использования неуправляемого варианта вам предоставляются на выбор готовые образы (так называемые Application Machine Images) с уже предустановленными СУБД (поддерживаются IBM DB2, Oracle, MySQL, SQL Server Express, SQL Server Standart, Postgres, Syba). После выбора конкретного образа с него запускается виртуальная машина и ваша СУБД становится доступной. Так как сами виртуальные машины непостоянны и им требуется внешнее хранилище данных вам еще необходимо будет настроить Amazon EBS сервис для периодического сброса бекапов в хранилище. Второй подход – управляемый.&amp;nbsp; В этом случае используется сервис Amazon Relational Database Service, при котором для вас разворачивается СУБД MySQL либо Oracle и сама платформа уже берет на себя задачи по обновлению, репликации и хранению резервных копий. &lt;br /&gt;
Windows Azure предоставляет реляционный сервис SQL Azure. Разработчику нет необходимости инсталлировать и конфигурировать сервера, можно использовать аналогичную модель программирования под SQL Server. Протокол взаимодействия все тот же – TDS. Размер базы данных ограничен 150 Гб. Существует нативная поддержка шардинга базы данных при помощи технологии SQL Azure Federations, что позволяет поднять производительность до нереальных высот. Кроме того поддерживаются ряд вспомогательных и полезных сервисов: SQL Azure Reporting Services, SQL Azure DataSync и др.&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Высокопроизводительные вычисления&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Как правило для решения сложных научных, инженерных и бизнес задач требуется огромное количество одновременно работающих вычислительных центров, каждый из которых выполняет лишь часть работ но все вместе они решают одну задачу (примером может быть задачи молекулярного моделирования). Как AWS так и Windows Azure поддерживают высокопроизводительные вычисления. Amazon предоставляет специальный вид виртуальной машины, называемый Cluster Machine, что позволяет объединять инстансы в кластера и выполнять тяжелые вычисления. У Microsoft в свою очередь существует Windows Server HPC 2008 R2 позволяющий объединять собственные сервера с облачными виртуальными машинами&amp;nbsp; в любой пропорции для выполнения распределенных вычислений. Кроме того обе платформы поддерживают и значительно упрощают запуск такого популярного на сегодняшний день решения как Hadoop, что позволяет проводить в облачных условиях анализ больших объемов данных.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Разработка решений&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Обе платформы поддерживают большинство современных языков программирования, кроме того значительные инвестиции вливаются в разработку различного рода SDK, аддонов и плагинов к популярным средам разработки и т.д.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot; width=&quot;100%&quot;&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Amazon Web Services&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Windows Azure&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Портал разработчика&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Eclipse Tools&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Visual Studio Tools&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Java SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Мобильное SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
iOS, Android&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
iOS, Android, WP7&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;PHP SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Python SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Отсутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Ruby SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
.&lt;b&gt;NET SDK&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Присутствует&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Эмуляторы&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Большое преимущество здесь остается за Windows Azure так для локальной разработки предоставляется очень полезная и удобная среда (эмулируется как среда выполнения так и хранилище данных), максимально имитирующая облачную, чего нельзя сказать о Amazon Web Services.&lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Мониторинг состояния сервисов&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
AWS включает службу Amazon CloudWatch, позволяющую собирать и аггрегировать детальные метрики с EC2-инстансов, балансировщиков нагрузки, баз данных и т.д. &lt;br /&gt;
Windows Azure предоставляет специальную диагностическую подсистему, позволяющую мониторить, аггрегировать и хранить логи приложения, IIS логи, счетчики производительности, статистику базы данных и так далее. &lt;br /&gt;
&lt;br /&gt;
&lt;b&gt;&lt;span style=&quot;font-size: small;&quot;&gt;Скорость&lt;/span&gt;&lt;/b&gt;&lt;br /&gt;
Наверное одна из наиболее важных составляющих успеха той или иной платформы. Здесь безоговорочная победа Windows Azure. Независимые тесты производительности были проведены компанией Compuware с использованием их собственной утилиты CloudSleuth, дебютировавшей в этом году. Каждый может посмотреть результаты за последний месяц на сайте CloudSleuth &lt;a href=&quot;https://www.cloudsleuth.net/web/guest/global-provider-view&quot; title=&quot;https://www.cloudsleuth.net/web/guest/global-provider-view&quot;&gt;https://www.cloudsleuth.net/web/guest/global-provider-view&lt;/a&gt;. На этом же сайте можно также посмотреть модель тестирования облачных сервисов. На момент написания данного поста ситуация была следующей:&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh4.ggpht.com/-rcfbxqdwKKI/TvYrj8_2ySI/AAAAAAAAAXo/m8oDO1JBHfI/s1600-h/5.png&quot;&gt;&lt;img alt=&quot;Global Cloud Providers Performance&quot; border=&quot;0&quot; height=&quot;574&quot; src=&quot;http://lh5.ggpht.com/-zJU7BdtsObc/TvYrkckVvDI/AAAAAAAAAXw/wmYrlcZGeN4/_thumb3.png?imgmax=800&quot; style=&quot;background-image: none; border-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Global Cloud Providers Performance&quot; width=&quot;549&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;h5&gt;







&lt;/h5&gt;
Суммируя все вышеописанное можно составить итоговую таблицу по всем сервисам обеих платформ.&lt;br /&gt;
&lt;br /&gt;
&lt;table border=&quot;1&quot; cellpadding=&quot;2&quot; cellspacing=&quot;0&quot;&gt; &lt;tbody&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Категория&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Amazon Web Services&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
&lt;b&gt;Windows Azure&lt;/b&gt;&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Вычислительные мощности&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Вычисления&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon&amp;nbsp; Elastic Compute (EC2)&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Compute&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Высокопроизводительные&amp;nbsp;&amp;nbsp; вычисления&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon EC2 HPS Clusters&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows HPC Server&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Обработка данных&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Elastic MapReduce (Hadoop)&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Hadoop on Windows Azure Compute&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Авто масштабирование&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Auto Scaling, Elastic Beanstalk&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Scaling Application Block&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Распределенное кеширование&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon ElasticCache&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
AppFabric Caching&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Контент&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; CDN&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon CloudFront&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure CDN&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;База данных&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; NoSQL&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon SimpleDB&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Table Storage&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Реляционная база&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Relational DB Service&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
SQL Azure&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Репортинг&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
SQL Azure Reporting&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Синхронизация &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
SQL Azure DataSync&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Федерация &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
SQL Azure Federations&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Разворачивание&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; IaaS разворачивание&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Elastic Compute&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
VM Role&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; PaaS разворачивание&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Elastic Beanstalk&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Web/Worker Roles&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Массовый деплоймент&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
AWS CloudFormation&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Маркетплейс&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Маркетплейс приложений&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Custom App Catalog&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Marketplace&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Маркетплейс данных&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Marketplace&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Мониторинг и управление&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Мониторинг&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon CloudWatch&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Диагностическое API&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Ручное управление &lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
AWS Management Console&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Developer Portal&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Коммуникация&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Простая очередь&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Simple Queuing Service&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Queue Storage&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Продвинутая очередь&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Service Bus Queues&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Нотификация&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Simple Notification Service&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Service Bus&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Почта&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Simple Email Service&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Сеть&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Траффик менеджмент&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Route 53&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Traffic Manager&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; VPN/Гибридное облако&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Virtual Private Cloud, Direct Connect&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Connect&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Балансировка нагрузки&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Elastic Load Balancing&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Compute&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Безопасность&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Управление подлинностью&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
AppFabric Access Control Service&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;b&gt;Хранилище&lt;/b&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Блоб хранилище&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon S3&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Blob Storage&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Диски&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Elastic Block Storage&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Windows Azure Drives&lt;/div&gt;
&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; Импорт/экспорт медиа&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;div align=&quot;center&quot;&gt;
Amazon Import/Export&lt;/div&gt;
&lt;/td&gt; &lt;td valign=&quot;top&quot; width=&quot;33%&quot;&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
&lt;br /&gt;
Как видим по функциональности платформы сопоставимы, поэтому решение стоит принимать уже основываясь на требованиях проекта и четко понимая разницу между IaaS и PaaS принципами ! Спасибо за внимание, надеюсь публикация будет полезной !&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/2330338726498221305/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/2330338726498221305' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/2330338726498221305'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/2330338726498221305'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2011/12/windows-azure-amazon-web-services.html' title='Windows Azure &amp;amp; Amazon Web Services. Сравнительная характеристика.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-zJU7BdtsObc/TvYrkckVvDI/AAAAAAAAAXw/wmYrlcZGeN4/s72-c/_thumb3.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-4980071918919846320</id><published>2011-12-06T14:57:00.001-08:00</published><updated>2011-12-06T15:18:28.848-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="AppFabric Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="Enterprise Service Bus"/><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>App Fabric Service Bus. Ретрансляция сообщений на примере Echo-сервиса.</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Всем привет ! Мы продолжаем знакомиться с технологией от Microsoft под названием &lt;b&gt;App Fabric Service Bus&lt;/b&gt;. Данная публикация является уже второй по счету, посвященной этому механизму. В первой я напомню мы познакомились с определением и основными сценариями применения технологии, а также узнали как создать свой первый неймспейс. Посмотреть ее можно вот по этой ссылке: &lt;a href=&quot;http://feschenkoalex.blogspot.com/2011/11/appfabric-service-bus.html&quot; target=&quot;_blank&quot;&gt;Введение в AppFabric Service Bus. Сценарии применения.&lt;/a&gt;Сегодня пост будет более техническим – попытаемся создать и использовать WCF-сервис посредством &lt;b&gt;Service Bus&lt;/b&gt;.&lt;br /&gt;
&lt;a name=&#39;more&#39;&gt;&lt;/a&gt;Итак, задача стоит следующая: построить WCF-сервис, содержащий один единственный метод. Метод будет принимать строковый параметр и сразу же возвращать его клиенту. Захостить этот сервис постараемся на сервисной шине. То есть по факту Service Bus будет выступать как ретранслятор сообщений между клиентом и WCF-сервисом.Для решения поставленной задачи был создан новый солюшен со следующими проектами: &lt;b&gt;EchoService.Client&lt;/b&gt;, &lt;b&gt;EchoService.Server&lt;/b&gt;, &lt;b&gt;EchoService.Source&lt;/b&gt;. В студии это выглядит следующим образом: &lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-5fZ3clzoN4U/Tt6d4Fz-AWI/AAAAAAAAAWk/wDMeNfSHDJM/s1600-h/13.png&quot;&gt;&lt;img alt=&quot;Echo service solution architecture&quot; height=&quot;435&quot; src=&quot;http://lh5.ggpht.com/-rS_Alu2_NGA/Tt6d42Ir8vI/AAAAAAAAAWs/mrHpKklDpy0/_thumb11.png?imgmax=800&quot; style=&quot;display: inline;&quot; title=&quot;Echo service solution architecture&quot; width=&quot;340&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;b&gt;EchoService.Client&lt;/b&gt; представляет собой консольное приложение, через которое пользователь может отправлять сообщения на сервер. &lt;b&gt;EchoService.Server&lt;/b&gt; – это наша серверная часть (также консольное приложение), на базе которой будет открываться WCF-хост, запускающий необходимый нам WCF-сервис. Так как и клиенту и серверу необходим контракт WCF-сервиса – мы поместили его в совместно используемую сборку под названием &lt;b&gt;EchoService.Source&lt;/b&gt;. В данной сборке находится один единственный интерфейс, код которого представлен ниже. &lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.ServiceModel;

namespace EchoService.Source
{
    [ServiceContract(Name = &quot;EchoContract&quot;, Namespace = &quot;http://samples.microsoft.com/ServiceModel/Relay/&quot;)]
    public interface IEchoContract
    {
        [OperationContract] 
        string Echo(string message);
    }
}&lt;/pre&gt;
&lt;br /&gt;
Ничего необычного – стандартный интерфейс с одним единственным методом Echo, принимающий и возвращающий строковый параметр. В сборке &lt;b&gt;EchoService.Server&lt;/b&gt; находится реализация данного интерфейса – это класс под названием &lt;b&gt;EchoServer&lt;/b&gt; – его код также представлен чуть ниже.&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using EchoService.Source;
using System.ServiceModel;

namespace EchoService.Server
{
    [ServiceBehavior(Name = &quot;EchoService&quot;, Namespace = &quot;http://samples.microsoft.com/ServiceModel/Relay/&quot;)]
    public class EchoServer : IEchoContract
    {
        public string Echo(string message)
        {
            Console.WriteLine(&quot;Received: {0}&quot;, message);
            return message;
        }
    }
}&lt;/pre&gt;
&lt;br /&gt;
Здесь также все стандартно – класс реализует интерфейс IEchoService и помечается атрибутом &lt;b&gt;ServiceBehavior &lt;/b&gt;(тем самым класс помечается как реализация WCF-сервиса). Метод Echo помимо того, что возвращает пришедшую в параметре строку обратно клиенту, также выводит ее в консоль сервера. Основная же функциональность сервера заключена в файле Program.cs. Давайте посмотрим на его содержимое:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ServiceBus;
using System.ServiceModel;
using System.ServiceModel.Description;

namespace EchoService.Server
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = &quot;Сервер&quot;;
            Console.Write(&quot;Введите Service Bus неймспейс: &quot;);
            string serviceNamespaceDomain = Console.ReadLine();
            Console.Write(&quot;Issuer Name: &quot;);
            string issuerName = Console.ReadLine();
            Console.Write(&quot;Issuer Secret: &quot;);
            string issuerSecret = Console.ReadLine();

            Uri address = ServiceBusEnvironment.CreateServiceUri(&quot;sb&quot;, serviceNamespaceDomain, &quot;EchoService&quot;);

            TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
            sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;

            ServiceHost host = new ServiceHost(typeof(EchoServer), address);
            IEndpointBehavior serviceRegistrySettings = new ServiceRegistrySettings(DiscoveryType.Public);
            foreach (ServiceEndpoint endpoint in host.Description.Endpoints)
            {
                endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
            }
            host.Open();
            Console.WriteLine(&quot;Адрес сервиса: &quot; + address);
            Console.WriteLine(&quot;Нажмите [Enter] для выхода&quot;);
            Console.ReadLine();
            host.Close();
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Давайте более подробно разберемся что же происходит. Итак, во-первых для запуска сервиса необходимы входные данные, а именно криденшалы для доступа к &lt;b&gt;Service Bus&lt;/b&gt; и название неймспейса. Они то как раз и собираются в первых строчках программы. После этого создается уникальный всеобще доступный адрес сервиса (на выходе мы получим вот такого формата адрес: &lt;b&gt;sb://&amp;lt;YOUR-NAMESPACE&amp;gt;.servicebus.windows.net/EchoService&lt;/b&gt;). Для доступа к &lt;b&gt;Service Bus&lt;/b&gt; все клиенты должны быть аутентифицированными. В нашем случае используется так называемая аутентификация&amp;nbsp; &lt;b&gt;SharedSecret&lt;/b&gt; и происходит это следующем сегменте кода:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;           
            TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
            sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;&lt;/pre&gt;
&lt;br /&gt;
Данный способ аутентификации похож на стандартные схемы, при которых передается пара логин/пароль (кроме того поддерживаются следующие схемы аутентификации: &lt;b&gt;Saml&lt;/b&gt;, &lt;b&gt;SimpleWebToken&lt;/b&gt; и &lt;b&gt;Unauthenticated&lt;/b&gt;). Ну и в конце концов при помощи стандартного инструментария из сборки &lt;b&gt;System.ServiceModel.dll&lt;/b&gt; создается WCF-хост и запускается наш Echo-сервис (конечно же при этом для каждой точки доступа устанавливается созданное ранее поведение, гарантирующее возможность подключения лишь аутентифицированных пользователей). &lt;br /&gt;
&lt;br /&gt;
Давайте теперь взглянем на исходный код клиента. &lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Microsoft.ServiceBus;
using System.ServiceModel;
using EchoService.Source;

namespace EchoService.Client
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.Title = &quot;Клиент&quot;;
            Console.Write(&quot;Введите Service Bus неймспейс: &quot;);
            string serviceNamespaceDomain = Console.ReadLine();
            Console.Write(&quot;Issuer Name: &quot;);
            string issuerName = Console.ReadLine();
            Console.Write(&quot;Issuer Secret: &quot;);
            string issuerSecret = Console.ReadLine();

            Uri serviceUri = ServiceBusEnvironment.CreateServiceUri(&quot;sb&quot;, serviceNamespaceDomain, &quot;EchoService&quot;);

            TransportClientEndpointBehavior sharedSecretServiceBusCredential = new TransportClientEndpointBehavior();
            sharedSecretServiceBusCredential.CredentialType = TransportClientCredentialType.SharedSecret;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerName = issuerName;
            sharedSecretServiceBusCredential.Credentials.SharedSecret.IssuerSecret = issuerSecret;

            ChannelFactory&amp;lt;IEchoContract&amp;gt; channelFactory = new ChannelFactory&amp;lt;IEchoContract&amp;gt;(&quot;RelayEndpoint&quot;, new EndpointAddress(serviceUri));

            channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
            IEchoContract channel = channelFactory.CreateChannel();
            ((ICommunicationObject)channel).Open();

            Console.WriteLine(&quot;Введите текст для отправки на сервер:&quot;);
            string input = Console.ReadLine();
            while (!String.IsNullOrEmpty(input))
            {
                try
                {
                    Console.WriteLine(&quot;Сервер ответил: {0}&quot;, channel.Echo(input));
                }
                catch (Exception e)
                {
                    Console.WriteLine(&quot;Ошибка: &quot; + e.Message);
                }
                input = Console.ReadLine();
            }

            ((ICommunicationObject)channel).Close();
            channelFactory.Close();
        }
    }
}
&lt;/pre&gt;
&lt;br /&gt;
Алгоритм подключения к шине совершенно идентичный оному в серверной части. Различия заключаются лишь в том, что мы не открываем новый хост, а открываем канал при помощи вот этого кода:&lt;br /&gt;
&lt;pre class=&quot;brush:csharp&quot;&gt;            ChannelFactory&amp;lt;IEchoContract&amp;gt; channelFactory = new ChannelFactory&amp;lt;IEchoContract&amp;gt;(&quot;RelayEndpoint&quot;, new EndpointAddress(serviceUri));
            channelFactory.Endpoint.Behaviors.Add(sharedSecretServiceBusCredential);
            IEchoContract channel = channelFactory.CreateChannel();
            ((ICommunicationObject)channel).Open();&lt;/pre&gt;
&lt;br /&gt;
Все, что нам осталось сделать это добавить пару строчек кода в конфигурационные файлы обоих проектов. В серверную часть добавим следующую конфигурацию:&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
&amp;lt;startup&amp;gt;&amp;lt;supportedRuntime version=&quot;v4.0&quot; sku=&quot;.NETFramework,Version=v4.0&quot;/&amp;gt;&amp;lt;/startup&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;services&amp;gt;
      &amp;lt;service name=&quot;EchoService.Server.EchoServer&quot;&amp;gt;
        &amp;lt;endpoint contract=&quot;EchoService.Source.IEchoContract&quot; binding=&quot;netTcpRelayBinding&quot;&amp;gt;&amp;lt;/endpoint&amp;gt;
      &amp;lt;/service&amp;gt;
    &amp;lt;/services&amp;gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
В клиентскую же отправляется следующий фрагмент:&lt;br /&gt;
&lt;pre class=&quot;brush:xml&quot;&gt;&amp;lt;?xml version=&quot;1.0&quot;?&amp;gt;
&amp;lt;configuration&amp;gt;
&amp;lt;startup&amp;gt;&amp;lt;supportedRuntime version=&quot;v4.0&quot; sku=&quot;.NETFramework,Version=v4.0&quot;/&amp;gt;&amp;lt;/startup&amp;gt;
  &amp;lt;system.serviceModel&amp;gt;
    &amp;lt;client&amp;gt;
      &amp;lt;endpoint name=&quot;RelayEndpoint&quot; contract=&quot;EchoService.Source.IEchoContract&quot; binding=&quot;netTcpRelayBinding&quot;&amp;gt;&amp;lt;/endpoint&amp;gt;
    &amp;lt;/client&amp;gt;
  &amp;lt;/system.serviceModel&amp;gt;
&amp;lt;/configuration&amp;gt;&lt;/pre&gt;
&lt;br /&gt;
В обоих случаях указывается основная точка доступа к сервису и новый биндинг под названием &lt;b&gt;netTcpRelayBinding&lt;/b&gt; (этот вид биндинга находится в сборке &lt;b&gt;Microsoft.ServiceBus.dll&lt;/b&gt; и обеспечивает безопасную и надежную коммуникацию между компьютерами посредством &lt;b&gt;Service Bus&lt;/b&gt;)&lt;br /&gt;
&lt;br /&gt;
Все готово, осталось сделать лишь один маленький шаг перед запуском системы. А именно узнать на портале криденшалы для доступа (это наши &lt;b&gt;Issuer Name&lt;/b&gt; и &lt;b&gt;Issuer Secret&lt;/b&gt;, требуемые как клиентом так и сервером). Найти их можно в разделе &lt;b&gt;AppFabric –&amp;gt; Service Bus &lt;/b&gt;в свойстве неймспейса под названием &lt;b&gt;Default Key&lt;/b&gt;&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/-dO5C_azJhh0/Tt6d5e4G1cI/AAAAAAAAAWw/7WKWyoFZdVs/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Default Keys For AppFabric Service Bus&quot; border=&quot;0&quot; height=&quot;63&quot; src=&quot;http://lh5.ggpht.com/-cp-_Th_Ahx8/Tt6d6KQuGiI/AAAAAAAAAW8/MjXRyYaCofY/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Default Keys For AppFabric Service Bus&quot; width=&quot;244&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
По клику на кнопочке &lt;b&gt;View&lt;/b&gt; откроется модальное окошко, в котором как раз и будут содержаться необходимые нам данные.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh5.ggpht.com/-1QHRayBNaXI/Tt6d60R76GI/AAAAAAAAAXA/oVAoGJluKDc/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Service Bus Keys&quot; border=&quot;0&quot; height=&quot;162&quot; src=&quot;http://lh6.ggpht.com/-HRQ8C_3H2x0/Tt6d7SD6znI/AAAAAAAAAXI/6gRaHLpphGY/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Service Bus Keys&quot; width=&quot;408&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
На этом все приготовления можно считать завершенными. Для демонстрации я покажу пару скриншотов ,показывающих функционирование системы.&lt;br /&gt;
&lt;br /&gt;
&lt;div align=&quot;center&quot;&gt;
&lt;a href=&quot;http://lh6.ggpht.com/-F1rbgZ7lyjo/Tt6d8PZvIuI/AAAAAAAAAXQ/pe-2KNb59iA/s1600-h/Image.png&quot;&gt;&lt;img alt=&quot;Echo Service via Service Bus&quot; border=&quot;0&quot; height=&quot;666&quot; src=&quot;http://lh6.ggpht.com/-WphV2_EJ6To/Tt6d8qa9WvI/AAAAAAAAAXY/YEARywPPWLk/Image.png?imgmax=800&quot; style=&quot;background-image: none; border-bottom-width: 0px; border-left-width: 0px; border-right-width: 0px; border-top-width: 0px; display: inline; padding-left: 0px; padding-right: 0px; padding-top: 0px;&quot; title=&quot;Echo Service via Service Bus&quot; width=&quot;609&quot; /&gt;&lt;/a&gt;&lt;/div&gt;
&lt;br /&gt;
Как видим система работает прекрасно, а для создания сервиса нам не пришлось прикладывать значительных усилий, большинство рутинной работы за нас выполняет новый WCF-биндинг, находящийся в пространстве имен &lt;b&gt;Microsoft.ServiceBus&lt;/b&gt;.&lt;br /&gt;
&lt;br /&gt;
На этом пост можно завершать. Исходные файлы проекта можно взять по следующей ссылке: &lt;a href=&quot;http://dl.dropbox.com/u/18522369/EchoService.zip&quot; target=&quot;_blank&quot;&gt;AppFabric Service Bus Echo Service&lt;/a&gt;. Очень скоро мы познакомимся с более прогрессивными и изощренными вариантами применения Service Bus, а пока что спасибо за внимание, надеюсь публикация была полезна и интересна :)&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/4980071918919846320/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/4980071918919846320' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4980071918919846320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4980071918919846320'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2011/12/app-fabric-service-bus-echo.html' title='App Fabric Service Bus. Ретрансляция сообщений на примере Echo-сервиса.'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://lh5.ggpht.com/-rS_Alu2_NGA/Tt6d42Ir8vI/AAAAAAAAAWs/mrHpKklDpy0/s72-c/_thumb11.png?imgmax=800" height="72" width="72"/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-1142903694429052539.post-4834443927027968475</id><published>2011-11-20T06:32:00.001-08:00</published><updated>2011-11-20T07:07:41.817-08:00</updated><category scheme="http://www.blogger.com/atom/ns#" term="Windows Azure"/><title type='text'>Windows Azure Internals</title><content type='html'>&lt;div dir=&quot;ltr&quot; style=&quot;text-align: left;&quot; trbidi=&quot;on&quot;&gt;
Привет всем ! 18 ноября прошла очередная встреча профессиональных .NET разработчиков&amp;nbsp;&lt;a href=&quot;http://uneta.ua/&quot; target=&quot;_blank&quot;&gt;UNETA&lt;/a&gt;. Встреча вызвала немалый ажиотаж, так как доклады затрагивали актуальные на сегодняшний день темы: &quot;Обзор возможностей HTML5&quot; и &quot;Внутренняя организация Windows Azure&quot;. Я принимал участие во встрече как докладчик и рассказывал об архитектуре Windows Azure. &amp;nbsp;Для тех, кто не смог попасть на встречу выкладываю материалы презентации.&lt;br /&gt;
&lt;div style=&quot;text-align: center;&quot;&gt;
&lt;br /&gt;
&lt;object height=&quot;355&quot; id=&quot;__sse10241782&quot; width=&quot;425&quot;&gt;&lt;param name=&quot;movie&quot; value=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsazureinternals-111120082927-phpapp02&amp;stripped_title=windows-azure-internals-10241782&amp;userName=KBA3AP&quot; /&gt;






&lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;/&gt;






&lt;param name=&quot;allowScriptAccess&quot; value=&quot;always&quot;/&gt;






&lt;param name=&quot;wmode&quot; value=&quot;transparent&quot;/&gt;






&lt;embed name=&quot;__sse10241782&quot; src=&quot;http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=windowsazureinternals-111120082927-phpapp02&amp;stripped_title=windows-azure-internals-10241782&amp;userName=KBA3AP&quot; type=&quot;application/x-shockwave-flash&quot; allowscriptaccess=&quot;always&quot; allowfullscreen=&quot;true&quot; wmode=&quot;transparent&quot; width=&quot;425&quot; height=&quot;355&quot;&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/div&gt;
&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://feschenkoalex.blogspot.com/feeds/4834443927027968475/comments/default' title='Комментарии к сообщению'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment/fullpage/post/1142903694429052539/4834443927027968475' title='Комментарии: 0'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4834443927027968475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/1142903694429052539/posts/default/4834443927027968475'/><link rel='alternate' type='text/html' href='http://feschenkoalex.blogspot.com/2011/11/18.html' title='Windows Azure Internals'/><author><name>FeschenkoAlex</name><uri>http://www.blogger.com/profile/04137958449707786893</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_jLBiV-GntsU/TJ0b2OvMrlI/AAAAAAAAACs/sp2FWXl1wOg/S220/I+am.JPG'/></author><thr:total>0</thr:total></entry></feed>