<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Insight IT</title><link>https://www.insight-it.ru/</link><description></description><atom:link href="https://www.insight-it.ru/tag/rest/feed/index.xml" rel="self"></atom:link><lastBuildDate>Tue, 13 Nov 2012 02:09:00 +0400</lastBuildDate><item><title>Обзор Riak</title><link>https://www.insight-it.ru//storage/2012/obzor-riak/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/243e6801/" rel="nofollow" target="_blank" title="http://basho.com/products/riak-kv/"&gt;Riak&lt;/a&gt; - распределенная
&lt;em&gt;opensource&lt;/em&gt;&amp;nbsp;база данных, разработанная на &lt;a href="/tag/erlang/"&gt;Erlang&lt;/a&gt; и
спроектированная в расчете на:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Высокую доступность и устойчивость к сбоям;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Масштабируемость и простоту обслуживания;&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Универсальность.&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;У проекта отличная&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/e20af489/" rel="nofollow" target="_blank" title="https://docs.basho.com/riak/latest/"&gt;официальная документация&lt;/a&gt;&amp;nbsp;на английском, далее же в этой статье я расскажу об основных её особенностях чуть подробнее, а также хитростях и подводных камнях, выявленных в процессе применения на практике (с перспективы веб-разработки).&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="vysokaia-dostupnost-i-ustoichivost-k-sboiam"&gt;Высокая доступность и устойчивость к сбоям&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Все данные в кластере&amp;nbsp;&lt;em&gt;реплицируются&lt;/em&gt; по принципу соседей на хэш
    кольце (см. логотип для иллюстрации) и даже в случае сбоев
    &lt;em&gt;доступны&lt;/em&gt; посредством интеллектуального перенаправления запросов
    внутри кластера.&lt;/li&gt;
&lt;li&gt;В случае возникновения коллизий из-за разрыва сетевого соединения
    или просто одновременной записи, на запрос получения данных &lt;em&gt;может
    вернуться несколько версий&lt;/em&gt; и приложение само может решить как их
    объединить или какую версию использовать.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="masshtabiruemost-i-prostota-obsluzhivaniia"&gt;Масштабируемость и простота обслуживания&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Добавление нового сервера тривиально путем копирования конфига и
    одной команды.&lt;/li&gt;
&lt;li&gt;Перераспределение данных и все остальное прозрачно происходит за
    сценой.&lt;/li&gt;
&lt;li&gt;Минимальный рекомендуемый размер Riak кластера - 5 серверов, меньшее
    количество не дает раскрыть весь потенциал.&lt;/li&gt;
&lt;li&gt;Одинаково легко обслуживать как маленький, так и большой кластер.&lt;/li&gt;
&lt;li&gt;Есть коммерческая &lt;em&gt;Enterprise&lt;/em&gt; версия с поддержкой от &lt;strong&gt;Basho&lt;/strong&gt;,
    компании-разработчика Riak (изначально выходцы из Akamai),
    равноправной зашифрованной репликацией между датацентрами и
    поддержкой &lt;em&gt;SNMP&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Есть встроенный веб-интерфейс для мониторинга и управления
    кластером, у меня правда так и не дошли руки его освоить:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="video-container"&gt;
&lt;iframe allowfullscreen="" frameborder="0" height="480" src="//www.youtube.com/embed/R0_PLMCrtZw?rel=0" width="853"&gt;&lt;/iframe&gt;
&lt;/div&gt;
&lt;h2 id="universalnost"&gt;Универсальность&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Схема отсутствует, ключи и данные - произвольные бинарные строки.
    Ключи располагаются в пространствах имен &lt;em&gt;(bucket)&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Сериализация - на усмотрение разработчика, популярные варианты -
    Erlang'овский &lt;em&gt;BERT&lt;/em&gt;, &lt;em&gt;JSON&lt;/em&gt; для других платформ, можно использовать
    просто как &lt;em&gt;файловую систему&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Модульная система хранилищ данных, альтернатив много, основная -
    &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; &lt;a href="/tag/leveldb/"&gt;LevelDB&lt;/a&gt;;&amp;nbsp;еще интересный
    вариант с хранением полностью в оперативной памяти - получается
    продвинутый распределенный кэш с репликацией, поиском и пр.&lt;/li&gt;
&lt;li&gt;Гибко настраиваемое количество узлов кластера, которые должны
    подтвердить успешность операции, чтобы она считалась успешной: можно
    указывать для всего кластера, пространства имен и даже конкретного
    запроса. Riak в любом случае остается eventually consistent базой
    данных (AP из CAP теоремы), но с возможностью управлять балансом
    производительности операций и надежностью выполнения запросов.&lt;/li&gt;
&lt;li&gt;Три интерфейса доступа &lt;em&gt;(API)&lt;/em&gt;:&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/protocol-buffers/"&gt;Google ProtocolBuffers&lt;/a&gt; - для основного
    использования в боевых условиях.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/http/"&gt;HTTP&lt;/a&gt; &lt;a href="/tag/rest/"&gt;REST&lt;/a&gt; - для использования в
    языках, где нет готового клиента на ProtocolBuffers и для того,
    чтобы по-быстрому что-то посмотреть из консоли через curl. Хотя
    по факту клиенты для большинства языков программирования есть и
    проще делать запросы через интерпретатор.&lt;/li&gt;
&lt;li&gt;Еще есть прямой интерфейс Erlang-сообщений, но даже из самого
    Erlang им пользоваться не рекомендуют, не говоря уже о
    реализациях Erlang node (BERT) на других платформах.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Вместе с данными хранятся метаданные для разных целей, которые
    используются в соответствующих типах запросов:&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/3d61cc81/" rel="nofollow" target="_blank" title="http://ru.wikipedia.org/wiki/%D0%92%D0%B5%D0%BA%D1%82%D0%BE%D1%80%D0%BD%D1%8B%D0%B5_%D1%87%D0%B0%D1%81%D1%8B"&gt;Векторные часы&lt;/a&gt;
    для разрешения конфликтов версий данных&amp;nbsp;&lt;em&gt;(обязательно, есть
    автоматическое разрешение);&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Индекс для полнотекстного поиска &lt;em&gt;(концептуально позаимствован у
    &lt;a href="/tag/lucene/"&gt;Lucene&lt;/a&gt;/&lt;a href="/tag/solr/"&gt;Solr&lt;/a&gt;, опционально);&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Индекс для простых выборок &lt;em&gt;(по бинарным и числовым полям,
    опционально);&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;Связанные ключи &lt;em&gt;(отдаленный аналог внешних ключей,
    опционально).&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Встроенная поддержка &lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;, фазы можно
    реализовывать на &lt;a href="/tag/erlang/"&gt;Erlang&lt;/a&gt; или
    &lt;a href="/tag/javascript/"&gt;JavaScript&lt;/a&gt;;&amp;nbsp;для обоих языков есть библиотека с
    наиболее популярными случаями, которые можно использовать для
    образца.&lt;/li&gt;
&lt;li&gt;Есть поддержка выполнения операций до/после операций записи/чтения
    &lt;em&gt;(hooks)&lt;/em&gt;, чаще всего используются для построения полнотекстного
    индекса, но можно реализовать и свои, специфичные для приложения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nedokumentirovannye-vozmozhnosti"&gt;Недокументированные возможности&lt;/h2&gt;
&lt;p&gt;Пока я их нашел всего две:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Счетчики:&lt;/strong&gt;&amp;nbsp;как такового API в для&amp;nbsp;увеличения/уменьшения числовых
    значений &lt;em&gt;(increment/decrement)&lt;/em&gt; в Riak нет, так как он не лезет
    внутрь хранящихся данных. Зато есть векторные часы, которые растут с
    каждой операцией записи по ключу. Чтобы реализовать увеличение
    &lt;em&gt;(increment)&lt;/em&gt; необходимо записать в Riak пустую бинарную строку с
    опцией &lt;em&gt;return_body,&amp;nbsp;&lt;/em&gt;и у вернувшегося значения сложить все поля в
    векторных часах. &lt;a href="https://www.insight-it.ru/goto/6a894d09/" rel="nofollow" target="_blank" title="https://gist.github.com/4061705"&gt;Пример на
    Erlang&lt;/a&gt;. Если нужно еще и
    уменьшение (decrement) этого можно добиться с помощью пары счетчиков
    "плюс и минус" и вычитать второе значение из первого. Для&amp;nbsp;авто
    инкремента&amp;nbsp;основных ключей не самый лучший вариант, но для не особо
    критичных случаев вполне себе работает.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Выборка по списку ключей &lt;em&gt;(multiget)&lt;/em&gt;:&amp;nbsp;&lt;/strong&gt;такого API тоже нет, но
    здесь на выручку приходит &lt;em&gt;MapReduce&lt;/em&gt;. Это, пожалуй, наиболее
    популярное его применение. На вход подаем имеющийся список ключей и
    используем фазы из готовой библиотеки: &lt;em&gt;reduce_set_union&lt;/em&gt; и
    &lt;em&gt;map_identity&lt;/em&gt;. Данные возвращаются&amp;nbsp;неотсортированные &amp;nbsp;и требуют
    небольшой обертки на выходе, но все равно это намного быстрее, чем
    последовательно проходить по списку ключей и делать для каждого
    обычный &lt;em&gt;get&lt;/em&gt;. &lt;a href="https://www.insight-it.ru/goto/d557f797/" rel="nofollow" target="_blank" title="https://gist.github.com/4061784"&gt;Пример на Erlang&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="card blue lighten-4"&gt;
&lt;p&gt;&lt;div class="card-content"&gt;
Буду рад, если Вы поможете мне дополнить этот список, оставив известные
Вам подобные трюки в комментариях.
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;h2 id="podvodnye-kamni"&gt;Подводные камни&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Если в Вашем приложении необходима функциональность &lt;strong&gt;постраничного
    просмотра отсортированных данных&lt;/strong&gt; &lt;em&gt;(pagination)&lt;/em&gt;, то будьте готовы
    реализовать её на клиенте. То есть Riak быстро сделал нужную выборку
    всех "страниц" и уже на клиенте её придется отсортировать и выкинуть
    лишнее. Вообще в большинстве случаев результаты запросов к Riak
    приходят в произвольном порядке из-за его распределенной природы.&lt;/li&gt;
&lt;li&gt;В продолжение к предыдущему: в &lt;a href="https://www.insight-it.ru/goto/1093e454/" rel="nofollow" target="_blank" title="https://docs.basho.com/riak/latest/dev/using/search/"&gt;REST Solr интерфейсе&lt;/a&gt;&amp;nbsp;есть
    аргументы (в ProtoBuf это тоже добавили в одной из последних
    версий), которые, казалось бы, достаточны для реализации
    постраничного просмотра: &lt;strong&gt;sort&lt;/strong&gt;, &lt;strong&gt;start&lt;/strong&gt;, &lt;strong&gt;rows&lt;/strong&gt; - что еще
    нужно? На практике оно работает не так, как было бы логично.
    Сортировка по значению (заданная в sort) применяется ПОСЛЕ того, как
    была отсчитана страница по start и rows. Они отмеряются по ключам
    или рейтингу значения в полнотекстном поиске и никак иначе. С тем же
    успехом эти 5-10 значений можно очень быстро отсортировать и на
    клиенте. Зачем-то это может быть и нужно, но в моем случае оказалось
    совершенно бесполезно.&lt;/li&gt;
&lt;li&gt;У Riak есть 4 основных типа запросов: простой
    get/set,&amp;nbsp;полнотекстовый&amp;nbsp;поиск, вторичные ключи &lt;em&gt;(secondary
    indices)&lt;/em&gt;, МapReduce и проход по связанным ключам &lt;em&gt;(link walking)&lt;/em&gt;.&lt;ul&gt;
&lt;li&gt;Если Ваши данные являются сериализованным JSON, BERT или XML, то
    в большинстве случаев Вам нужны лишь первые два из них,
    исключение - упомянутая выше выборка по списку ключей через
    MapReduce.&lt;/li&gt;
&lt;li&gt;Основной сценарий использования вторичных индексов - метаданные
    к произвольным неструктурированным бинарным данным, например в
    случае с аналогом файловой системы. Либо совсем примитивные
    случаи, когда правда нужно сделать простую выборку по одному
    целочисленному полю, что бывает редко.&lt;/li&gt;
&lt;li&gt;Если данные сериализованы, то связанные ключи проще хранить
    внутри данных, а не средствами СУБД. Разницы в
    производительности нет, в итоге делается тот же MapReduce с теми
    же фазами.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Хоть Riak "из коробки" и правда надежнее многих других СУБД и 1-2
    упавших/отключенных сервера в кластере внешне практически не
    заметны, есть одно но. Если один узел упал - соединения всех
    подключенных к нему клиентов теряются. Два основных
    пути&amp;nbsp;преодоления&amp;nbsp;этого момента:&lt;ul&gt;
&lt;li&gt;Если кластер клиентов и кластер Riak расположены на разных
    серверах, то между ними можно поставить отказоустойчивый TCP
    балансировщик нагрузки, в частности &lt;a href="/tag/haproxy/"&gt;HAProxy&lt;/a&gt; или
    &lt;a href="/tag/ipvs/"&gt;IPVS&lt;/a&gt; здесь наиболее органично вписываются.&lt;/li&gt;
&lt;li&gt;Если на одних и тех же, то есть вариант поставить балансировщик
    нагрузки перед клиентами (для веба возможно и в HTTP/HTTPS
    режиме), а каждый клиент подключается к своему локальному
    серверу Riak и если один, другой или оба сразу упали, то
    отрубать весь физический сервер целиком.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="vyvody"&gt;Выводы&lt;/h2&gt;
&lt;p&gt;Riak отлично подходит для многих вариантов использования, как в Интернет
среде, так и в смежных вроде телекома. Обладает отличным набором
положительных "черт характера", о которых шла речь в начале статьи.
Прекрасно справляется с большим потоком как операций записи, так и
операций чтения.&lt;/p&gt;
&lt;p&gt;Как уже упоминалось, практически единственный сценарий, где Riak совсем
не справляется, это выборки по большим объемам данных с сортировкой и
постраничным выводом. Но даже в этом случае никто не мешает использовать
отдельный сервис, который будет индексировать нужным образом данные и
подготавливать список идентификаторов для последующей multiget выборки
из Riak. К слову, проекты по этой части уже появляются, например
&lt;a href="https://www.insight-it.ru/goto/1232aa05/" rel="nofollow" target="_blank" title="https://github.com/rzezeski/yokozuna"&gt;Yokozuna&lt;/a&gt; - интеграция
полноценного Solr с Riak &lt;em&gt;(Riak Search - лишь частичный порт Solr+Lucene
на Erlang)&lt;/em&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Tue, 13 Nov 2012 02:09:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-11-13:storage/2012/obzor-riak/</guid><category>Basho</category><category>Erlang</category><category>LevelDB</category><category>Protocol Buffers</category><category>REST</category><category>Riak</category><category>БД</category><category>обзор</category><category>СУБД</category></item><item><title>Архитектура Amazon</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-amazon/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon&lt;/a&gt; вырос из крошечной книжной лавки в один из
крупнейших магазинов вселенной. Они добились этого благодаря их
инновационному подходу к обзорам, рекомендациям и оценке продукции.-more--&amp;gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Как и &lt;a href="https://www.insight-it.ru/highload/"&gt;многие статьи&lt;/a&gt; об архитектурах высоконагруженных
систем на этом блоге, эта запись представляет собой перевод
&lt;a href="https://www.insight-it.ru/goto/59bb645b/" rel="nofollow" target="_blank" title="http://highscalability.com/amazon-architecture"&gt;статьи&lt;/a&gt;, автором
которой является &lt;a href="https://www.insight-it.ru/goto/f3f1b405/" rel="nofollow" target="_blank" title="http://highscalability.com/user/todd-hoff"&gt;Todd Hoff&lt;/a&gt;.
Источниками информации для оригинала послужили:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/292cd03b/" rel="nofollow" target="_blank" title="http://glinden.blogspot.com/2006/05/early-amazon-end.html"&gt;Ранний Amazon&lt;/a&gt;
    от Greg Linden&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/7a5f17fb/" rel="nofollow" target="_blank" title="http://news.com.com/2100-1001-275155.html"&gt;Как Linux позволил Amazon сэкономить миллионы&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/de1af2aa/" rel="nofollow" target="_blank" title="http://www.se-radio.net/index.php?post_id=157593"&gt;Интервью с Werner Vogels'ом&lt;/a&gt; -
    техническим директором Amazon&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a27efde/" rel="nofollow" target="_blank" title="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html"&gt;Асинхронные архитектуры&lt;/a&gt; -
    краткий пересказ речи Werner Vogels'а от Cris Loosley&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/5439ba1f/" rel="nofollow" target="_blank" title="http://www.acmqueue.com/modules.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=388"&gt;Познание технологической платформы Amazon&lt;/a&gt; -
    диалог с Werner Vogels&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/bf438042/" rel="nofollow" target="_blank" title="http://www.allthingsdistributed.com/"&gt;Блог Werner Vogels'а&lt;/a&gt; -
    построение масштабируемых распределенных систем&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/linux/"&gt;Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/oracle/"&gt;Oracle&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/c/"&gt;C++&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mason/"&gt;Mason&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/jboss/"&gt;Jboss&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/servlet/"&gt;Сервлеты&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Более чем 55 миллионов учетных записей активных покупателей.&lt;/li&gt;
&lt;li&gt;Более миллиона активных розничных партнеров по всему Миру.&lt;/li&gt;
&lt;li&gt;Для построения страницы осуществляется доступ к 100-150 сервисам.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Что мы на самом деле подразумеваем под словом
    &lt;a href="/tag/masshtabiruemost/"&gt;"масштабируемость"&lt;/a&gt;? Обычно говорят, что
    сервис является масштабируемым, если в случае расширения ресурсов
    системы производительность растет пропорционально. Рост
    производительности обычно означает увеличение количества выполняемых
    в единицу времени работ, но с другой стороны он может означать и
    рост объемов выполняемых работ, например размер обрабатываемых
    наборов данных.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; пришлось претерпеть большое архитектурное
    преобразование в процессе перехода от двух-уровневой монолитной
    системы к полностью распределенной децентрализованной платформе для
    сервисов и приложений.&lt;/li&gt;
&lt;li&gt;Все началось с одного приложения, обменивающегося данными с
    внутренним интерфейсом, написанного на &lt;a href="/tag/c/"&gt;C++&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Оно росло. За годы усилий, направленных на масштабирование,
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; сфокусировался на масштабировании &lt;a href="/tag/bd/"&gt;баз данных&lt;/a&gt; для хранения постоянно растущего объема информации
    о предметах, покупателях, заказах, для поддержки нескольких
    интернациональных сайтов. В 2001 году стало ясно, что исходное
    веб-приложение больше не в состоянии
    &lt;a href="/tag/masshtabiruemost/"&gt;масштабироваться&lt;/a&gt; такими темпами. Базы
    данных были разбиты на маленькие части и для каждой их них был
    построен отдельный &lt;a href="/tag/interfejs/"&gt;интерфейс&lt;/a&gt;, выполненный в виде
    сервиса, который являлся единственным способом получить доступ к
    данным.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/bd/"&gt;Базы данных&lt;/a&gt; стали общим ресурсом, что затрудняло рост
    бизнеса в целом. Интерфейсы, связанные с пользователями и базами
    данных, были сильно ограничены в своей эволюции, так как они
    одновременно использовались множеством разных команд разработчиков и
    процессов.&lt;/li&gt;
&lt;li&gt;Их &lt;a href="/tag/arkhitektura/"&gt;архитектура&lt;/a&gt; тесно связана и построена вокруг
    сервисов. Ориентированная на сервисы архитектура дала им необходимый
    уровень изоляции для построения множества программных компонентов
    быстро и независимо.&lt;/li&gt;
&lt;li&gt;Система выросла до сотен сервисов и не меньшего количества серверов
    приложений, агрегирующих информацию, полученную от сервисов.
    Приложение, генерирующее страницы для
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt;, является одним из таких серверов.
    То же самое можно сказать и про приложения, служащие в роли
    интерфейса для Веб-сервисов, сервиса, обслуживающего покупателя,
    интерфейса для продавцов.&lt;/li&gt;
&lt;li&gt;Многие другие &lt;a href="/tag/tekhnologiya/"&gt;технологии&lt;/a&gt; очень трудно
    масштабировать до размеров &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;, особенно
    технологии коммуникационной инфраструктуры. Они отлично работают до
    какого-то предела в размерах системы, а после перестают справляться
    с выполнения своих обязанностей. Именно это подтолкнуло
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; на создание своих
    &lt;a href="/tag/tekhnologiya/"&gt;технологий&lt;/a&gt; в этой области.&lt;/li&gt;
&lt;li&gt;Не ограничиваясь одним конкретным подходом, некоторые части системы
    используют &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;/&lt;a href="/tag/jboss/"&gt;Jboss&lt;/a&gt;, но они являются
    всего лишь &lt;a href="/tag/servlet/"&gt;сервлетами&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/c/"&gt;C++&lt;/a&gt; используется для обработки запросов, в то время как
    &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt; и &lt;a href="/tag/mason/"&gt;Mason&lt;/a&gt; - для составления контента.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; предпочитает не пользоваться промежуточным
    &lt;a href="/tag/po/"&gt;программным обеспечением&lt;/a&gt;, так как оно в большинстве
    случаев является каркасом, а не средством разработки. Если
    используется промежуточное &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt;, то
    разработчик становится &lt;em&gt;заперт&lt;/em&gt; в использование тех принципов
    разработки, которые выбрал разработчик промежуточного &lt;a href="/tag/po/"&gt;ПО&lt;/a&gt;.
    Если появится необходимость использовать какие-либо другие решения,
    ничего не выйдет - вы заперты. Один и тот же цикл используется для
    обработки всех типов событий: сообщений, задержек в передаче данных,
    &lt;em&gt;AJAX&lt;/em&gt;, и так далее. Слишком громоздко. Если бы промежуточное
    &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt; было бы доступно в виде более
    мелких компонентов, скорее на правах средства разработки, чем
    каркаса для системы, тогда &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; был бы более
    заинтересован в нем.&lt;/li&gt;
&lt;li&gt;Кажется, что &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt; веб стек собирается заново решать все
    те же проблемы распределенных систем.&lt;/li&gt;
&lt;li&gt;Если предложить разработчиком на выбор работу над &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt;
    и &lt;a href="/tag/rest/"&gt;REST&lt;/a&gt; веб-сервисами, то только 30% выберут
    &lt;a href="/tag/soap/"&gt;SOAP&lt;/a&gt;, это скорее всего будут разработчики на .NET и
    &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;, привыкшие использовать WSDL файлы для генерации
    интерфейсов удаленных объектов. Оставшиеся 70% выберут
    &lt;a href="/tag/rest/"&gt;REST&lt;/a&gt; - это будут пользователи &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; и
    &lt;a href="/tag/perl/"&gt;Perl&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Обе категории разработчиков имеют возможность получить интерфейс к
    объектам &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;. Разработчики заинтересованы просто
    выполнить свою работу, не заботясь о том, что происходит на другом
    конце провода.&lt;/li&gt;
&lt;li&gt;Идея &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; заключалась в построении открытого
    сообщества вокруг своих сервисов. Веб-сервисы были выбраны благодаря
    своей простоте. Но так это выглядит только снаружи. Внутри же
    находится архитектура, ориентированная на сервисы. Доступ к данным
    может быть получен только через соответстыующий
    &lt;a href="/tag/interfejs/"&gt;интерфейс&lt;/a&gt;. Этот процесс описан в WSDL, но они
    используют свои собственные механизмы транспортировки и инкапсуляции
    данных.&lt;/li&gt;
&lt;li&gt;Команды разработчиков очень небольшие и организуются вокруг сервисов&lt;ul&gt;
&lt;li&gt;Сервисы являются независимыми единицами предоставления функционала
в рамках &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Если у разработчика возникает новая бизнес-идея или проблема,
которую ему хотелось бы решить, он собирает команду для ее решения
или реализации. Количество участников ограничено 8-10 людьми.
Команды из такого количества человек обычно называют
&lt;em&gt;пиццерийными&lt;/em&gt;, так как для того, чтобы ее накормить достаточно двух
пицц.&lt;/li&gt;
&lt;li&gt;Команды очень небольшие, но они уполномочены решать поставленную
задачу любыми доступными способами, именно так, как они считают
нужным.
&amp;ndash; В качестве примера задачи, поставленной перед такой командой,
может служить поиск фраз в рамках книги, уникальных для конкретного
текста.
&amp;ndash; Экстенсивное A/B тестирование используется для интеграции новых
сервисов. Они смотрят на произведенное влияние на систему и
выполняют экстенсивные измерения.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Развертывание&lt;ul&gt;
&lt;li&gt;Они создают специальную инфраструктуру для управления
зависимостями и развертывания.&lt;/li&gt;
&lt;li&gt;Цель состоит в том, чтобы иметь все необходимые сервисы
развернутыми на новом оборудовании, в том числе код приложений,
системы мониторинга и лицензирования и так далее.&lt;/li&gt;
&lt;li&gt;Результатом развертывания является виртуальная машина, которая
запускается с помощью &lt;strong&gt;EC2&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Работа с покупателями для того, чтобы убедиться, что внедрение нового сервиса того стоит&lt;ul&gt;
&lt;li&gt;Фокусировка на конкретно на тех возможностях, которые планируется
предоставить покупателям&lt;/li&gt;
&lt;li&gt;Разработчики принуждаются работать в первую очередь с упором на
предоставление пользователям новых возможностей, а не на внедрение
новых технологий и уже после этого осознавание того, зачем это
делалось&lt;/li&gt;
&lt;li&gt;Все начинается с пресс-релиза о новых возможностях,
предоставляемых пользователям, а после чего ведется работа по
определению того факта, планировалось ли все же что-то значимое для
пользователей или нет?&lt;/li&gt;
&lt;li&gt;Дизайн должен быть минимален. Простота - залог успеха, когда речь
идет о больших распределенных системах&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Управление состояниями, как основная проблема крупномасштабных систем&lt;ul&gt;
&lt;li&gt;Изнутри они теоретически могут предоставить практически
бесконечный объем дискового пространства.&lt;/li&gt;
&lt;li&gt;Не все, но многие операции имеют состояния. Например, оформление
покупки продукта.&lt;/li&gt;
&lt;li&gt;Сервис отслеживания последних открытых страниц использует
рекомендации, базирующиеся на идентификационных номерах сессий.&lt;/li&gt;
&lt;li&gt;Они следят за всем, так что в любом случае цель вовсе не в
поддержании состояний. Достаточно небольшой набор состояний требует
поддержания с помощью сессий. Сервисы уже хранят всю необходимую
информацию, остается лишь ими воспользоваться.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Три свойства системы или теорема Eric Brewer'а:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Три свойства системы: &lt;em&gt;стабильность, доступность, переносимость
возможных распадений сети&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;В большинстве случаев для любой системы с общими данными
выполняются два свойства из трех&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Возможность разделения:&lt;/em&gt; распределение узлов по небольшим
группам, которые могут иметь доступ к другим группам, но не могут
получить доступ к конкретному произвольному узлу системы&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Стабильность:&lt;/em&gt; запишите какие-либо данные, а затем прочитайте их
же - получите те же самые данные обратно. Для распределенных систем
это далеко не всегда так.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Доступность:&lt;/em&gt; не всегда имеется возможность произвести чтение или
запись каких-либо данных. Система иногда сообщает, что она не может
произвести запись, так как она хочет остаться целостной.&lt;ul&gt;
&lt;li&gt;Для масштабирования системы необходимо разбиение ее на части, что приводит к выбору между стабильностью и доступностью. Необходимо найти некий баланс между ними.&lt;/li&gt;
&lt;li&gt;Выберите определенный подход в соответствии с нуждами сервиса.&lt;/li&gt;
&lt;li&gt;В процессе выбора продуктов приоритет предоставляется доступности: все запросы на добавление товаров в корзину учитываются, так как именно они приносят прибыль. Даже если возникают какие-либо ошибки, они скрываются от покупателя, и разработчики разбираются с ним позже.&lt;/li&gt;
&lt;li&gt;В процессе подтверждения заказа покупателем важна надежность, так как сразу несколько сервисов одновременно используют одни и те же данные: работа с кредитными картами, доставка, составление отчетов.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Для того, чтобы строить реально масштабируемые системы, Вам
    необходимо изменить свой склад ума. Вероятностный подход к хаосу
    может принести неплохие результаты. В традиционных системах мы
    представляем себе идеальный мир, где не происходит никаких
    чрезвычайных ситуаций, а затем мы в этом же мире пытаемся построить
    реализацию по-настоящему сложных алгоритмов. При первом же удобном
    случае вся система гарантированно рушится, это реальность, пора бы
    уже к этому привыкнуть. Например, неплохим решением мог бы стать
    подход, использующий быструю перезагрузку и тем самым быстрое
    восстановление работоспособности. При достаточной избыточности
    данных и сервисов этот подход может дать практически 100%
    отказоустойчивость. Необходимо создание самовосстанавливающихся и
    самоорганизующихся операций.&lt;/li&gt;
&lt;li&gt;Создание инфраструктуры, в которой компоненты ничего друг с другом
    не разделяют. Сама инфраструктура может стать общим ресурсом для
    разработки и развертывания с теми же недостатками, что и совместные
    ресурсы в логике и на уровне данных. Это может вызвать запирание и
    блокировку данных. &lt;a href="/tag/arkhitektura/"&gt;Архитектура&lt;/a&gt;, ориентированная
    на сервисы, позволяет создание параллельных изолированных процессов
    разработки, позволяющих масштабировать будущие разработки для
    соответствия темпам роста.&lt;/li&gt;
&lt;li&gt;Откройте систему с помощью собственной API для создания
    экосистемы вокруг Ваших приложений.&lt;/li&gt;
&lt;li&gt;Единственный способ управлять большой распределенной системой -
    разрабатывать ее как можно более простой. Это достигается благодаря
    отсутствию скрытых требований и зависимостей в ее структуре.
    Минимизируйте использование технологий до того уровня, который Вам
    необходим для решения конкретно Ваших проблем и задач. Создание
    дополнительных искуственных и ненужных уровней в системе никогда не
    пойдет ей на пользу.&lt;/li&gt;
&lt;li&gt;Организация вокруг сервисов дает гибкость. Параллельная работа
    возможна, так как на выходе получается сервис. Этот факт резко
    сокращает время, необходимое для выхода на рынок. Построение
    инфраструктуры позволяет сервисам реализовываться очень быстро.&lt;/li&gt;
&lt;li&gt;Определенно будут возникать проблемы со всем, что пускает пыль в
    глаза еще до реальной реализации.&lt;/li&gt;
&lt;li&gt;Для внутреннего управления сервисами стоит использовать SLA.&lt;/li&gt;
&lt;li&gt;Кто угодно может быстро добавлять веб-сервисы к их продукту.
    Достаточно лишь реализовать часть продукта в виде сервиса и начать
    его использовать.&lt;/li&gt;
&lt;li&gt;Построение инфраструктуры производится для обеспечения
    производительности, надежности и контролирования издержек. После ее
    построения Вы никогда не сможете сказать после очередной неудачи,
    что в этом виновата компания &lt;em&gt;Х&lt;/em&gt;. Ваше &lt;a href="/tag/po/"&gt;программное обеспечение&lt;/a&gt; не всегда является более надежным, чем любой
    другой, но зато у Вас появляется возможность быстро устранять
    неполадки и развертывать ее, в отличии от продуктов других компаний.&lt;/li&gt;
&lt;li&gt;Используйте систему оценивания и целенаправленные обсуждения для
    отделения "хорошего" от "плохого". Бывшие сотрудники
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; в своих презентациях неоднократно
    демонстрировали свою глубоко засевшую привычку ставить покупателей
    перед выбором и смотреть какой из вариантов сработает лучшим
    образом, и уже на результатах такого рода тестов строить свои
    решения.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/1a817e43/" rel="nofollow" target="_blank" title="http://www.kaushik.net/avinash/"&gt;Avinash Kaushik&lt;/a&gt; называет это
    избавлением от "гиппопотамов", наиболее высоко оплачиваемых людей.
    Осуществляется оно с помощью A/B тестирований и веб-аналитиков. Если
    у вас есть выбор пути развития, реализуйте оба, позвольте людям ими
    пользоваться, и посмотрите какой из альтернативных результатов
    приведет в лучшим результатам.&lt;/li&gt;
&lt;li&gt;Создайте экономичную культуру. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; использовал
    двери в роли столов, например.&lt;/li&gt;
&lt;li&gt;Знайте, что Вам необходимо. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; имеет печальный
    опыт с ранней системой рекомендаций, которая не сработала: "Это было
    не то, что требовалось &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;. Рекомендации книг в
    &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; требовали работы с разбросанными данными,
    всего лишь несколько рейтингов или покупок. Она должна работать
    быстро. Система должна иметь необходимый
    &lt;a href="/tag/masshtabiruemost/"&gt;масштаб&lt;/a&gt; для работы с массивным количеством
    клиентов и огромным каталогом. Все, что было необходимо: лишь
    усовершенствовать обнаружение книг из глубин каталога, откуда
    читатели не могли достать из самостоятельно."&lt;/li&gt;
&lt;li&gt;Работа в сторонних проектах, просто так как Вы в них заинтересованы,
    часто является намного более продуктивной и инновационной, чем
    просто работа за деньги. Никогда не недооценивайте мощь блуждания в
    той сфере, которая Вам интересна.&lt;/li&gt;
&lt;li&gt;Вовлеките всех в производство еды для собак. Пойдите на склад и
    упаковывайте книги во время рождественской суеты. Это называется
    командной работой.&lt;/li&gt;
&lt;li&gt;Создайте специальный сайт для тестирования нововведений перед
    выпуском их в вольное плавание.&lt;/li&gt;
&lt;li&gt;Непоколебимая, кластеризованная, реплицирующая, распределенная
    файловая система является идеальным решением для хранения данных,
    доступных только для чтения, используемых веб-серверами.&lt;/li&gt;
&lt;li&gt;Предусмотрите способы отменить изменения, если обновление не
    удалось. Если нужно, напишите соответствующие программные средства.&lt;/li&gt;
&lt;li&gt;Переключитесь на глубоко &lt;a href="/tag/soa/"&gt;сервис-ориентированную архитектуру&lt;/a&gt;.&lt;/li&gt;
&lt;li&gt;Во время интервью обращайте внимание на три критерия: энтузиазм,
    креативность, компетентность. Самым крупным залогом успеха
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt; был энтузиазм.&lt;/li&gt;
&lt;li&gt;Наймите Боба, кого-то кто знает свое дело, обладает невероятными
    способностями и знанием системы, и что самое важное, умеет решать
    даже самые невообразимые проблемы просто нырнув в них с головой.&lt;/li&gt;
&lt;li&gt;Инновация может прийти только снизу. Те, кто находится ближе всего к
    проблеме, являются наиболее вероятными людьми, кто смог бы ее
    решить. Любая организация, зависящая от инноваций, должна уметь
    пользоваться хаосом. Лояльность и подчинение - не наш метод.&lt;/li&gt;
&lt;li&gt;Креативность должна лезть из всех щелей.&lt;/li&gt;
&lt;li&gt;У всех должна быть возможность эксперементировать и учиться.
    Позиции, подчинение и традиции не должны играть какой-либо роли. Для
    процветания инновации балом должен править точный расчет.&lt;/li&gt;
&lt;li&gt;Выберите путь инноваций. Перед лицом всей компании, Jeff Bezos может
    дать старый кроссовок Nike в роли награды "Просто сделай это" тому,
    кто привнес инновацию.&lt;/li&gt;
&lt;li&gt;Не платите за производительность. Предоставьте хороший повод задрать
    нос и высокую оплату труда, но оставляйте это простым. Распознать
    выдающуюся работу можно и другими методами. Оплата по заслугам
    звучит неплохо, но в условиях большой организации это практически
    невозможно. Используйте не-денежные награды, такие как тот старый
    кроссовок. Если преподнести это как способ сказать спасибо, кто-то
    оценит.&lt;/li&gt;
&lt;li&gt;Вырастайте быстро. Большие парни вроде Barnes и Nobel у Вас на
    хвосте. &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt; не был ни первым, ни вторым, ни даже
    третим книжным магазинам в &lt;a href="/tag/internet/"&gt;Сети&lt;/a&gt;, но их взгляд на
    работу и драйв в итоге позволили им вырваться вперед.&lt;/li&gt;
&lt;li&gt;В дата-центрах персонал проводит только 30% времени в работе над
    вопросами создания инфраструктуры, остальные 70% они проводят за
    размещения поставок тяжелого оборудования, управлением программным
    обеспечением, балансировкой нагрузок, техническими работами,
    изменениями в масштабе и так далее.&lt;/li&gt;
&lt;li&gt;Запретите клиентам прямой доступ к базе данных. Это значит появление
    возможность масштабировать сервис и делать его более надежным не
    вовлекая при этом клиентов. Это очень похоже на возможность Google
    независимо вносить улучшения в части системы, что приводит к
    улучшениям в работе всех остальных ее компонентов.&lt;/li&gt;
&lt;li&gt;Создайте единый универсальный механизм получения доступа к сервисам.
    Это позволяет более легко агрегировать информацию, полученную от
    сервисов, децентрализованно прокладывать маршруты передачи запросов,
    распределенно следить за ними, а также получать доступ к другим
    инфраструктурным механизмам.&lt;/li&gt;
&lt;li&gt;Предоставление свободного доступа ко всем сервисам
    &lt;a href="https://www.insight-it.ru/goto/300f3b10/" rel="nofollow" target="_blank" title="http://amazon.com"&gt;Amazon.com&lt;/a&gt; разработчикам со всех уголков Мира
    также было достаточно значимым компонентом успеха, так как это
    привлекло на порядок больше инноваций, чем они могли надеяться
    построить самостоятельно.&lt;/li&gt;
&lt;li&gt;Разработчики сами знают какими инструментами они владеют лучше
    всего, какие из них делают их наиболее продуктивными.&lt;/li&gt;
&lt;li&gt;Не накладывайте слишком много ограничений на инженеров.
    Предоставляйте стимулы для использования некоторых вещей, например
    интеграцию с системами мониторинга и другими инструментами
    инфраструктуры. Для всего остального старайтесь предоставлять
    возможность командам функционировать максимально независимо.&lt;/li&gt;
&lt;li&gt;Разработчики, они как художники; они делают свою работу лучше всего
    только тогда, когда им предоставляют свободу это делать, но в любом
    случае им требуются качественные инструменты. Имейте много
    вспомогательных инструментов, имеющих само-помогающую природу.
    Поддерживайте окружение вокруг разработки сервисов, которое никогда
    не будет вмешиваться в сам процесс разработки.&lt;/li&gt;
&lt;li&gt;Вы построили это, вы и поддерживаете. Это позволяет разработчикам
    почувствовать повседневную работу их приложения, а также
    предоставляет им постоянный контакт с покупателями.&lt;/li&gt;
&lt;li&gt;Раз в пару лет разработчики должны проводить некоторое время в
    отделе по работе с клиентами. Это позволит им выслушать покупателей,
    ответить на электронные письма, и реально осознать влияние тех
    вещей, которые они реализовали с помощью как технологи.&lt;/li&gt;
&lt;li&gt;Пользуйтесь "голосом покупателя", который являлся бы реалистичной
    историей от покупателя о какой-то конкретной части сайта. Это
    поможет менеджерам и инженерам осознать тот факт, что все эти
    технологии построены для реальных людей. Статистика отдела по работе
    с клиентами является ранним индикатором того, что вы делаете что-то
    не так, а также указывает на то, что реально является болевыми
    точками для ваших покупателей.&lt;/li&gt;
&lt;li&gt;Инфраструктура &lt;a href="/tag/amazon/"&gt;Amazon&lt;/a&gt;, подобно &lt;a href="/tag/google/"&gt;Google&lt;/a&gt;,
    является огромным конкурентным преимуществом. Они могут строить
    комплексные приложения на основе примитивных сервисов, которые сами
    по себе просты до безобразия. Они могут независимо масштабировать
    свою работу, поддерживать доступность не распараллеленной системы,
    быстро реализовывать новые сервисы без необходимости массивных
    изменений в конфигурации.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sun, 17 Feb 2008 21:47:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-17:highload/2008/arkhitektura-amazon/</guid><category>Amazon</category><category>C++</category><category>Java</category><category>Jboss</category><category>Linux</category><category>Mason</category><category>online</category><category>Oracle</category><category>Perl</category><category>REST</category><category>Servlet</category><category>SOAP</category><category>архитектура</category><category>архитектура Amazon</category><category>интер информационные технологии</category><category>Масштабируемость</category></item></channel></rss>