<?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/java/feed/index.xml" rel="self"></atom:link><lastBuildDate>Thu, 19 Sep 2013 19:40:00 +0400</lastBuildDate><item><title>Вакансии: разработчики облачной IaaS платформы в Крок</title><link>https://www.insight-it.ru//vacancy/2013/vakansii-razrabotchiki-oblachnojj-iaas-platformy-v-krok/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Ведущая российская ИТ-компания ищет талантливых, креативных и энергичных
инженеров и разработчиков для развития коммерческой облачной платформы
КРОК, предоставляющей услугу типа &amp;laquo;Инфраструктура как сервис&amp;raquo; (IaaS). В современном высокотехнологичном офисе Вас ждет дружная сплоченная команда профессионалов, занимающаяся разработкой передовой &amp;laquo;облачной&amp;raquo; платформы, у которой всегда найдется для Вас множество интересных, сложных и разнообразных задач, способных удовлетворить даже самые заоблачные амбиции!&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="razrabotchik-na-platforme-linux"&gt;Разработчик на платформе Linux&lt;/h2&gt;
&lt;h3 id="obiazannosti"&gt;Обязанности&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Проектирование архитектуры компонентов &amp;laquo;облачного&amp;raquo; решения;&lt;/li&gt;
&lt;li&gt;Разработка и интеграция модулей облачной платформы;&lt;/li&gt;
&lt;li&gt;Исследования в области распределенных высоконагруженных систем.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="trebovaniia"&gt;Требования&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Опыт в области shell-программирования;&lt;/li&gt;
&lt;li&gt;Уверенное знание Python, приветствуется знание С++ или Java;&lt;/li&gt;
&lt;li&gt;Владение средствами разработки (autotools, git, svn и др.);&lt;/li&gt;
&lt;li&gt;Опыт администрирования ОС Linux от 1 года (преимущественно RHEL,
    CentOS, Debian или SLES);&lt;/li&gt;
&lt;li&gt;Опыт работы с технологиями виртуализации (Qemu/KVM, XEN, Hyper-V или
    VMware);&lt;/li&gt;
&lt;li&gt;Знание &amp;laquo;облачных&amp;raquo; технологий особенно приветствуется.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="inzhener-po-oblachnym-resheniiam_1"&gt;Инженер по облачным решениям&lt;/h2&gt;
&lt;h3 id="obiazannosti_1"&gt;Обязанности&lt;/h3&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;li&gt;Техническая поддержка внедряемых решений решения.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="trebovaniia_1"&gt;Требования&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Навыки администрирования современных ОС GNU/Linux и Windows;&lt;/li&gt;
&lt;li&gt;Понимание принципов виртуализации вычислительных ресурсов;&lt;/li&gt;
&lt;li&gt;Приветствуется опыт написания сценариев на языках shell и Python;&lt;/li&gt;
&lt;li&gt;Личные качества: коммуникабельность, общительность, активная
    жизненная позиция.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usloviia_1"&gt;Условия&lt;/h2&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;li&gt;Компания оказывает помощь при переезде в Москву (оплата стоимости
    проезда для прохождения собеседований, &amp;laquo;подъемные&amp;raquo; при выходе на
    работу).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kuda-otpravliat-reziume"&gt;Куда отправлять резюме?&lt;/h2&gt;
&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 19 Sep 2013 19:40:00 +0400</pubDate><guid>tag:www.insight-it.ru,2013-09-19:vacancy/2013/vakansii-razrabotchiki-oblachnojj-iaas-platformy-v-krok/</guid><category>autotools</category><category>C++</category><category>CentOS</category><category>Debian</category><category>Git</category><category>IaaS</category><category>Java</category><category>KVM</category><category>Linux</category><category>Python</category><category>Qemu</category><category>RHEL</category><category>SLES</category><category>SVN</category><category>Xen</category><category>вакансии</category><category>виртуализация</category><category>Крок</category><category>облачные вычисления</category></item><item><title>Вакансия: Java-разработчик</title><link>https://www.insight-it.ru//vacancy/2013/vakansiya-java-razrabotchik/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансия более не актуальна&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;В крупный тур-оператор &lt;strong&gt;Библио-Глобус&lt;/strong&gt; нужен
ответственный порядочный человек, умеющий работать в команде. Крупная
компания, динамичный бизнес, постоянно меняющиеся задачи.
&lt;!--more--&gt;&lt;/p&gt;
&lt;h2 id="chto-nuzhno-budet-delat"&gt;Что нужно будет делать?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Надо будет писать на &lt;strong&gt;Java&lt;/strong&gt; сервлеты и просто программы.&lt;/li&gt;
&lt;li&gt;Есть собственное API доступа к данным, через которые надо работать.&lt;/li&gt;
&lt;li&gt;В компании используются: &lt;strong&gt;Linux&lt;/strong&gt; (RHEL6/CentOS5),&amp;nbsp;&lt;strong&gt;nginx&lt;/strong&gt;,
    &lt;strong&gt;Java&lt;/strong&gt;, &lt;strong&gt;Oracle&lt;/strong&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="trebovaniia-k-kandidatu"&gt;Требования к кандидату&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Опыт программирования от 3-х лет.&amp;nbsp;На чем - не так важно.&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;h2 id="usloviia-raboty"&gt;Условия работы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Зарплата - 150000 рублей в месяц&lt;/li&gt;
&lt;li&gt;Полный рабочий день&lt;/li&gt;
&lt;li&gt;Офис в Москве&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kuda-otpravliat-reziume"&gt;Куда отправлять резюме?&lt;/h2&gt;
&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансия более не актуальна&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Mon, 14 Jan 2013 12:53:00 +0400</pubDate><guid>tag:www.insight-it.ru,2013-01-14:vacancy/2013/vakansiya-java-razrabotchik/</guid><category>CentOS</category><category>Java</category><category>Linux</category><category>nginx</category><category>Oracle</category><category>RHEL</category><category>Библио-Глобус</category><category>вакансия</category><category>Москва</category></item><item><title>Вакансии: развитие поведенческих технологий в рунете (СПб)</title><link>https://www.insight-it.ru//vacancy/2012/vakansii-razvitie-povedencheskikh-tekhnologijj-v-runete-spb/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;Представьте себе рекламу, которая интересна. Рекламу, которая не
раздражает, а дает персональную рекомендацию. Подобный механизм создает
компания &lt;strong&gt;RuTarget&lt;/strong&gt; - стартап, занимающийся развитием поведенческих технологий на российском рекламном рынке.
&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;Если Вы способный IT-специалист из &lt;strong&gt;Санкт-Петербурга&lt;/strong&gt;, всегда мечтали
написать систему уровня Facebook или Twitter, на одном дыхании читаете
статьи о Google Big Table и хотели бы участвовать в создании полезной
системы, возможно, одна из этих вакансий будет Вам интересна:&lt;/p&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;p&gt;Система RuTarget использует &lt;strong&gt;Real Time Bidding API&lt;/strong&gt; - аукцион показов
рекламы в режиме реального времени. За последние три года эта технология
совершила революцию в рекламе на Западе. RuTarget - одни из первых, кто
внедряет ее в России. Математический алгоритм принимает 170 миллионов
решений о показах в день, за доли секунды распознает посетителя и
подбирает полезные для него предложения, используя знания о предыдущих
его действиях в сети.&lt;/p&gt;
&lt;h3 id="rabota-v-kompanii-rutarget-eto"&gt;Работа в компании RuTarget - это:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Работа над высоконагруженным рекламным проектом, способным
    выдерживать в штатном режиме 500 миллионов запросов в день с уровнем
    доступности 99.9%.&lt;/li&gt;
&lt;li&gt;Новейшие технологии и компоненты: &lt;strong&gt;Apache Hadoop (+Pig, Hive и
    Mahout), Map-Reduce, Membase, Memcached, Redis.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Отсутствие legacy-кода и необходимости его поддержки.&lt;/li&gt;
&lt;li&gt;Работа в режиме &lt;strong&gt;Scrum, TDD.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;В коллективе только разработчики.&lt;/em&gt; У нас нет менеджеров, которые
    плохо понимают в программировании, но любят навязывать свое мнение.&lt;/li&gt;
&lt;li&gt;Интересные технические и алгоритмические задачи для любого уровня
    квалификации.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ot-sistemnogo-arkhitektora-i-starshego-razrabotchika-my-ozhidaem"&gt;От системного архитектора и старшего разработчика мы ожидаем:&lt;/h3&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;Вас не пугают фразы &amp;ldquo;коллизии в хеш-таблицах&amp;rdquo;, &amp;ldquo;минимизация
    contention&amp;rdquo;, &amp;ldquo;красно-черные деревья&amp;rdquo;, &amp;ldquo;фильтр Блума&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Вы разделяете мнение &amp;ldquo;язык и платформа для задачи, а не наоборот&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Вы считаете написание тестов частью задачи.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="senior-developer-system-architect-java_1"&gt;Senior Developer / System Architect (Java)&lt;/h2&gt;
&lt;h3 id="neobkhodimye-navyki"&gt;Необходимые навыки:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Опыт программирования на &lt;strong&gt;Java&lt;/strong&gt; в коммерческих проектах не менее
    3-х лет&lt;/li&gt;
&lt;li&gt;Глубокое понимание &lt;strong&gt;OOP&lt;/strong&gt;, опыт многопоточного программирования&lt;/li&gt;
&lt;li&gt;Опыт разработки высоконагруженных сервисов. Глубокое понимание
    принципов масштабирования и отказоустойчивости.&lt;/li&gt;
&lt;li&gt;Знание английского языка на уровне, достаточном для чтения и ведения
    документации.&lt;/li&gt;
&lt;li&gt;Опыт разработки на нескольких языках (желательно &lt;strong&gt;C/C+&lt;/strong&gt;+ или
    &lt;strong&gt;JavaScript&lt;/strong&gt;).&lt;/li&gt;
&lt;li&gt;Опыт администрирования &lt;strong&gt;Linux&lt;/strong&gt;-систем.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dopolnitelnymi-preimushchestvami-budut"&gt;Дополнительными преимуществами будут:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Общая математическая эрудиция. Знакомство с алгоритмами
    классификации и кластерного анализа, машинного обучения, &lt;strong&gt;data
    mining&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Участие в разработке рекламных сервисов, систем управления медийной
    и контекстной рекламой. Знакомство с технологиями &lt;strong&gt;RTB&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="senior-software-developer-data-mining-java_1"&gt;Senior Software Developer / Data Mining (Java)&lt;/h2&gt;
&lt;h3 id="neobkhodimye-navyki_1"&gt;Необходимые навыки:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Опыт программирования на &lt;strong&gt;Java&lt;/strong&gt; в коммерческих проектах не менее
    3-х лет.&lt;/li&gt;
&lt;li&gt;Общая математическая эрудиция. Знакомство с алгоритмами
    классификации и кластерного анализа, статистики, машинного обучения,
    data mining.&lt;/li&gt;
&lt;li&gt;Опыт работы с частью из следующих алгоритмов: &lt;strong&gt;K-Means Clustering,
    Principal Components Analysis, Decision Trees, Random Forests,
    Expectation Maximization, Support Vector Machines, Nonlinear
    Regression And Correlation.&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;Знакомство с пакетами математического и статистического анализа.&lt;/li&gt;
&lt;li&gt;Знание английского языка на уровне, достаточном для чтения и ведения
    документации.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dopolnitelnymi-preimushchestvami-budut_1"&gt;Дополнительными преимуществами будут:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Участие в разработке рекламных сервисов, систем управления медийной
    и контекстной рекламой. Знакомство с технологиями &lt;strong&gt;RTB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Опыт создания клиент-серверных или распределенных приложений.&lt;/li&gt;
&lt;li&gt;Опыт администрирования &lt;strong&gt;Linux&lt;/strong&gt;-систем.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="junior-developer-intern-java_1"&gt;Junior Developer / Intern (Java)&lt;/h2&gt;
&lt;p&gt;Для Junior Developer это возможность обучаться в коллективе
высококлассных профессионалов, а также приобрести бесценный опыт работы
с облачными сервисами. Если Вы учитесь, возможен гибкий график с учетом
посещения лекций.&lt;/p&gt;
&lt;h3 id="ot-vas-ozhidaetsia"&gt;От Вас ожидается:&lt;/h3&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;Вы разделяете мнение &amp;ldquo;язык и платформа для задачи, а не наоборот&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Фразы &lt;em&gt;&amp;ldquo;консоль Linux&amp;rdquo;&lt;/em&gt; и &lt;em&gt;&amp;ldquo;bash-скрипт&amp;rdquo;&lt;/em&gt; вас как минимум не пугают.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="neobkhodimye-navyki_2"&gt;Необходимые навыки:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Опыт программирования на &lt;strong&gt;Java&lt;/strong&gt; не менее 1 года.&lt;/li&gt;
&lt;li&gt;Понимание принципов &lt;strong&gt;OOP&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Знание английского языка на уровне, достаточном для чтения и ведения
    документации.&lt;/li&gt;
&lt;li&gt;Опыт администрирования &lt;strong&gt;Linux&lt;/strong&gt;-систем.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="dopolnitelnymi-preimushchestvami-budut_2"&gt;Дополнительными преимуществами будут:&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Общая математическая эрудиция. Знакомство с алгоритмами
    классификации и кластерного анализа, машинного обучения, data
    mining.&lt;/li&gt;
&lt;li&gt;Участие в разработке рекламных сервисов, систем управления медийной
    и контекстной рекламой. Знакомство с технологиями &lt;strong&gt;RTB&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Опыт создания клиент-серверных или распределенных приложений.&lt;/li&gt;
&lt;li&gt;Опыт разработки на нескольких языках (&lt;strong&gt;C/C++&lt;/strong&gt; или &lt;strong&gt;JavaScript&lt;/strong&gt;).&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="usloviia-raboty_1" style="text-align: center;"&gt;Условия работы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Зарплата по результатам собеседования:&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;System Architect&lt;/strong&gt; от 90 тыс. рублей&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Senior Software&lt;/strong&gt; &lt;strong&gt;Developer&lt;/strong&gt; от 70 тыс. рублей&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Junior Developer&lt;/strong&gt; от 30 тыс. рублей&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;/li&gt;
&lt;li&gt;Возможность удаленной работы из дома при необходимости.&lt;/li&gt;
&lt;li&gt;Полная рабочая неделя в офисе в &lt;strong&gt;Санкт-Петербурге&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;После собеседования Вас могут попросить выполнить тестовое задание.&lt;/p&gt;
&lt;p&gt;При подаче резюме опишите, пожалуйста, отдельно свой непосредственный
опыт и знания, которые будут наиболее полезны для проекта, и укажите,
что узнали о вакансии через &lt;span class="trebuchet"&gt;Insight IT&lt;/span&gt;.&lt;/p&gt;
&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансии более не актуальны&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Mon, 04 Jun 2012 13:35:00 +0400</pubDate><guid>tag:www.insight-it.ru,2012-06-04:vacancy/2012/vakansii-razvitie-povedencheskikh-tekhnologijj-v-runete-spb/</guid><category>Java</category><category>RuTarget</category><category>вакансии</category></item><item><title>Java-программист (вакансия закрыта)</title><link>https://www.insight-it.ru//vacancy/2011/java-programmist-vakansiya/</link><description>&lt;div class="card orange darken-3"&gt;
&lt;p&gt;&lt;div class="card-content white-text center"&gt;
&lt;strong&gt;Вакансия более не актуальна&lt;/strong&gt;
&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;В крупный тур-оператор Библио-Глобус нужен
ответственный порядочный человек, умеющий работать в команде. Бизнес
динамичен, крупная компания, задачи постоянно меняются.
&lt;!--more--&gt;&lt;/p&gt;
&lt;h2 id="chto-nado-budet-delat"&gt;Что надо будет делать?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Надо будет писать на Java сервлеты и просто программы.&lt;/li&gt;
&lt;li&gt;Есть собственное API доступа к данным, через которые надо работать.&lt;/li&gt;
&lt;li&gt;В компании используются: Linux (RHEL6/CentOS5),&amp;nbsp;nginx, Java, Oracle&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="trebovaniia-k-kandidatu"&gt;Требования к кандидату&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Опыт программирования от 3-х лет.&amp;nbsp;На чем - не важно.&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;h2 id="usloviia-raboty"&gt;Условия работы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Зарплата: 90000р. в месяц&lt;/li&gt;
&lt;li&gt;Москва, офис&lt;/li&gt;
&lt;li&gt;Полный рабочий день&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kuda-otpravliat-reziume"&gt;Куда отправлять резюме?&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Антонов Игорь Константинович, IT Директор&lt;/li&gt;
&lt;/ul&gt;
&lt;h1 id="vy-opozdali-vakansiia-zakryta_1"&gt;Вы опоздали, вакансия закрыта!&lt;/h1&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Tue, 07 Jun 2011 18:33:00 +0400</pubDate><guid>tag:www.insight-it.ru,2011-06-07:vacancy/2011/java-programmist-vakansiya/</guid><category>CentOS</category><category>Java</category><category>Linux</category><category>nginx</category><category>Oracle</category><category>RHEL</category><category>Библио-Глобус</category><category>вакансия</category><category>Москва</category></item><item><title>Архитектура Одноклассников</title><link>https://www.insight-it.ru//highload/2011/arkhitektura-odnoklassnikov/</link><description>&lt;p&gt;Сегодня представители &lt;a href="https://www.insight-it.ru/goto/2c99aef2/" rel="nofollow" target="_blank" title="http://www.odnoklassniki.ru"&gt;Одноклассников&lt;/a&gt;
рассказали о накопленном за 5 лет опыте по поддержанию высоконагруженного
проекта. Была опубликована довольно детальная информация о том, как
устроена эта социальная сеть для аудитории "постарше". Далее можно
прочитать мою версию материала, либо перейти на оригинал &lt;a href="https://www.insight-it.ru/goto/b762a864/" rel="nofollow" target="_blank" title="http://habrahabr.ru/company/odnoklassniki/blog/115881/"&gt;по сссылке&lt;/a&gt;.&lt;/p&gt;
&lt;!--more--&gt;
&lt;h2 id="platforma"&gt;Платформа&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/windows/"&gt;Windows&lt;/a&gt; и &lt;a href="/tag/opensuse/"&gt;openSUSE&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/c/"&gt;С/С++&lt;/a&gt; - для некоторых модулей&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/gwt/"&gt;GWT&lt;/a&gt; - реализация динамического веб-интерфейса&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/tomcat/"&gt;Apache Tomcat&lt;/a&gt; - сервера приложений&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/jboss/"&gt;JBoss 4&lt;/a&gt; - сервера бизнес-логики&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lvs/"&gt;LVS&lt;/a&gt; и &lt;a href="/tag/ipvs/"&gt;IPVS&lt;/a&gt; - балансировка нагрузки&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/mssql/"&gt;MS SQL 2005 и 2008&lt;/a&gt; - основная СУБД&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/berkleydb/"&gt;BerkleyDB&lt;/a&gt; - дополнительная СУБД&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lucene/"&gt;Apache Lucene&lt;/a&gt; - индексация и поиск текстовой
    информации&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="statistika"&gt;Статистика&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;До 2.8 млн. пользователей онлайн в часы пик&lt;/li&gt;
&lt;li&gt;7,5 миллиардов запросов в день (150 000 запросов в секунду в часы
    пик)&lt;/li&gt;
&lt;li&gt;2 400 серверов и систем хранения данных, из которых 150 являются
    веб-серверами&lt;/li&gt;
&lt;li&gt;Сетевой трафик в час пик: 32 Gb/s&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="oborudovanie"&gt;Оборудование&lt;/h2&gt;
&lt;p&gt;Сервера используются двухпроцессорные с 4 ядрами, объемом памяти от 4 до
48 Гб. В зависимости от роли сервера данные хранятся либо в памяти, либо
на дисках, либо на внешних системах хранения данных.&lt;/p&gt;
&lt;p&gt;Все оборудование размещено в 3 датацентрах, объединенных в оптическое
кольцо. На данный момент на каждом из маршрутов пропускная способность
составляет 30Гбит/с. Каждый из маршрутов состоит из физически
независимых друг от друга оптоволоконных пар, которые агрегируются в
общую &amp;ldquo;трубу&amp;rdquo; на корневых маршрутизаторах.&lt;/p&gt;
&lt;p&gt;Сеть физически разделена на внутреннюю и внешнюю, разные интерфейсы
серверов подключены в разные коммутаторы и работают в разных сетях. По
внешней сети HTTP сервера, общаются с Интернетом, по внутренней сети все
сервера общаются между собой.&amp;nbsp;Топология внутренней сети &amp;ndash; звезда.
Сервера подключены в L2 коммутаторы (access switches), которые, в свою
очередь, подключены как минимум двумя гигабитными линками к aggregation
стеку маршрутизаторов. Каждый линк идет к отдельному коммутатору в
стеке. Для того, чтобы эта схема работала, используется
протокол&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/a03e0548/" rel="nofollow" target="_blank" title="http://ru.wikipedia.org/wiki/RSTP"&gt;RSTP&lt;/a&gt;. При необходимости,
подключения access коммутаторов к agregation стеку осуществляются более
чем двумя линками с использованием link aggregation портов.&amp;nbsp;Aggregation
коммутаторы подключены 10Гб линками в корневые маршрутизаторы, которые
обеспечивают как связь между датацентрами, так и связь с внешним
миром.&amp;nbsp;Используются коммутаторы и маршрутизаторы от компании Cisco.&lt;/p&gt;
&lt;p&gt;Для связи с внешним миром используются прямые подключения с несколькими
крупнейшими операторами связи, общий сетевой&amp;nbsp;трафик в часы пик доходит
до 32Гбит/с.&lt;/p&gt;
&lt;h2 id="arkhitektura"&gt;Архитектура&lt;/h2&gt;
&lt;p&gt;Архитектура проекта имеет традиционную многоуровневую структуру:&lt;/p&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;li&gt;уровень инфраструктуры (логирование, конфигурация и мониторинг).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Код проекта в целом написан на Java, но есть исключения в виде модулей
для кэширования на C и C++.
Java был выбран так как он является удобным языком для разработки,
доступно множество наработок в различных сферах, библиотек и opensource
проектов.&lt;/p&gt;
&lt;h3 id="prezentatsionnyi-uroven"&gt;Презентационный уровень&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Используем собственный фреймворк, позволяющий строить композицию
    страниц на языке Jаvа, с использованием собственные GUI фабрик (для
    оформления текста, списков, таблиц и портлетов).&lt;/li&gt;
&lt;li&gt;Страницы состоят из независимых блоков (обычно портлетов), что
    позволяет обновлять информацию на них частями с помощью AJAX
    запросов.&lt;/li&gt;
&lt;li&gt;При данном подходе одновременно обеспечивается минимум перезагрузок
    страниц для пользователей с включенным JavaScript, так и полная
    работоспособность сайта для пользователей, у которых он отключен.&lt;/li&gt;
&lt;li&gt;Google Web Toolkit используется для реализации функциональные
    компонент, таких как Сообщения, Обсуждения и Оповещения, а также все
    динамических элементов (меню шорткатов, метки на фотографиях,
    сортировка фотографий,&amp;nbsp;ротация подарков и.т.д.).&amp;nbsp;В GWT используются
    UIBinder и HTMLPanel для создания интерфейсов.&lt;/li&gt;
&lt;li&gt;Кешируются все внешние ресурсы (Expires и Cache-Control заголовки).
    CSS и JavaScript файлы минимизируются и сжимаются (gzip).&lt;/li&gt;
&lt;li&gt;Для уменьшения количества HTTP запросов с браузера, все JavaScript и
    CSS файлы объединяются в один. Маленькие графические изображения
    объединяются в спрайты.&lt;/li&gt;
&lt;li&gt;При загрузке страницы скачиваются только те ресурсы, которые на
    самом деле необходимы для начала работы.&lt;/li&gt;
&lt;li&gt;Никаких универсальных CSS селекторов. Стараются не использовать
    типовые селекторы (по имени тэга), что повышает скорость отрисовки
    страниц внутри браузера.&lt;/li&gt;
&lt;li&gt;Если необходимы CSS expressions, то пишутся &amp;laquo;одноразовые&amp;raquo;. По
    возможности избегаются фильтры.&lt;/li&gt;
&lt;li&gt;Кешируется обращения к DOM дереву, а так же свойства элементов,
    приводящие к reflow. Обновляется DOM дерево в &amp;laquo;оффлайне&amp;raquo;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="uroven-biznes-logiki_1"&gt;Уровень бизнес-логики&lt;/h2&gt;
&lt;p&gt;На уровне бизнес логики располагаются около 25 типов серверов и
компонентов, общающихся между собой через удаленные интерфейсы. Каждую
секунду происходит около 3 миллионов удаленных запросов между этими
модулями.
Сервера на уровне бизнес логики разбиты на группы. Каждая группа
обрабатывает различные события. Есть механизм маршрутизации событий, то
есть любое событие или группу событий можно выделить и направить на
обработку на определенную группу серверов.&amp;nbsp;При общении серверов между
собой используется свое решение, основанное на&amp;nbsp;&lt;a href="https://www.insight-it.ru/goto/cba3bf92/" rel="nofollow" target="_blank" title="http://jbossremoting.jboss.org/"&gt;JBoss
Remoting&lt;/a&gt;.&lt;/p&gt;
&lt;h2 id="uroven-keshirovaniia"&gt;Уровень кэширования&lt;/h2&gt;
&lt;p&gt;Для кэширования данных используется самописный модуль
odnoklassniki-cache. Он предоставляет возможность хранения данных в
памяти средствами Java Unsafe. Кэшируются все данные, к которым
происходит частое обращение, например: профили пользователей, списки
участников сообществ, информация о самих сообществах, граф связей
пользователей и групп, праздники, мета информация о фотографиях и многое
другое.Для хранения больших объемов данных в памяти используется память
Java off heap memory для снятия ненужной нагрузки с сборщика
мусора.&amp;nbsp;Кеши могут использовать локальный диск для хранения данных, что
превращает их в высокопроизводительный сервер БД.&amp;nbsp;Кеш сервера, кроме
обычных операций ключ-значение, могут выполнять запросы по данным,
хранящимся в памяти, минимизируют таким образом передачу данных по сети.
Используется map-reduce для выполнения запросов и операций на кластере.
В особо сложных случаях, например для реализации запросов по социальному
графу, используется язык C. Это помогает повысить производительность.&lt;/p&gt;
&lt;p&gt;Данные распределяются между кластерами кеш серверов, а также
используется репликация партиций для обеспечения надежности.&amp;nbsp;Иногда
требования к быстродействию настолько велики, что используются локальные
короткоживущие кеши данных полученных с кеш серверов, расположенные
непосредственно в памяти серверов бизнес логики.&lt;/p&gt;
&lt;p&gt;Для примера, один сервер, кэширующий граф связей пользователей, в час
пик может обработать около 16 600 запросов в секунду. Процессоры при
этом заняты до 7%, максимальный load average за 5 минут &amp;mdash; 1.2.
Количество вершин графа - более 85 миллионов, связей 2.5 миллиарда. В
памяти граф занимает 30 GB.&lt;/p&gt;
&lt;h2 id="uroven-baz-dannykh"&gt;Уровень баз данных&lt;/h2&gt;
&lt;p&gt;Суммарный объем данных без резервирования составляет 160Тб. Используются
два решения для хранения данных: MS SQL и BerkeleyDB. Данные хранятся в
нескольких копиях, в зависимости от их типа от двух до четырех. Полное
резервное копирование всех данных осуществляется раз в сутки, плюс
каждые 15 минут делаются резервные копии новых данных. В результате
максимально возможная потеря данных составляет 15 минут.&lt;/p&gt;
&lt;p&gt;Сервера с MS SQL объединены в failover кластера, при выходе из строя
одного из серверов, находящийся в режиме ожидания сервер берет на себя
его функции. Общение с MS SQL происходит посредством JDBC драйверов.&lt;/p&gt;
&lt;p&gt;Используются как вертикальное, так и горизонтальное разбиение данных,
т.е. разные группы таблиц располагаются на разных серверах (вертикальное
партиционирование), а данные больших таблицы дополнительно
распределяются между серверами (горизонтальное партиционирование).
Встроенный в СУБД аппарат партиционирования не используется &amp;mdash; весь
процесс реализован на уровне бизнес-логики.&amp;nbsp;Распределенные транзакции не
используются &amp;mdash; всё только в пределах одного сервера. Для обеспечения
целостности, связанные данные помещаются на один сервер или, если это
невозможно, дополнительно разрабатывается логика обеспечения целостности
данных.&amp;nbsp;В запросах к БД не используются JOIN даже среди локальных таблиц
для минимизации нагрузки на CPU. Вместо этого используется
денормализация данных или JOIN происходят на уровне бизнес сервисов, что
позволяет осуществлять JOIN как с данными из баз данных, так и с данными
из кэша.&amp;nbsp;При проектировании структуры данных не используются внешние
ключи, хранимые процедуры и триггеры. Опять же для снижения потребления
вычислительных ресурсов на серверах баз данных.
SQL операторы DELETE также используются с осторожностью &amp;mdash; это самая
тяжелая операция. Данные удаляются чаще всего через маркер: запись
сначала отмечается как удаленная, а потом удаляется окончательно с
помощью фонового процесса.&amp;nbsp;Широко используются индексы, как обычные, так
и кластерные. Последние для оптимизации наиболее высокочастотных
запросов в таблицу.&lt;/p&gt;
&lt;p&gt;Используется C реализация BerkleyDB версии 4.5. Для работы с BerkleydDB
используется своя библиотека, позволяющая организовывать двухнодовые
master-slave кластера с использованием родной BDB репликация. Запись
происходит только в master, чтение происходит с обеих нод. Данные
хранятся в tmpfs, transaction логи сохраняются на дисках. Резервная
копия логов делается каждые 15 минут. Сервера одного кластера размещены
на разных лучах питания дабы не потерять обе копии одновременно. Помимо
прочего, BerkleyDB используется и в роли очереди заданий.&lt;/p&gt;
&lt;p&gt;Внутри системы используется взвешенный round robin, а также вертикальное
и горизонтальное разбиение данных как на уровне СУБД, так и на уровне
кэширования.&lt;/p&gt;
&lt;p&gt;В разработке новое решение для хранения данных, так как необходим еще
более быстрый и надежный доступ к данным.&lt;/p&gt;
&lt;h2 id="uroven-infrastruktury"&gt;Уровень инфраструктуры&lt;/h2&gt;
&lt;p&gt;Для агрегации статистики используется собственная библиотека, основанная
на log4j. Сохраняется такая информация, как количество вызовов, среднее,
максимальное и минимальное время выполнения, количество ошибок. Данные
сохраняются во временные базы, но раз в минуту данные переносятся из них
в общий склад данных (data warehouse), а временные базы очищаются. Сам
склад реализован на базе решений от Microsoft: MS SQL 2008 и сиситема
генерации отчетов Reporting Services. Он расположен на 13 серверах,
находящихся в отдельной от production среде. Некоторые из них отвечают
за статистику в реальном времени, а некоторые за ведение и
предоставление доступа к архиву. Общий объем статистических данных
составляет 13Тб.&amp;nbsp;Планируется внедрение многомерного анализа статистики
на основе OLAP.&lt;/p&gt;
&lt;p&gt;Управление сервисами происходит через самописную централизованную
систему конфигурации. Через веб-интерфейс доступно изменение
расположения портлетов, конфигурации кластеров, изменение логики
сервисов и прочее. Вся конфигурация сохраняется в базе данных. Каждый из
серверов периодически проверяет, есть ли обновления для приложений,
которые на нем запущены, и, если есть, применяет их.&lt;/p&gt;
&lt;p&gt;Мониторинг логически разделен на две части:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Мониторинг сервисов и компонентов&lt;/li&gt;
&lt;li&gt;Мониторинг ресурсов, оборудования и сети&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Система мониторинга сервисов также самописная и основывается на
оперативных данных с упомянутого выше склада. Мониторинг ресурсов и
здоровья оборудования же онован на Zabbix, а статистика по
использованию ресурсов серверов и сети накапливаетя в Cacti.&amp;nbsp;Для
предпринятия мер по устранению чрезвычайных ситуаций работают дежурные,
которые следят за всеми основными параметрами.&amp;nbsp;Оповещения о наиболее
критичных аномалиях приходят по смс, остальные оповещения отсылаются по
емейлу.&lt;/p&gt;
&lt;h2 id="komanda"&gt;Команда&lt;/h2&gt;
&lt;p&gt;Над проектом работают около 70 технических специалистов:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;40 разработчиков;&lt;/li&gt;
&lt;li&gt;20 системных администраторов и инженеров;&lt;/li&gt;
&lt;li&gt;8 тестеров.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Все разработчики разделены на небольшие команды до 3х человек. Каждая из
команд работает автономно и разрабатывает либо какой-то новый сервис,
либо работает над улучшением существующих. В каждой команде есть
технический лидер или архитектор, который ответственен за архитектуру
сервиса, выбор технологий и подходов. На разных этапах к команде могут
примыкать дизайнеры, тестеры и системные администраторы.&lt;/p&gt;
&lt;p&gt;Разработка ведется итерациями в несколько недель. Как пример жизненного
цикла разработки можно привести 3х недельный цикл:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;определение архитектуры;&lt;/li&gt;
&lt;li&gt;разработка, тестирование на компьютерах разработчиков;&lt;/li&gt;
&lt;li&gt;тестирование на pre-production среде, релиз на production среду.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Практически весь новый функционал делается &amp;laquo;отключаемым&amp;raquo;, типичный
процесс запуска новой функциональной возможности:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Функционал разрабатывается и попадает в production релиз;&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;/ul&gt;
&lt;h2 id="podvodim-itogi"&gt;Подводим итоги&lt;/h2&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;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Tue, 22 Mar 2011 00:17:00 +0300</pubDate><guid>tag:www.insight-it.ru,2011-03-22:highload/2011/arkhitektura-odnoklassnikov/</guid><category>BerkleyDB</category><category>C. GWT</category><category>IPVS</category><category>Java</category><category>Jboss</category><category>Lucene</category><category>LVS</category><category>MSSQL</category><category>openSUSE</category><category>Tomcat</category><category>Windows</category><category>Архитектура Одноклассников</category><category>Масштабируемость</category><category>Одноклассники</category></item><item><title>Архитектура Mollom</title><link>https://www.insight-it.ru//highload/2011/arkhitektura-mollom/</link><description>&lt;p&gt;&lt;img alt="Mollom" class="right" src="https://www.insight-it.ru/images/mollom-logo.jpg" title="Mollom"/&gt;
&lt;a href="https://www.insight-it.ru/goto/aa3c2fd2/" rel="nofollow" target="_blank" title="http://mollom.com/"&gt;Mollom&lt;/a&gt; - это прибыльный SaaS сервис по фильтрации различных форм спама из
контента, сгенерированного пользователями: комментариев, постов на
форумах и блогах, опросов, контактных и регистрационных форм.
Определение спама основано не только на контенте, но и репутации и
прошлой активности разместившего его пользователя. Алгоритм машинного
обучения Mollom выполняет роль цифрового модератора 24х7 для более 40
тысяч сайтов, в том числе и очень крупных компаний.&lt;/p&gt;
&lt;p&gt;С того момента, как Mollom запустили систему анализа цифрового контента,
они выявили более 373 миллионов спам сообщений, обнаружив в процессе что
впечатляющие 90% всех прошедших через них сообщений оказались спамом.
Весь этот поток спама в 100 сообщений в секунду обрабатывается всего
двумя географически распределенными серверами. На каждом из них работает
сервер Java-приложений и Cassandra. Так мало ресурсов требуется лишь
из-за того, что они создали очень эффективную систему машинного
обучения. Разве не круто? Так как же они это делают?&lt;!--more--&gt;&lt;/p&gt;
&lt;h2 id="statistika"&gt;Статистика&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Обслуживаются 40000 активных веб-сайтов, многие их которых
    принадлежат крупным клиентам, таким как Adobe, Sony BMG, Warner
    Brothers, Fox News и The Economist. Много крупных брендов, с
    крупными сайтами, масса комментариев.&lt;/li&gt;
&lt;li&gt;Обнаруживают пол-миллиона спам-сообщений ежедневно.&lt;/li&gt;
&lt;li&gt;Обрабатывается около 100 запросов к API в секунду.&lt;/li&gt;
&lt;li&gt;Проверка сообщения на спам занимает очень мало времени, обычно около
    30-50 миллисекунд, 95% запросов укладывается в 250 миллисекунд,
    когда самые медленные обрабатываются пол секунды.&lt;/li&gt;
&lt;li&gt;Эффективность определения спама составляет 99.95%. Это означает, что
    из 10000 спам-сообщений Mollom пропустит только 5.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/82e0a09b/" rel="nofollow" target="_blank" title="http://mollom.com/blog/netlog-using-mollom"&gt;Netlog&lt;/a&gt;, европейская
    социальная сеть, имеет отдельный Mollom-сервер в своем датацентре.
    Netlog проверяют на спам около 4 миллионов сообщений каждый день на
    классификаторах, специально натренированных на их данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="platforma"&gt;Платформа&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&gt; - исторически сложилось, что Mollom был с самого
    начала был разработан на Java.&lt;/li&gt;
&lt;li&gt;Два сервера обслуживают основную часть клиентов:&lt;ul&gt;
&lt;li&gt;Один сервер на восточном побережье США, другой - на западном&lt;/li&gt;
&lt;li&gt;В случае сбоя один сервер может полностью подменить другой&lt;/li&gt;
&lt;li&gt;Конфигурация обоих: Intel Xeon Quad core, 2.8GHz, 16GB RAM, 4
    диска по 300 GB, RAID 10.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/ad66f2bf/" rel="nofollow" target="_blank" title="http://www.softlayer.com/"&gt;SoftLayer&lt;/a&gt; - хостинг-провайдер.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/baf11ec8/" rel="nofollow" target="_blank" title="http://cassandra.apache.org/"&gt;Cassandra&lt;/a&gt; - NoSQL база данных,
    выбранная из-за высокой производительности на запись и способности
    работать на серверах, располагающихся в разных датацентрах (была
    разработана в&amp;nbsp;&lt;a href="https://www.insight-it.ru/highload/2010/arkhitektura-facebook/"&gt;Facebook&lt;/a&gt;,
    но там практически не используется).&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/dce103e6/" rel="nofollow" target="_blank" title="http://www.mysql.com/"&gt;MySQL&lt;/a&gt; - Java Persistence API используется
    для обычных наборов данных, когда Cassandra используется для больших
    объемов данных.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/2b056aff/" rel="nofollow" target="_blank" title="http://en.wikipedia.org/wiki/GlassFish"&gt;Glassfish&lt;/a&gt; - open source
    сервер приложений для платформы Java EE. Они выбрали именно
    Glassfish за его возможности корпоративного уровня, такие как
    репликация и обработка сбоев.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/cc84f430/" rel="nofollow" target="_blank" title="http://hudson-ci.org/"&gt;Hudson&lt;/a&gt; - предоставляет непрерывное
    тестирование и развертывание кода серверной части на всех
    используемых машинах.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/f94e85c8/" rel="nofollow" target="_blank" title="http://munin-monitoring.org/"&gt;Munin&lt;/a&gt; - измерение и построение
    графиков, касающихся здоровья серверов.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/cfd5a6c7/" rel="nofollow" target="_blank" title="http://www.pingdom.com/"&gt;Pingdom&lt;/a&gt; - внешний мониторинг.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/acf8f59d/" rel="nofollow" target="_blank" title="http://www.zendesk.com/"&gt;Zendesk&lt;/a&gt; - используется для оказания
    поддержки клиентам.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/17f204ac/" rel="nofollow" target="_blank" title="http://drupal.org/"&gt;Drupal&lt;/a&gt; - используется для основного сайта со
    специализированным модулем интернет-магазина.&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a81d9bb9/" rel="nofollow" target="_blank" title="http://unfuddle.com/"&gt;Unfuddle&lt;/a&gt; - хостинг Subversion для
    взаимодействия удаленной команды разработчиков.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="kak-eto-rabotaet"&gt;Как это работает?&lt;/h2&gt;
&lt;p&gt;Процесс выглядит следующим образом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Когда пользователь отправляет комментарий на сайт, происходит запрос
    к API Mollom.&lt;/li&gt;
&lt;li&gt;Контент анализируется, если он оказывается спамом, то сайту
    сообщается, что необходимо его заблокировать, если же алгоритм не
    уверен на 100% - сайту советуют показать CAPTCHA, которую сервис
    также предоставляет.&lt;/li&gt;
&lt;li&gt;После того, как CAPTCHA будет успешно заполнена, контент
    принимается. В большинстве случаев пользователи не будут ее видеть и
    контент будет приниматься сразу же.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Обнаружение спама является сложным балансом между отказом нормальному
контенту и принятию спама.&lt;/p&gt;
&lt;h2 id="biznes-model"&gt;Бизнес-модель&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Основным залогом популярности Mollom является бесплатная возможность
    попробовать сервис, ограничение составляет 100 нормальных (не спам)
    сообщений в день. Небольшие сайты могут никогда и не достичь этого
    ограничения.&lt;/li&gt;
&lt;li&gt;Далее есть два тарифа: 1 евро в день и 3600 евро с возможностями
    вполне соответствующими этим суммам&lt;/li&gt;
&lt;li&gt;Сайты, использующие бесплатный тариф, вовсе не зря тратят ресурсы
    системы, как кажется на первый взгляд, а являются жизненно-важным
    источником данных для тренировки системы. Без этих данных алгоритмы
    были бы существенно менее точны.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="arkhitektura"&gt;Архитектура&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Разработчики Mollom уделяют максимум внимания времени отклика,
    эффективности кода и использования серверных ресурсов.&lt;/li&gt;
&lt;li&gt;Физически каждый сервер может справиться со всеми запросами, два
    сервера нужны для избежания перерывов в работе системы. Когда оба
    сервера в строю - работа распределяется между ними, когда один
    падает - второй перехватывает его запросы.&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Mollom прошел через несколько этапов развития:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Изначально маленькая команда из двух человек работала вечерами
    над основными алгоритмами, классификаторами и реальными
    бизнес-задачами, которые они пытались решить. Для построения
    инфраструктуры серверной части они использовали свои реализации
    базовых механизмов по управлению ресурсами, соединениями и
    потоками. В итоге они обнаружили, что тратят слишком много
    времени на эти вещи. После этого они переключились на Glassfish,
    что позволило им намного меньше беспокоится об управлении
    памятью, REST-запросах, парсинге XML и поддержании пула
    соединений с базой данных.&lt;/li&gt;
&lt;li&gt;В прошлом основной проблемой была пропускная способность
    дисковой подсистемы. Они должны хранить информацию о репутации
    всех IP-адресов и URL по всему Интернету, что привело к
    массивному набору данных с большим количеством случайных
    обращений.&lt;/li&gt;
&lt;li&gt;Поначалу они использовали MySQL на недорогой виртуальной машине,
    что в итоге не смогло масштабироваться.&lt;/li&gt;
&lt;li&gt;Они перенесли данные на твердотельные жесткие диски (SSD) и
    стали все хранить в файлах. Этот шаг решил проблемы с записью,
    но возникли новые проблемы:&lt;ol&gt;
&lt;li&gt;Это правда дорого.&lt;/li&gt;
&lt;li&gt;Очень чувствительно к типу используемой файловой системы&lt;/li&gt;
&lt;li&gt;Запись стала происходить быстрой, но итерация по большим
    наборам данным (что они делали довольно часто для очистки
    данных и обучения классификаторов) по-прежнему была очень
    медленным процессом.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;В итоге они отказались от твердотельных накопителей и стали
    использовать Cassandra.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Cassandra сейчас используется для обработки интенсивного потока
    запросов на запись и в роли кэша:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Работает на RAID10, что хорошо подходит для высоких смешанных
    нагрузок на запись/чтение.&lt;/li&gt;
&lt;li&gt;Cassandra оптимизирована для записи, а в Mollom запись как раз
    происходит намного чаще, чем чтение.&lt;/li&gt;
&lt;li&gt;Разработана для распределенной работы как внутри датацентра, так
    и между датацентрами.&lt;/li&gt;
&lt;li&gt;Обратной стороной медали является отсутствие стандартного NoSQL
    интерфейса, что усложняет реализацию приложений.&lt;/li&gt;
&lt;li&gt;Механизм кэширования строк в Cassandra позволяет им не
    использовать отдельную систему для кэширования, что существенно
    упростило код приложения.&lt;/li&gt;
&lt;li&gt;Cassandra имеет функцию удаления устаревшей информации после
    определенного периода времени. В Европе существуют строгие
    законы о приватности личных данных, согласно которым они должны
    храниться не более определенного срока (штаб-квартира Mollom
    находится в Бельгии). В этом плане эта функция очень удобна.
    Эта функция опять же избавляет от необходимости реализовывать
    данный функционал вручную.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Типичный путь одного комментария внутри системы:&lt;ul&gt;
&lt;li&gt;Балансировка нагрузки между серверами лежит на клиентской
    библиотеке, в роли типичного клиента может выступать сайт на
    Drupal, осуществляющий запрос к API через XML-RPC или REST.&lt;/li&gt;
&lt;li&gt;Запросы обрабатываются сервером приложений Glassfish и проходят
    стандартный процесс обработки с помощью сервлетов и специфичных
    классов.&lt;/li&gt;
&lt;li&gt;Платящие клиенты обслуживаются в первую очередь, что приводит к
    тому, что клиенты на бесплатном тарифе могут ожидать результата
    несколько дольше.&lt;/li&gt;
&lt;li&gt;Запрос анализируется и оценка вероятности спама возвращается
    пользователю. Помимо этого отдельная часть кода Mollom отвечает
    за генерацию, выдачу и проверку CAPTCHA.&lt;/li&gt;
&lt;li&gt;Классификаторы полностью располагаются в оперативной памяти.
    Небольшой кусок контента разбивается на тысячи и тысячи
    крошечных частей, которые могут быть идентифицированы как спам.
    Такие классификаторы хранят в памяти до нескольких миллионов
    признаков, характерных для спама. Анализ должен выполняться
    очень быстро, так что никаких других вариантов кроме
    расположения всех требуемых данных в оперативной памяти просто
    не было.&lt;/li&gt;
&lt;li&gt;В Cassandra хранятся очки репутации, частоты, URL и IP-адреса.&lt;/li&gt;
&lt;li&gt;Струтуры данных в памяти не реплицируются напрямую. Они
    записываются в Cassandra, которая и передает их на второй
    сервер. Промежуток времени, когда данные не консистентны, очень
    невелик, так что это не сказывается негативно на алгоритмах.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Балансировка нагрузки с помощью клиента:&lt;ul&gt;
&lt;li&gt;Mollom использует такой подход к балансировке, так как стартап
    не может себе позволить дорогой железный балансировщик нагрузки.
    Если учесть, что им нужна балансировка между датацентрами,
    решение от любого из вендоров было бы комплексным и дорогим.&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;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Машинное обучение:&lt;ul&gt;
&lt;li&gt;Mollom - это набор самообучающихся систем. Отдельные
    CAPTCHA-решения, не учитывают ни пользовательское поведение, ни
    источник контента, заставляя каждого пользователя вводить
    проверочный код при каждом сообщении. В случае с Mollom это
    происходит только когда система анализа контента не уверена в
    конкретном решении.&lt;/li&gt;
&lt;li&gt;Средняя длина сообщения - 500 символов, обычно оно разбивается
    на 3000 характеристик. Принадлежность контента к спаму
    определяется путем оценки репутации IP адреса или Open ID,
    пользовательского идентификатора, эмоциональной окраски, языка,
    профанации, проверки на наличие специфичных слов и фраз, также
    учитывается качество написания текста и многие другие факторы.
    Все эти данные основываются на классификаторах. Некоторые из них
    статистические по природе, так что обучение происходит
    автоматически. Другие же основываются на правилах для того,
    чтобы быть уверенными, что они никогда не могут быть настроены
    неверно. Комбинация результатов всех тестов после нормализации и
    образует финальный рейтинг принадлежности к спаму каждого
    конкретного сообщения.&lt;/li&gt;
&lt;li&gt;Классификаторы и внутренние метрики обучаются с каждым новым
    сообщением и обновляются в реальном времени.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Glassfish берет на себя планировку нагрузки, учитывая многоядерность
    системы:&lt;ul&gt;
&lt;li&gt;Ключ к дизайну системы в многопроцессорном окружении заключается
    в максимальном параллелизации работы при минимальном простое
    из-за блокировок.&lt;/li&gt;
&lt;li&gt;Они используют 16 thread'ов на сервер.&lt;/li&gt;
&lt;li&gt;Большинство запросов обрабатываются сессионными объектами (Java
    Bean), не имеющими состояний. Они хорошо подходят для управления
    параллельными запросами.&lt;/li&gt;
&lt;li&gt;Они держат пул из нескольких сессионных объектов, но определение
    их количества делегируется Glassfish. В пиковую нагрузку это
    число увеличивается для более эффективной обработки запросов,
    порой оно достигает 32.&lt;/li&gt;
&lt;li&gt;Все классификаторы реализованы как раз как такие объекты,
    повторно использующиеся различными thread'ами.&lt;/li&gt;
&lt;li&gt;У каждого объекта есть свое клиентское соединение с Cassandra,
    чтобы гарантировать отсутствие блокировок.&lt;/li&gt;
&lt;li&gt;Когда пользователь не отвечает на CAPTCHA сессия очищается и
    Mollom узнает что это скорее всего был спам.&lt;/li&gt;
&lt;li&gt;На каждом сервере запущено по одной копии каждого
    классификатора.&lt;/li&gt;
&lt;li&gt;В момент очистки сессии происходит небольшая блокировка, когда
    происходит обновление классификаторов.&lt;/li&gt;
&lt;li&gt;Обновленные классификаторы записываются в Cassandra каждые пол
    часа.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Интеграция приложений:&lt;ul&gt;
&lt;li&gt;Mollom использует открытый API, который может быть интегрирован
    в любую систему.&lt;/li&gt;
&lt;li&gt;Библиотеки: Java, PHP, Ruby и другие.&lt;/li&gt;
&lt;li&gt;Готовые модули: Drupal, Joomla, Wordpress и прочие системы
    управления контентом.&lt;/li&gt;
&lt;li&gt;Решения от сторонних разработчиков, основанные на примерах кода
    от &amp;nbsp;Mollom.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Для мониторинга здоровья серверов они используют Munin:&lt;ul&gt;
&lt;li&gt;Каков размер heap памяти после сбора мусора?&lt;/li&gt;
&lt;li&gt;Каково количество доступных соединений?&lt;/li&gt;
&lt;li&gt;Каково количество thread'ов в пуле?&lt;/li&gt;
&lt;li&gt;Оценка времени блокировок в каждом thread'е.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Если взглянуть в целом на архитектуру Mollom, можно увидеть, что они
    стараются построить систему, способную прозрачно работать в
    нескольких датацентрах, чтобы позволить горизонтально расширить
    систему, когда они перерастут текущую двухсерверную конфигурацию:&lt;ul&gt;
&lt;li&gt;Балансировка нагрузки на клиенте позволяет выбирать оптимальный
    сервер и справляться со сбоями одного из них.&lt;/li&gt;
&lt;li&gt;Кластеризация Glassfish облегчает добавление/удаление новых
    машин и позволяет перехватывать запросы, когда один из серверов
    выходит из строя.&lt;/li&gt;
&lt;li&gt;Cassandra используется для управления данными между серверами в
    нескольких датацентрах.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Инсталляция Mollom в Netlog обладает некоторыми интересными
    характеристиками. Она обрабатывает больше сообщений, чем основные
    сервера Mollom, но распределение спама в ней совершенно другое, так
    как люди в ней общаются в рамках социальной сети. Внутри Netlog лишь
    10% сообщений является спамом, когда в суровом мире информационных
    порталов распределение обратно. Интересным следствием является тот
    факт, что обработка нормальных сообщений требует меньше
    вычислительных ресурсов, так что на аналогичном оборудовании удается
    обрабатывать больший поток сообщений.&lt;/li&gt;
&lt;li&gt;Изначально они думали о виртуализированных серверах, в частности об
    Amazon EC2, но в итоге обнаружилось, что наиболее узким местом
    являются операции ввода-вывода - низкая производительность дисковой
    подсистемы в виртуальных машинах создавали реальные проблемы, так
    что они решили воспользоваться вертикальным масштабированием и
    переехали на более дорогие физические машины с большим объемом
    дискового пространства:&lt;ul&gt;
&lt;li&gt;На удивление они не упираются в вычислительные ресурсы: лишь два
    ядра из 8 занимаются вычислениями, когда остальные же работают
    над операциями ввода-вывода.&lt;/li&gt;
&lt;li&gt;Трафик Mollom практически постоянен, так что физические сервера
    более эффективны с финансовой точки зрения. Они рассматривают
    Amazon лишь как запасной вариант для обработки непредвиденных
    пиков нагрузки.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Процесс разработки:&lt;ul&gt;
&lt;li&gt;Команда распределена: трое в Бельгии, остальные в Техасе,
    Бостоне и Германии.&lt;/li&gt;
&lt;li&gt;Scrum используется в процессе разработки и они довольны этой
    методологией. Scrum-собрание проходит через Skype в два часа дня
    по Бельгии.&lt;/li&gt;
&lt;li&gt;Разработчики работают локально и отправляют код на Unfuddle.&lt;/li&gt;
&lt;li&gt;Hudson используется для непрерывного интеграционного
    тестирования.&amp;nbsp;Hudson позволил облегчить миграцию, так как перед
    развертыванием все тесты должны быть пройдены. Они не теряли
    лишнего времени на проблемах, обнаруженных уже в развернутом
    приложении.&lt;/li&gt;
&lt;li&gt;Они активно используют автоматическое тестирование: юнит-тесты,
    системные тесты, тесты Drupal.&lt;/li&gt;
&lt;li&gt;Развертывание по-прежнему делается вручную для минимизации риска
    простоя (что правда спорный момент).&lt;/li&gt;
&lt;li&gt;Для обнаружения утечек памяти они используют анализ дампов
    оперативной памяти. Анализ дампа сервера с 16Гб памяти - дело
    непростое, практически невозможное на обычном компьютере, так
    что они арендуют большую виртуальную машину на Amazon для
    проведения анализа. Весь процесс занимает всего около 2 часов.
    Они сравнивают два дампа: через 10 и 20 часов после запуска
    сервера. Если обнаруживаются значительные отличия, то скорее
    всего дело в утечке памяти.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="puti-razvitiia"&gt;Пути развития&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Mollom API основано на XML-RPC, REST-интерфейс находится на стадии
    тестирования для облегчения интеграции других сервисов.&lt;/li&gt;
&lt;li&gt;Они мигрировали на Cassandra, чтобы облегчить процесс
    горизонтального масштабирования, когда нагрузка достигнет
    соответствующего уровня.&lt;/li&gt;
&lt;li&gt;Скоро будут выпущены корпоративные возможности, которые позволят
    работать с сотнями сайтов как с единым целым. Появится возможность
    легко модерировать несколько сайтов одновременно по эмоциональной
    окраске сообщений, рейтингу спама или удалить все сообщения с
    определенного IP-адреса.&lt;/li&gt;
&lt;li&gt;Они думали над участием в бизнесе потоковых данных вроде Twitter, но
    они сильно ограничены европейскими более строгими требованиями по
    приватности.&lt;/li&gt;
&lt;li&gt;Планируются эксперименты по использованию Glassfish для балансировки
    нагрузки в рамках каждого датацентра.&lt;/li&gt;
&lt;li&gt;Если нагрузка увеличится десятикратно им придется добавить больше
    серверов в Cassandra. Дисковый ввод-вывод является узким местом.
    Дополнительные сервера приложения понадобятся только если нагрузка
    вырастет более, чем на порядок.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="podvodim-itogi"&gt;Подводим итоги&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Mollom очень серьезно относится к
    разработке&amp;nbsp;высокопроизводительной системы.&lt;/strong&gt; Они гордятся тем, что
    Mollom очень эффективно использует вычислительные и финансовые
    ресурсы. Множество запросов может обрабатываться одним сервером с
    низкой задержкой, что очень радует как клиентов, так и владельцев
    проекта, так как издержки очень низки. Этот вопрос был выбран
    приоритетным с самого начала и они выбрали подходящие технологии для
    реализации своих целей. Это позволило им вкладывать средства в
    маркетинг, построить базу клиентов и создавать новые продукты на
    основе Mollom.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Машинное обучение требует много исходных данных&amp;nbsp;для успешного
    обнаружение спама.&lt;/strong&gt; Для сбора этих данных предлагает бесплатные
    услуги. Крупные клиенты обеспечивают доход и получают выгоду от
    данных, полученных от более мелких клиентов. Эта модель очень хорошо
    себя проявила в машинном обучении, за которым как известно будущее.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Старайтесь избавиться от проблем, не связанных напрямую с
    продуктом.&lt;/strong&gt; Большие системы требуют серьезных усилий на разработку
    инфраструктуры. Можно убить все время на построение&amp;nbsp;инфраструктуры,
    вместо создания по-настоящему ценного продукта (классификаторов,
    системы репутации, клиентских библиотек). Mollom постоянно пытались
    максимально избавляться от лишних проблем, именно по-этому они
    выбрали Cassandra и Glassfish.&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;li&gt;&lt;strong&gt;Уменьшайте объем кода, позволяя используемым сторонним продуктам
    брать на себя грязную работу&lt;/strong&gt;.&amp;nbsp;Поначалу код Mollom был существенно
    большим по объему, чем сейчас. Использование Cassandra и Glassfish
    позволило убрать массу кода, связанного с кэшированием,
    кластеризацией, репликацией и обработкой сбоев. Упрощайте систему со
    временем.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Минимизируйте блокировки.&lt;/strong&gt; Mollom потратили много времени на
    устранение блокировок внутри Glassfish, так как это начинало
    становиться узким местом. Минимизируйте простой от блокировок для
    достижения полного параллелизма.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="istochniki-informatsii-i-dopolnitelnye-materialy"&gt;Источники информации и дополнительные материалы&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/796d6b53/" rel="nofollow" target="_blank" title="http://highscalability.com/blog/2011/2/8/mollom-architecture-killing-over-373-million-spams-at-100-re.html"&gt;Mollom Architecture - Killing Over 373 Million Spams At 100 Request
    Per
    Second&lt;/a&gt;
    (основной источник информации)&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a695ef0e/" rel="nofollow" target="_blank" title="http://mollom.com/files/mollom-technical-whitepaper.pdf"&gt;Mollom Technical
    Whitepaper&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/23d06e29/" rel="nofollow" target="_blank" title="http://blogs.sun.com/glassfishpodcast/entry/episode_072_mollom_com_s"&gt;Episode #072 - Mollom.com's GlassFish backend with Dries and
    Johan&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/c1eeadac/" rel="nofollow" target="_blank" title="http://buytaert.net/mollom-gets-a-new-backend"&gt;Mollom gets a new
    backend&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/fd87538b/" rel="nofollow" target="_blank" title="http://blogs.lodgon.com/johan/"&gt;Fighting spam with Mollom on
    Glassfish&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/9c3dc3c9/" rel="nofollow" target="_blank" title="http://mollom.com/api"&gt;Mollom API&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Если Вам понравилась данная статья, можете ознакомиться с другими
&lt;a href="https://www.insight-it.ru/highload/"&gt;материалами по архитектуре высоконагруженных систем&lt;/a&gt; и &lt;a href="/feed/"&gt;подписаться на RSS&lt;/a&gt;.&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Tue, 15 Feb 2011 19:19:00 +0300</pubDate><guid>tag:www.insight-it.ru,2011-02-15:highload/2011/arkhitektura-mollom/</guid><category>Cassandra</category><category>Drupal</category><category>Glassfish</category><category>Hudson</category><category>Intel</category><category>Java</category><category>Mollom</category><category>Munin</category><category>MySQL</category><category>Pingdom</category><category>saas</category><category>SoftLayer</category><category>Unfuddle</category><category>Xeon</category><category>Zendesk</category><category>Архитектура Mollom</category></item><item><title>Архитектура LinkedIn</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-linkedin/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/801d7bb4/" rel="nofollow" target="_blank" title="https://www.linkedin.com"&gt;LinkedIn&lt;/a&gt; является крупнейшей в мире
социальной сетью для профессионалов. Популярность этого проекта может
быть далека, от более общетематических социальных сетей, таких как,
скажем Facebook, но, тем не менее, нагрузка на серверную часть проекта
создается пользователями серьезная. О том как этот проект с ней
справляется и пойдет речь далее.
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="predislovie"&gt;Предисловие&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Сообщение о публикации двух презентаций c JavaOne 2008 о LinkedIn и их
&lt;a href="https://www.insight-it.ru/goto/36e64126/" rel="nofollow" target="_blank" title="http://hurvitz.org/blog/2008/06/linkedin-architecture"&gt;обобщении&lt;/a&gt; от
Overn Hurvitz пронеслось по русскоязычным новостным ресурсам уже
достаточно давно, но время черкнуть пару строк обо всем этом нашлось у
меня только сейчас.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/aef5ee94/" rel="nofollow" target="_blank" title="http://www.slideshare.net/linkedin/linkedins-communication-architecture"&gt;LinkedIn - A Professional Social Network Built with Java&amp;trade; Technologies and Agile Practices&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/515b891c/" rel="nofollow" target="_blank" title="http://www.slideshare.net/linkedin/linked-in-javaone-2008-tech-session-comm"&gt;LinkedIn Communication Architecture&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;22 миллиона пользователей;&lt;/li&gt;
&lt;li&gt;4+ миллиона уникальных посетителей в день;&lt;/li&gt;
&lt;li&gt;40 миллионов просмотров страниц в день;&lt;/li&gt;
&lt;li&gt;2 миллиона поисковых запросов в день;&lt;/li&gt;
&lt;li&gt;ежедневно отправляются 250 тысяч приглашений;&lt;/li&gt;
&lt;li&gt;1 миллион ответов в день;&lt;/li&gt;
&lt;li&gt;2 миллиона электронных сообщений ежедневно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="platforma"&gt;Платформа&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="/tag/solaris/"&gt;Solaris&lt;/a&gt; (как x86, так и SPARC)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/tomcat/"&gt;Tomcat&lt;/a&gt; и &lt;a href="/tag/jetty/"&gt;Jetty&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/oracle/"&gt;Oracle&lt;/a&gt; и &lt;a href="/tag/mysql/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Никакого ORM&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/activemq/"&gt;ActiveMQ&lt;/a&gt; для JMS&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/lucene/"&gt;Lucene&lt;/a&gt; в качестве основы для поиска&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/spring/"&gt;Spring&lt;/a&gt; в роли "клея"&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="servernaia-arkhitektura"&gt;Серверная архитектура&lt;/h3&gt;
&lt;h4&gt;2003-2005&lt;/h4&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;a href="/tag/lucene/"&gt;Lucene&lt;/a&gt;, он
    работал на той же машине, что и "Облако", так как поиск был
    отфильтрован в соответствии с сетью пользователя, таким образом было
    удобно совмещать эти две функции на одной машине;&lt;/li&gt;
&lt;li&gt;веб-приложение напрямую обновляет базу данных, а она, в свою
    очередь, обновляет "Облако".&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2006&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Добавлена репликация для уменьшения нагрузки на основную базу
    данных. Реплики предоставляют данные в режиме "только для чтения", а
    репликация ведется в асинхронном режиме с помощью дополнительного
    компонента под названием Databus, с его появлением обновление данных
    стало выглядеть следующим образом:&lt;ul&gt;
&lt;li&gt;сначала какие-либо изменения происходят в веб-приложении;&lt;/li&gt;
&lt;li&gt;веб-приложение обновляет основную базу данных;&lt;/li&gt;
&lt;li&gt;она, в свою очередь, отправляет обновления на Databus;&lt;/li&gt;
&lt;li&gt;далее уже Databus обновляет: реплики, Облако и поисковый индекс.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Поиск был вынесен на отдельный сервер.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;2008&lt;/h4&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;такой подход позволяет другим приложениям (помимо основного)
    получать доступ к LinkedIn, такие приложения были созданы для
    работодателей, рекламных служб, и так далее.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="oblako"&gt;Облако&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;"Облаком" в LinkedIn называют сервер, который кэширует весь граф
    социальной сети в памяти;&lt;/li&gt;
&lt;li&gt;его размеры: 22 миллиона вершин и 120 миллионов ребер;&lt;/li&gt;
&lt;li&gt;занимает 12GB оперативной памяти;&lt;/li&gt;
&lt;li&gt;одновременно держится в памяти в 40 экземплярах;&lt;/li&gt;
&lt;li&gt;построение Облака из данных, в дисковой системе, занимает 8 часов;&lt;/li&gt;
&lt;li&gt;обновления происходят в режиме реального времени с помощью Databus;&lt;/li&gt;
&lt;li&gt;во время остановки данные записываются на диск;&lt;/li&gt;
&lt;li&gt;кэш реализован с помощью C++, а доступ предоставляется по JNI;&lt;/li&gt;
&lt;li&gt;они выбрали именно C++ так как требовалось использовать минимум
    оперативной памяти, а также, задержки, связанные с Garbage
    Collection, были неприемлемыми.&lt;/li&gt;
&lt;li&gt;размещение всех данных в памяти является ограничением, но, как
    удалось выяснить в LinkedIn, разбиение графов на части - не самая
    тривиальная задача.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Облако кэширует целиком весь граф социальной сети LinkedIn, но на
практике же пользователям требуется видеть его со своей точки зрения.
Данная задача является вычислительно сложной, по-этому она выполняется
лишь один раз при создании новой сессии, а затем система поддерживает
результат в кэше. Такой подход требует 2 MB оперативной памяти на
каждого активного пользователя. В течении сессии такой кэш обновляется
только если сам пользователь сделал какие-либо изменения в нем, если же
изменение вызвано другими пользователями - владелец сессии не заметит
изменений.&lt;/p&gt;
&lt;p&gt;Помимо этого используется кэширование профилей пользователей средствами
&lt;a href="/tag/ehcache/"&gt;EHcache&lt;/a&gt;. Одновременно в памяти хранится до 2 миллионов
профилей (из 22 миллионов). Изначально планировалось использовать
алгоритм &lt;abbr title="Least Frequently Used"&gt;LFU&lt;/abbr&gt;, но оказалось,
что иногда &lt;a href="/tag/ehcache/"&gt;EHcache&lt;/a&gt; зависал секунд на 30 во время
перерасчета &lt;abbr title="Least Frequently Used"&gt;LFU&lt;/abbr&gt;, таким
образом было принято решение о использовании вместо него алгоритма
&lt;abbr title="Least Recently Used"&gt;LRU&lt;/abbr&gt;.&lt;/p&gt;
&lt;h3 id="arkhitektura-kommunikatsii"&gt;Архитектура коммуникации&lt;/h3&gt;
&lt;p&gt;Как известно, пользователи практически любой социальной сети генерируют
огромное количество сообщений в единицу времени, причем каждый тип
сообщений обычно требует индивидуального подхода, но в целом их можно
разделить на две категории: постоянные и временные. В LinkedIn
разработчики построили по отдельному сервису, для обработки каждой из
этих категорий. Каждый из них определенно заслуживает отдельного
внимания, так как общего в них мало.&lt;/p&gt;
&lt;h4&gt;Сервис постоянных сообщений&lt;/h4&gt;
&lt;p&gt;Этот коммуникационный сервис выполняет все операции, связанные с
постоянными сообщениями: приватными сообщениями и электронной почтой.
Перед ним ставится вполне тривиальный ряд задач: доставлять сообщения
получателям и сохранять их на постоянной основе, но на самом деле этим
все не ограничивается: должны также поддерживаться, скажем, доставка
сообщений с задержкой, массовые рассылки, отмена отправки сообщения,
возможность добавления в сообщения какого-либо интерактивного контента.
Реализован он был примерно следующим образом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;вся система работает асинхронно и активно использует JMS;&lt;/li&gt;
&lt;li&gt;клиенты отправляют сообщения так же через JMS;&lt;/li&gt;
&lt;li&gt;далее сообщения перенаправляются с помощью сервиса маршрутизации в
    соответствующий почтовый ящик или напрямую в обработку электронной
    почты;&lt;/li&gt;
&lt;li&gt;доставка сообщений происходит как с помощью Pull (клиенты
    запрашивают свои сообщения), так и с использованием Push (т.е.
    отправки сообщений);&lt;/li&gt;
&lt;li&gt;помимо этого используется &lt;a href="/tag/spring/"&gt;Spring&lt;/a&gt; с их собственными
    закрытыми расширениями, использующими HTTP-RPC.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Приемы, способствующие масштабируемости&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Функциональное сегментирование:&lt;/strong&gt; отправленные, полученные,
    архивные сообщения. &lt;em&gt;(т.е. вертикальное сегментирование)&lt;/em&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;em&gt;(т.е.
    горизонтальное сегментирование)&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Асинхронное выполнение операций&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Сервис сетевых обновлений&lt;/h4&gt;
&lt;p&gt;Этот сервис обеспечивает работу любых временных уведомлений, например,
вызванных изменением статуса пользователей в контакт-листах. Такие
сообщения должны с течением времени удаляться из-за быстрой потери
актуальности, а также должна поддерживаться группировка и приоритезация
сообщений. Функционирование этого сервиса оказалось не настолько
очевидно, по сравнению с предыдущим, так что до итогового варианта было
перепробовано масса менее удачных решений, но обо всем по порядку.&lt;/p&gt;
&lt;h5&gt;Изначальная архитектура (до 2007 года)&lt;/h5&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;p&gt;В 2008 году вся эта система поэтапно эволюционировала собственно в сам
сервис сетевых обновлений:&lt;/p&gt;
&lt;h5&gt;Первая итерация&lt;/h5&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;весь процесс основывается на Pull.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Вторая итерация&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;стал использоваться метод Push: каждый раз, когда происходит
    какое-либо событие, они помещаются в пользовательский "почтовый
    ящик", в момент запроса пользователя ему возвращается просто
    содержимое, уже ожидающее своего звездного часа в специально том
    самом "ящике";&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;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'ах: по одному &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'у на каждый тип
    обновления для каждого пользователя (то есть в сумму около 15 &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'ов на каждого пользователя);&lt;/li&gt;
&lt;li&gt;сначала использовался размер &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'ов равный 8 KB,
    что было явно больше требуемого и приводило к существенному
    количеству неиспользуемого дискового пространства.&lt;/li&gt;
&lt;li&gt;вместо &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'ов можно
    было бы использовать дополнительные таблици по одной на каждый
    тип обновлений, но в этом случае пришлось бы постоянно удалять
    из них устаревшие записи, что было бы чрезвычайно неэффективно.&lt;/li&gt;
&lt;li&gt;в дополнение к этому использовался &lt;abbr title="Java Management eXtensions"&gt;JMX&lt;/abbr&gt; для
    мониторинга и изменения конфигурации в реальном времени, что
    оказалось очень удобным и полезным.&lt;/li&gt;
&lt;/ul&gt;
&lt;h5&gt;Третья итерация&lt;/h5&gt;
&lt;ul&gt;
&lt;li&gt;Цель: повысить производительность путем сокращения количества
    обновлений &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;'ов,
    так как они требуют много вычислительных ресурсов.&lt;/li&gt;
&lt;li&gt;Был добавлен буфер: колонки в таблицах типа &lt;code&gt;varchar(4000)&lt;/code&gt;, в
    которых данные помещались изначально. При полном заполнении
    ячейки данные перемещаются в &lt;abbr title="Character Large OBject"&gt;CLOB&lt;/abbr&gt;; это позволило
    на порядок сократить количество их обновлений.&lt;/li&gt;
&lt;li&gt;Уменьшен размер самих сообщений об обновлениях.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="i-naposledok-paru-sovetov-ot-linkedin"&gt;И напоследок пару советов от LinkedIn&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;нельзя бесконечно долго ограничиваться одной базой данных:
    используйте много баз данных как с вертикальным, так и с
    горизонтальным сегментированием данных;&lt;/li&gt;
&lt;li&gt;забудьте о ссылочной целостности и кросс-серверных JOIN'ах;&lt;/li&gt;
&lt;li&gt;забудьте о 100% целостности данных;&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;/li&gt;
&lt;/ul&gt;
&lt;h3 id="ps"&gt;P.S.&lt;/h3&gt;
&lt;p&gt;Когда уже закончил переводить в голову пришла мысль, что если читателям
будет интересно взглянуть на оригинальные презентации (хотябы ради
иллюстрационного материала, который там вполне нагляден), то было бы
проще сделать это прямо здесь, так что вот, для Вашего же удобства:&lt;/p&gt;
&lt;div class="video-container"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/uHbsRNnQFZwThD" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="425"&gt; &lt;/iframe&gt;&lt;/div&gt;
&lt;div class="video-container"&gt;&lt;iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/16CML2N96CDeWv" style="border:1px solid #CCC; border-width:1px; margin-bottom:5px; max-width: 100%;" width="425"&gt; &lt;/iframe&gt;&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;&lt;em&gt;Кстати если Вы еще не успели подписаться на &lt;a href="/feed/"&gt;RSS&lt;/a&gt; - сейчас
самое время!&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 11 Sep 2008 04:00:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-09-11:highload/2008/arkhitektura-linkedin/</guid><category>ActiveMQ</category><category>C++</category><category>EHcache</category><category>Java</category><category>Jetty</category><category>LinkedIn</category><category>Lucene</category><category>MySQL</category><category>Oracle</category><category>Solaris</category><category>Spring</category><category>Tomcat</category><category>архитектура</category><category>архитектура LinkedIn</category><category>Масштабируемость</category></item><item><title>Архитектура Mailinator</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-mailinator/</link><description>&lt;p&gt;Ваш пьяный друг когда-либо вдохновлял Вас на создание первого в своем
роде интернет-сервиса, который пришелся бы по вкусу миллионам
пользователей и при этом неприхотливо обрабатывал миллиарды электронных
писем ежегодно? Именно так Paul Tyma и создал Mailinator.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/43449c5a/" rel="nofollow" target="_blank" title="http://www.mailinator.com"&gt;Mailinator&lt;/a&gt; представляет собой бесплатный,
не требующий инсталляции, сервис для разрушения планов злобных спаммеров
путем предоставления регистрации "одноразовых" почтовых адресов. Если Вы
не не будете публиковать в Сети свой настоящий интернет-адрес - спаммеру
не будут слать вам письма, вместо этого они будут спамить Mailinator :-)&lt;/p&gt;
&lt;p&gt;Как же Mailinator справляется со своей ролью анти-спам супергероя?
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="istochniki-informatsiia"&gt;Источники информация&lt;/h3&gt;
&lt;p&gt;&lt;em&gt;Да-да, это снова перевод
&lt;a href="https://www.insight-it.ru/goto/1b9578f1/" rel="nofollow" target="_blank" title="http://highscalability.com/mailinator-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&lt;/a&gt;'а (цифры правда не
первой свежести, но все же). На что-то более глобальное я в ближайшее
время способен не буду, в основном благодаря незаметно подкравшейся
сессии и, отчасти, работе.&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/fd89ec4b/" rel="nofollow" target="_blank" title="http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html"&gt;The Architecture of Mailinator&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/a94e81a2/" rel="nofollow" target="_blank" title="http://mailinator.blogspot.com/2007/02/mailinators-2006-stats.html"&gt;Mailinator's 2006 Stats&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/tomcat/"&gt;Tomcat&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Сервис обработал: 1.29 миллиардов электронных писем за 2007 год.
    450.74 миллионов за 2006. 280.68 миллионов за 2005.&lt;/li&gt;
&lt;li&gt;В период пиковых нагрузок обрабатывается 6.5 миллионов электронных
    писем в сутки или 4513 сообщений в минуту или 75 в секунду.&lt;/li&gt;
&lt;li&gt;Mailinator работает на всего одном весьма средненьком компьютере с
    AMD Athlon 2GHz процессором, 1 GB оперативной памяти (которая
    используется не целиком) и низкопроизводительным IDE жестким диском
    объемом 80 GB. И она в общем-то загружена далеко не полностью.&lt;/li&gt;
&lt;li&gt;Mailinator работает месяцами без присмотра и теряется очень
    небольшое количество сообщений, даже при постоянных спам-атаках и
    высоких пиковых нагрузках.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Так как система бесплатна, она не должна быть идеальной. Таким
    образом основные цели:&lt;ul&gt;
&lt;li&gt;Создание системы, которая ценит выживание превыше всего, даже
пользователей. Основным ключом является именно выживание, так как
Mailinator вынужден ежедневно отражать спам-атаки.&lt;/li&gt;
&lt;li&gt;Предоставить пользователям 99,99% доступность и точность данных.
Более высокие гарантии будут существенно менее практичными и
приведут к большим затратам. И так как сервис бесплатен, этот
небольшой риск для пользователей становится просто частью правил
игры.&lt;/li&gt;
&lt;li&gt;Поддержка следующей модели сервиса: пользователь регистрируется
где-то, заходит в Mailinator, жмет на пришедшую ссылку и забывает об
этом. Это означает, что письма не должны храниться постоянно. Они
могут размещаться в оперативной памяти, так как являются временными
(живут три-четыре часа). Если Вам нужен обычный настоящий почтовый
ящик - воспользуйтесь любым другим соответствующим сервисом.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Изначально письма обрабатывались следующим образом:&lt;ul&gt;
&lt;li&gt;Sendmail получал письмо в общий ящик на диске.&lt;/li&gt;
&lt;li&gt;Java-приложение доставало сообщение используя IMAP и/или POP (с
течением времени это менялось) и удаляло их.&lt;/li&gt;
&lt;li&gt;Система загружала все письма в память и оставляла их там.&lt;/li&gt;
&lt;li&gt;Наиболее старые сообщения вытеснялись как только накапливался
лимит в 20000 сообщений.&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;Проблемы начались, когда количество сообщений в сутки начало
превышать 800000. Система начала давать сбои из-за использования
жесткого диска между Mailinator и email подсистемой.&lt;/li&gt;
&lt;li&gt;Наиболее старые сообщения вытеснялись как только накапливался
лимит в 20000 сообщений.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Новая архитектура:&lt;ul&gt;
&lt;li&gt;Идея заключалась в отказе от временного хранения данных на жестком
диске путем полного переписывания всей системы с нуля.&lt;/li&gt;
&lt;li&gt;Веб-приложение, почтовый сервер и все хранилище писем
функционируют в рамках одной JVM.&lt;/li&gt;
&lt;li&gt;Sendmail был заменен на специально написанный для этого проекта
SMTP сервер. Так как природа Mailinator не требовала полноценного
SMTP сервера. Mailinator не отправляет писем, основная цель -
принимать или отвергать входящие письма. Это является недостатком
многоуровневой архитектуры. Она часто является залогом успеха в
процессе масштабирования веб-приложения, но порой она может и
наоборот полностью убить всю производительность благодаря неверному
принятию ответственных решений. Решение о создании собственного SMTP
сервера было достаточно интересным и смелым, многие другие
руководители проектов вместо этого просто добавили бы дополнительное
оборудование в систему. Это не было бы ошибкой, но, согласитесь,
создание своего собственного решения задачи - намного более
интересный подход.&lt;/li&gt;
&lt;li&gt;Сейчас Mailinator получает почту напрямую, обрабатывает ее и
хранит в оперативной памяти. Жесткие диски полностью обходятся и
практически не используются.&lt;/li&gt;
&lt;li&gt;Основное их применение - хранение сообщений в случае остановки
сервиса для того, чтобы они могли быть восстановлены при запуске.&lt;/li&gt;
&lt;li&gt;Ведение логов было отключено.&lt;/li&gt;
&lt;li&gt;Система использует менее 300 потоков. Это оказалось вполне
достаточно.&lt;/li&gt;
&lt;li&gt;При принятии сообщения, система пропускает его через набор
фильтров и хранит его в памяти только в том случае, если все фильтры
были успешно пройдены.&lt;/li&gt;
&lt;li&gt;Каждый почтовый адрес ограничен только 10 письмами, так что
популярные адреса вроде joe@mailinator.com не могут "взорвать"
систему.&lt;/li&gt;
&lt;li&gt;Письма не могут превышать 100 kb, а все приложения автоматически
уничтожаются. Это позволяет существенно сэкономить в плане
используемой оперативной памяти..&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Электронные письма сжимаются в оперативной памяти:&lt;ul&gt;
&lt;li&gt;99% писем никто даже не открывает, компрессия позволяет сэкономить
место в оперативной памяти. Письмо разжимается в исходное состояние
только если кто-то решает его открыть.&lt;/li&gt;
&lt;li&gt;Mailinator может хранить около 80000 писем в оперативной памяти,
используя лишь 300 MB памяти, по сравнению с 20000 писем, занимающих
1 GB без использования компрессии.&lt;/li&gt;
&lt;li&gt;С таким подходом к хранению писем, они живут в среднем 3-4 часа.&lt;/li&gt;
&lt;li&gt;В память поместится и 200000 писем, но на практике это и не
требуется.&lt;/li&gt;
&lt;li&gt;Оперативная память ценна, а процессорное время - вовсе нет. Именно
из-за этого используется компрессия для экономии памяти и
использования излишков вычислительных мощностей.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Mailinator не гарантирует анонимность или приватность:&lt;ul&gt;
&lt;li&gt;Любой пользователь может получить доступ к любому почтовому ящику.&lt;/li&gt;
&lt;li&gt;Отказ от ограничений доступа делает схему работы системы намного
более простой.&lt;/li&gt;
&lt;li&gt;Со стороны пользователя такой подход очень прост, так как не
требуется абсолютно никакой регистрации. Когда сайт требует ввести
почтовый адрес достаточно лишь просто ввести любой адрес Mailinator.
Вам не нужно создавать отдельный аккаунт. Банальный ввод адреса
создает почтовый ящик. Все просто.&lt;/li&gt;
&lt;li&gt;На практике же, не смотря на вышесказанное, пользователи все же
получают изрядную степень приватности.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Стремление к выживанию требует агрессивной борьбы со спамом:&lt;ul&gt;
&lt;li&gt;Mailinator не имеет ничего против спама, но так как спама приходит
нереально много, когда он подвергает риску работоспособность сервиса
приходится его фильтровать.&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;При слишком большом количестве писем с одного IP они перестают
приниматься.&lt;/li&gt;
&lt;li&gt;Слишком много писем с одинаковой темой не принимаются.&lt;/li&gt;
&lt;li&gt;Письма, содержащие в заголовках запрещенные сервисом слова, также
не попадают в почтовые ящики.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Выживание в условиях наплыва писем с одного IP адреса:&lt;ul&gt;
&lt;li&gt;Для этого типа фильтрации используется AgingHashMap. Когда сервис
получает очередное письмо, IP помещается в массив и счетчик,
соответствующий этому ключу, увеличивается на единицу в момент
получения каждого последующего письма с этого IP.&lt;/li&gt;
&lt;li&gt;Спустя определенное время без получения писем с IP,
соответствующие ему счетчик обнуляется.&lt;/li&gt;
&lt;li&gt;Когда счетчик достигает определенного порога, IP блокируется,
предотвращая поток сообщений.&lt;/li&gt;
&lt;li&gt;Этим простым методом пользуются многие интернет-ресурсы для защиты
различных своих компонентов, например комментариев. В роли хранилища
для такого массива при распределенном функционировании системы часто
используют &lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Защита от "зомби" атак:&lt;ul&gt;
&lt;li&gt;Спам может приходить и с больших координированных сетей с разными
IP адресами, как раз участников таких сетей и называют "зомби".
Одинаковые письма приходят со множества разных адресов, так что
защита по IP адресам становится бессильна.&lt;/li&gt;
&lt;li&gt;Этот фильтр несколько более сложный, чем блокировка по IP, так как
требуется достать из письма строку с заголовком, да и их сравнение -
несколько ресурсоемкая задача.&lt;/li&gt;
&lt;li&gt;Когда около 20 писем с одинаковыми темами приходят в течении 2
минут, этот заголовок блокируется на час.&lt;/li&gt;
&lt;li&gt;Что интересно, Mailinator не хранит заблокированные темы вечно,
так как это значило бы, что этот список неуклонно рос и приходилось
бы вечно отслеживать соответствия с ним. Это никак не приемлемо для
мимолетной природы Mailinator. Более комплексные алгоритмы защиты от
спама нужны лишь только если ставятся цели с более жесткой борьбой
со спама, для Mailinator же данный вариант - наиболее эффективный.&lt;/li&gt;
&lt;li&gt;Этим фильтром блокируется около 9% писем.&lt;/li&gt;
&lt;li&gt;Mailinator фильтрует сообщения только по теме и IP, так что
системе не приходится прочитывать и анализировать все письмо
целиком. Это позволяет неплохо сэкономить на вычислительных ресурсах
при достаточно эффективной итоговой фильтрации.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Для уменьшения угрозы DDoS атак:&lt;ul&gt;
&lt;li&gt;Все соединения, неактивные какое-то время обрываются.&lt;/li&gt;
&lt;li&gt;Mailinator отвечает отправителям писем очень медленно, 10, 20 или
даже 30 секунд, даже для небольших объемов данных. Это замедляет
работу спаммеров, пытающихся отправлять спам как можно быстрее, и
заставляет их лишний раз задуматься о целесообразности отправки
снова спама на этот адрес. Период ожидания уменьшается во время
повышенных нагрузок на сервис, так что письма не теряются из-за
этого.&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;&lt;strong&gt;Идеальность - всего лишь ловушка.&lt;/strong&gt; Как много систем были
    кардинально усложнены лишь для того, чтобы достичь 100%-го
    результата во всех аспектах. Если Вы участвовали в подобных
    совещаниях, Вы понимаете о чем идет речь. О нет, мы не можем сделать
    этого, так как есть 0,01% шанс, что что-то пойдет не так. Лучше
    спросите себя: насколько неидеальными можно позволить себе быть,
    чтобы все равно оставаться достаточно неплохим сервисом?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;То, что Вы отвергаете, ничуть не менее важно, чем то, что Вы
    оставляете в системе.&lt;/strong&gt; Существует масса концепций по построению
    архитектуры системы. Нужно не только выбрать подходящие, но и
    отказаться от тех, которые излишни.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Знайте предназначение своей системы и разрабатывайте ее в
    соответствии с этим.&lt;/strong&gt; Быть всем для всех значит быть ничем для
    никого. Временное хранение электронных писем, позволяя небольшой
    части спама пробиться через фильтры, в совокупности с не 100%
    временем работы системы производят достаточно хорошее впечатление на
    пользователей. Построение собственного SMTP-сервера необходимо лишь
    в случае, если у Вас есть весомые аргументы в пользу того, что он
    Вам необходим. Далеко не факт, что такая идея придет в голову,
    возможно выбор пал бы и на более тривиальное решение, связанное
    просто с добавлением дополнительного оборудования.&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;li&gt;&lt;strong&gt;Небольшое количество сбоев - вполне допустимо.&lt;/strong&gt; Все
    заблокированные адреса не должны быть запомнены навечно. Позвольте
    этим спискам генерироваться на основе локальных данных, а не
    глобального состояния. Это очень простая и эффективная архитектура.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="/tag/java/"&gt;Java&lt;/a&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;li&gt;&lt;strong&gt;Сжимайте данные.&lt;/strong&gt; Компрессия данных может стать неплохим
    достижением в попытках сэкономить оперативную память. Можно
    сократить использование памяти вдвое с лишь небольшой дополнительной
    нагрузкой, связанной с компрессией и декомпрессией информации. Если
    обмен данными происходит локально, достаточно лишь закодировать
    данные и предоставить API для доступа к данным без полной
    декомпрессии.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Используйте фиксированные объемы ресурсов для обработки запросов.&lt;/strong&gt; Многие приложения не могут контролировать используемые
    ресурсы, в частности - оперативную память, таким образом они могут
    порой давать сбой при использовании излишне больших ее объемов. Для
    более стабильной работы стоит ограничить используемые ресурсы и
    откладывать выполнение новых задач пока они используются полностью.
    Для управление доступом к ресурсам можно использовать определенную
    логику в зависимости от ситуации: по времени, по приоритету,
    "честный" доступ, но так как ресурсы ограничены, система несколько
    ослабнет под серьезной нагрузкой.&lt;/li&gt;
&lt;li&gt;Если данные не хранятся длительное время, они не могут стать
    причиной возбуждения судебного дела о нарушении чьих-либо прав.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Пользуйтесь тем, что знаете лучше всего.&lt;/strong&gt; Этот урок не раз
    оправдывал себя. Paul знал Java лучше, чем что-либо еще, именно
    по-этому он заставил приложение на этом языке работать и выполнить
    все поставленные задачи.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Найдите свои собственные Mailinator'ы.&lt;/strong&gt; Конечно, Mailinator
    является очень небольшой системой. В более крупной системе этот
    проект был бы лишь небольшой дополнительной возможностью, но такие
    системы обычно состоят просто из нескольких подпроектов размером с
    Mailinator. А что если подойти к разработке некоторых из них так же
    как и к Mailinator?&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;KISS работает, правда довольно редко.&lt;/strong&gt; Простота систем часто
    обсуждается, но практические примеры появляются достаточно редко.
    Чаще всего разговор остается на уровне: твоя система сложная, а
    моя - простая, просто так как она моя. Mailinator является хорошим
    примером простой архитектуры системы.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Надежность является функцией архитектуры системы.&lt;/strong&gt; Для построения
    системы, эффективно использующей память и выживающей серьезные атаки
    спаммеров, потребовалось серьезно подойти к каждому уровню ее
    архитектуры.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Tue, 24 Jun 2008 18:17:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-06-24:highload/2008/arkhitektura-mailinator/</guid><category>Java</category><category>Linux</category><category>online</category><category>Tomcat</category><category>архитектура</category><category>архитектура Mailinator</category><category>электронная почта</category></item><item><title>Архитектура Google Talk</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-googletalk/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/8bce017/" rel="nofollow" target="_blank" title="http://www.google.com/talk"&gt;Google Talk&lt;/a&gt; представляет собой сервис
мгновенного обмена сообщениями от Google. В основе этого сервиса лежит
&lt;abbr title="eXtensible Messaging and Presence Protocol"&gt;XMPP&lt;/abbr&gt; протокол, более известный как &lt;em&gt;Jabber&lt;/em&gt;. В России среди &lt;abbr title="Instant Messaging"&gt;IM&lt;/abbr&gt;-сервисов
несомненно наиболее широко распространен &lt;em&gt;ICQ&lt;/em&gt;, но количество русских
пользователей &lt;em&gt;Jabber&lt;/em&gt; тоже неуклонно растет.&lt;/p&gt;
&lt;p&gt;Вам когда-нибудь доводилось задумываться какое количество сообщений
приходится обрабатывать такого рода сервисам? Допустим есть абстрактный
&lt;abbr title="Instant Messaging"&gt;IM&lt;/abbr&gt;-сервис, которым пользуется миллион пользователей, в среднем каждый из
них отправляет сто текстовых сообщений. Сколько всего сообщений
обработал и доставил сервис? Сто миллионов? Наивно!
&lt;!--more--&gt;&lt;/p&gt;
&lt;h3 id="vvedenie"&gt;Введение&lt;/h3&gt;
&lt;p&gt;Сервисы мгновенного обмена на самом деле подвергаются существенно
большей нагрузке, чем это может показаться на первый взгляд. Давайте
взглянем на расшифровку аббревиатуры &lt;abbr title="eXtensible Messaging and Presence Protocol"&gt;XMPP&lt;/abbr&gt;: eXtensible Messaging and
Presence Protocol. Обмен сообщениями - лишь одна из его функций,
наиболее важная же его часть остается "за сценой" - отображение
присутствия пользователей &lt;em&gt;online&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Давайте посмотрим на наш абстрактный пример с точки зрения присутствия:
пускай им пользуется все тот же миллион пользователей, когда один из них
включил компьютер и появился online - он должен уведомить весь свой
список контактов об этом событии, а также узнать кто из них находится
online. Если этот список велик, то такое элементарное событие может
обернуться для сервиса далеко не одной сотней обработанных и
доставленных сообщений. Помимо простого изменения статуса online/offline
подобную цепочку сообщений может генерировать и любое другое изменение
статуса: связанное с отсутствием пользователя около компьютера или с
изменением небольшого текстового сообщения, которое обычно отображается
в контакт листе рядом с ником пользователя и призвано отображать текущее
его состояние, занятие или чего там только не пишут (эта функция не
всегда предоставляется &lt;abbr title="Instant Messaging"&gt;IM&lt;/abbr&gt;-сервисами, но наверняка многим знакома по
&lt;em&gt;ICQ&lt;/em&gt;, если не по &lt;em&gt;Jabber&lt;/em&gt;). Все эти сообщения как раз и стоят за
"presence" в аббревиатуре &lt;abbr title="eXtensible Messaging and Presence Protocol"&gt;XMPP&lt;/abbr&gt;, суммарный траффик, ими генерируемый,
может в несколько раз превышать траффик от собственно самих текстовых
сообщений.&lt;/p&gt;
&lt;p&gt;Если учесть факты, описанные в предыдущем абзаце, не трудно догадаться,
что зависимость суммарного количества presence-сообщений от количества
пользователей &lt;abbr title="Instant Messaging"&gt;IM&lt;/abbr&gt;-сервиса далеко не линейна. Их количество за какой-то
период времени можно очень приблизительно посчитать как произведение
трех параметров: количества пользователей online, средней длины списка
контактов среди них и количества изменений статуса каждым пользователем.
А каждый дополнительный пользователь в системе так или иначе увеличивает
как минимум два из этих трех параметров.&lt;/p&gt;
&lt;p&gt;Введение несколько затянулась, а проблема масштабируемости &lt;abbr title="eXtensible Messaging and Presence Protocol"&gt;XMPP&lt;/abbr&gt;-сервисов
я думаю теперь стала очевидна, так что сейчас очень подходящий момент,
чтобы вернуться к основной теме разговора - сервису Google Talk и том,
как команда его разработчиков решает эту проблему.&lt;/p&gt;
&lt;h3 id="istochniki-informatsii"&gt;Источники информации&lt;/h3&gt;
&lt;p&gt;Наверное уже стало заметно, что это не очередной перевод, а лично мной
написанный текстик. Так что сразу выдам
&lt;a href="https://www.insight-it.ru/goto/bd0c001f/" rel="nofollow" target="_blank" title="http://video.google.com/videoplay?docid=6202268628085731280"&gt;видео&lt;/a&gt;,
являющееся основным источником информации, и продолжу.&lt;/p&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;p&gt;Со стороны Google (о котором я, кстати говоря, &lt;a href="https://www.insight-it.ru/highload/2008/arkhitektura-google/"&gt;уже писал&lt;/a&gt;) было бы глупо строить
сервис мгновенного обмена сообщениями в стороне от остальных
коммуникационных сервисов, предоставляемых этой компанией. Еще до своего
публичного старта Google Talk был интегрирован в почтовый сервис
&lt;a href="https://www.insight-it.ru/goto/af1829ed/" rel="nofollow" target="_blank" title="http://www.gmail.com"&gt;GMail&lt;/a&gt; и социальную сеть
&lt;a href="https://www.insight-it.ru/goto/31afe99f/" rel="nofollow" target="_blank" title="http://www.orkut.com"&gt;Orkut&lt;/a&gt;: эти сервисы просто запрашивали у Google
Talk присутствие online пользователей из своего списка контактов при
возникновении соответствующих событий, но при этом не отображали
результаты в своих страницах. Таким образом разработчики получили
возможность оценить предстоящие нагрузки и готовность сервиса к
публичному запуску намного более точно, чем они могли бы это сделать
средствами синтетических тестов.&lt;/p&gt;
&lt;p&gt;В отношении распределения нагрузок, сразу же был выбран и реализован
подход, связанный с разбиением пользователей на группы и распределением
работы с каждой отдельной группой по разным серверам. Это позволило
избежать всей той эволюции серверной части приложения от одного сервера
до большого кластера, что впрочем вполне оправданно, так как сразу же
после запуска сервису предстояло столкнуться с огромным количеством
пользователей и не ничуть не меньшей нагрузкой. Разработчики не забыли и
сразу же предусмотреть безболезненный перенос пользователей с одного
сервера на другой без видимых для него изменений, это позволило очень
гибко изменять количество серверов в системе.&lt;/p&gt;
&lt;p&gt;С точки зрения интеграции сервиса с другими проектами
&lt;a href="/tag/google/"&gt;Google&lt;/a&gt;, очень важно было предоставить определенный
уровень абстракции для взаимодействия в виде API и набора адресов, по
которым необходимо обращаться к сервису. Придерживаясь одного API можно
производить практически любые архитектурные или программные изменения в
рамках проекта таким образом, что все его пользователи и проекты, в
которые он интегрирован, просто не заметят что что-то изменилось.
Адреса, к которым происходит обращение при обмене данных, так же
являются своеобразной абстракцией - можно переместить сервис в новый
датацентр и благодаря DNS трафик будет направляться в нужное место.&lt;/p&gt;
&lt;p&gt;С другой стороны необходимо учитывать и программное обеспечение
работающие ниже уровнем, чем собственно код приложения: особенно ядро
операционной системы и используемые библиотеки. В данном случае большую
роль играет количество открытых TCP соединений, так как &lt;abbr title="Instant Messaging"&gt;IM&lt;/abbr&gt; требует
большое их количество, но активность в них не велика.&lt;/p&gt;
&lt;p&gt;Разработчики Google Talk постарались как можно больше внимания уделить
возможным сбоям и связанным с ними ситуациям. Любое даже запланированное
временное прекращение функционирования какой-то части системы может
резко увеличить нагрузку на остальную часть, даже если это просто
перезагрузка части системы - из-за очистившегося кэша серверы снова
начнут полноценно функционировать далеко не сразу, не говоря уже о
непредвиденных сбоях, когда последствия намного более глобальны. Для
своевременного устранения потенциальных проблем как с общем
функционированием системы, так и с недостаточной производительностью,
ведутся логи для всех этапов обработки запросов, а также предусмотрена
возможность профайлинга прямо на работающих в системе серверах.&lt;/p&gt;
&lt;p&gt;Но не стоит забывать и о клиентской части программного обеспечения:
какая-нибудь глупая ошибка в коде клиента сервиса запросто может
устроить DDoS атаку на сервис, что и случилось с одной из ранних версий
клиента Google Talk. Помимо этого необходимо поддерживать совместимость
разных версий клиентских приложений.&lt;/p&gt;
&lt;h3 id="zakliuchenie"&gt;Заключение&lt;/h3&gt;
&lt;p&gt;Благодаря описанным выше принципам Google Talk удается обрабатывать
каждое из миллиардов сообщений в день менее чем за 100 миллисекунд.
Тесная интеграция с другими сервисами &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; позволила
проекту сразу же получить невероятную популярность, а продуманный подход
к разработке сервиса позволил справиться с огромной нагрузкой.&lt;/p&gt;
&lt;p&gt;На этот раз статья получилась скорее о специфике сервиса, чем о его
реализации. Технической информации найти практически не удалось, так что
очень кратко все, но надеюсь и в таком варианте было достаточно
интересно почитать. Напоследок хочу порекомендовать &lt;a href="/feed/"&gt;подписаться на RSS&lt;/a&gt;, если не хотите пропустить публикацию новых постов.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Thu, 22 May 2008 16:39:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-05-22:highload/2008/arkhitektura-googletalk/</guid><category>Google</category><category>Google Talk</category><category>IM</category><category>Jabber</category><category>Java</category><category>Linux</category><category>online</category><category>sharding</category><category>XMPP</category><category>архитектура</category><category>архитектура Google Talk</category><category>присутствие</category></item><item><title>Интерфейс</title><link>https://www.insight-it.ru//theory/2008/interfejs/</link><description>&lt;p&gt;&lt;img alt="Интерфейс" class="right" src="https://www.insight-it.ru/images/exec.png"/&gt;
Наверняка у многих из вас слово &lt;em&gt;"интерфейс"&lt;/em&gt; ассоциируется с внешним
видом любой программы, то есть кнопочками, виджетами, иконками и прочим
ее оформлением. Да, несомненно графический пользовательский интерфейс
является одним из значений этого понятия, но существует и масса других!&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Хотите узнать больше?&lt;/strong&gt;
&lt;!--more--&gt;
В общем случае под словом интерфейс понимают правила и рамки
взаимодействия двух произвольных объектов. В рамках компьютерной
терминологии такими объектами обычно выступают люди, оборудование,
программное обеспечение или его компоненты, но этот термин применим и
далеко за ее пределами.&lt;/p&gt;
&lt;p&gt;Вернувшись к примеру из первого абзаца мы теперь можем вполне
аргументированно объяснить почему GUI так часто приравнивают к слову
интерфейс: он просто является частным случаем интерфейса между
приложением и его пользователем. Можно было бы привести еще массу
примеров различных интерфейсов, скажем сокет в качестве интерфейса между
процессором и материнской платой, но целью написания этого поста было
вовсе не это.&lt;/p&gt;
&lt;p&gt;Уже догадались? Да, это я так неспеша плавно подводил разговор к
&lt;a href="/tag/oop/"&gt;объектно-ориентированному программированию&lt;/a&gt;. Термин
&lt;em&gt;интерфейс&lt;/em&gt; широко применяется и в нем. Как не трудно предположить, в
роли объектов в этом случае выступают как сами классы, так и их
экземпляры (которые, впрочем, тоже принято называть словом &lt;em&gt;объект&lt;/em&gt;).&lt;/p&gt;
&lt;p&gt;В общем случае интерфейсом класса выступает совокупность его &lt;strong&gt;public&lt;/strong&gt;
методов и переменных, то есть доступных для обращения из других частей
приложения. Этот факт вполне логичен - именно благодаря им и
осуществляется взаимодействие класса (или его объекта) с "внешним
миром". Но не все так просто, особенно с точки зрения &lt;a href="https://www.insight-it.ru/theory/2008/design-patterns/"&gt;шаблонов
проектирования&lt;/a&gt;, немаловажную роль в
взаимодействии классов и объектов играет &lt;strong&gt;абстракция&lt;/strong&gt;. Хочется
обратить внимание, что формально имеется ввиду даже не сами методы, а их
заголовки, то есть название, набор получаемых переменных и тип
возвращаемого значения (этот набор данных принято также принято называть
интерфейсом методов или функций), само тело метода (реализация) в данном
случае не важно.&lt;/p&gt;
&lt;p&gt;Иными словами, если один класс (будем называть его &lt;em&gt;клиент&lt;/em&gt;)
взаимодействует с каким-либо другим объектом, то по большому счету он
абсолютно не обязан знать какого класса этот объект является экземпляром
(может конечно, но это совсем не обязательно). Единственное, что
интересует класс-клиент, это &lt;em&gt;интерфейс&lt;/em&gt; объекта, с которым он
взаимодействует, этой информации вполне достаточно для полноценной
совместной работы.&lt;/p&gt;
&lt;p&gt;Сразу напрашивается вполне резонный вопрос: а как же тогда клиент может
быть уверен, что в классе, с которым он работает, какой-либо конкретный
интерфейс реализован? Допустим ему нужен во-о-о-он тот метод, а как же
узнать доступен ли он и получит ли клиент в ответ данные нужного типа?
Ответ на этот вопрос реализован в каждом языке программирования
по-разному: где-то существует специальные ключевые слова для
&lt;em&gt;обозначения&lt;/em&gt; интерфейсов и классов, их реализующих, где-то это
ненавязчиво реализуется средствами &lt;em&gt;наследования&lt;/em&gt; и &lt;em&gt;полиморфизма&lt;/em&gt; на
более концептуальном уровне.&lt;/p&gt;
&lt;p&gt;Самым наглядным языком программирования для демонстрации описания
интерфейсов я считаю &lt;strong&gt;Java&lt;/strong&gt; (хотя можно было бы выбрать и C#, PHP или
практически любой другой по вкусу). В теории все просто:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Ключевое слово &lt;code&gt;interface&lt;/code&gt; обозначает описание интерфейса;&lt;/li&gt;
&lt;li&gt;За ним следует название конкретного интерфейса, которое впоследствии
    можно будет использовать в коде при его упоминании (некоторые
    программисты на правах традиции начинают названия интерфейсов с
    заглавной буквы &lt;strong&gt;I&lt;/strong&gt;, мне в свое время даже пытались объяснить
    зачем так надо делать, но аргументы не показались мне достаточно
    весомыми);&lt;/li&gt;
&lt;li&gt;Далее идет тело интерфейса, в котором перечисляются все заголовки
    методов, которые должны быть в классе, реализующем данный интерфейс
    (никакой реализации!);&lt;/li&gt;
&lt;li&gt;Впоследствии приписав к заголовку любого класса ключевое слово
    &lt;code&gt;implements&lt;/code&gt; с последующим указанием названия интерфейса, можно
    &lt;em&gt;обязать&lt;/em&gt; этот класс реализовать указанные в описания интерфейса
    методы. Существует небольшое исключение для абстрактных классов (то
    есть классов,для которых &lt;em&gt;не может&lt;/em&gt; быть создан объект, обозначаются
    ключевым словом &lt;code&gt;abstract&lt;/code&gt;), они &lt;em&gt;могут&lt;/em&gt; и не реализовать все
    методы интерфейса, но тогда эта &lt;em&gt;обязанность&lt;/em&gt; будет переложена на их
    &lt;em&gt;наследников&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;В данной ситуации клиент, работающий с каким-либо произвольным объектом
может просто-напросто проверить, реализован ли в нем заранее
определенный интерфейс, что даст ему гарантию, что он может смело
обращаться к необходимому набору методов.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Небольшое примечание:&lt;/em&gt; сами интерфейсы и методы в их теле по-умолчанию
обладают свойствами &lt;code&gt;abstract&lt;/code&gt; и &lt;code&gt;public&lt;/code&gt;, так что повторно
указывать эти ключевые слова не нужно.&lt;/p&gt;
&lt;p&gt;На практике же это выглядит это примерно следующим образом:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// описание интерфейса&lt;/span&gt;
&lt;span class="kd"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;Renderable&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// обязуем реализовать метод draw&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// конкретная реализация интерфейса&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeText&lt;/span&gt; &lt;span class="kd"&gt;implements&lt;/span&gt; &lt;span class="n"&gt;Renderable&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SomeText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
   &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// вынуждены подчиниться и реализовать&lt;/span&gt;
       &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// класс-клиент&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Render&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Renderable&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// можно быть уверенным, что&lt;/span&gt;
     &lt;span class="c1"&gt;// метод draw реализован&lt;/span&gt;
     &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
     &lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt;         в качестве альтернативы можно было бы написать как-то так:&lt;/span&gt;
&lt;span class="cm"&gt;         if(obj instanceof Renderable)obj.draw();&lt;/span&gt;
&lt;span class="cm"&gt;         то есть проверить реализован ли интерфейс&lt;/span&gt;
&lt;span class="cm"&gt;         вместо использования его названия в роли типа данных&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;В данном примере ситуация тривиальна: класс-клиент &lt;code&gt;Render&lt;/code&gt; умеет лишь
визуализировать классы, которые он получает в конструктор, вызывая у них
метод &lt;code&gt;draw&lt;/code&gt;. Для обеспечения такой возможности описан интерфейс
&lt;code&gt;Renderable&lt;/code&gt;, который реализуется в классе &lt;code&gt;SomeText&lt;/code&gt;. Хоть класс
&lt;code&gt;Render&lt;/code&gt; ничего и не знает о том, какой именно класс ему подсунут,
благодаря интерфейсу он сможет вывести на экран любой объект, корректно
реализующий наш интерфейс, в том числе и &lt;code&gt;SomeText&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Как я уже упоминал: альтернативой такому подходу является использование
полиморфизма и наследования. Такой подход более распространен в других
языках программирования, например C++, но пример я приведу все равно на
&lt;strong&gt;Java&lt;/strong&gt;, основываясь на предыдущем примере, чтобы читателям было проще
сравнивать.&lt;/p&gt;
&lt;p&gt;В теории такой подход еще проще: создается абстрактный класс, хоть
как-то реализующий наш интерфейс (теоретически реализация может быть и
пустой, просто в виде метода-заглушки), а на стороне клиента достаточно
лишь просто принимать только наследников этого абстрактного класса. В
нашем примере достаточно лишь изменить пару ключевых слов и все:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span class="c1"&gt;// теперь используем абстрактный класс&lt;/span&gt;
&lt;span class="kd"&gt;abstract&lt;/span&gt; &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Renderable&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// реализуем метод draw&lt;/span&gt;
    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
    &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"Вывод на экран недоступен!"&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
    &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// реализация интерфейса (на этот раз неформального)&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;SomeText&lt;/span&gt; &lt;span class="kd"&gt;extends&lt;/span&gt; &lt;span class="n"&gt;Renderable&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
   &lt;span class="c1"&gt;// на этот раз используем extends (наследование)&lt;/span&gt;
   &lt;span class="c1"&gt;// вместо implements&lt;/span&gt;
   &lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;text&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;SomeText&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;string&lt;/span&gt; &lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
   &lt;span class="o"&gt;{&lt;/span&gt;
      &lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;str&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
   &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;void&lt;/span&gt; &lt;span class="nf"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt;
   &lt;span class="o"&gt;{&lt;/span&gt;
       &lt;span class="c1"&gt;// переопределяем метод draw&lt;/span&gt;
       &lt;span class="c1"&gt;// но могли этого и не делать, тогда&lt;/span&gt;
       &lt;span class="c1"&gt;// использовался бы метод из Renderable&lt;/span&gt;
       &lt;span class="n"&gt;System&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;out&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;println&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="k"&gt;this&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;text&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
   &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;

&lt;span class="c1"&gt;// класс-клиент&lt;/span&gt;
&lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;Render&lt;/span&gt;
&lt;span class="o"&gt;{&lt;/span&gt;
  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="nf"&gt;Render&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Renderable&lt;/span&gt; &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt;
  &lt;span class="o"&gt;{&lt;/span&gt;
     &lt;span class="c1"&gt;// можно быть уверенным, что&lt;/span&gt;
     &lt;span class="c1"&gt;// метод draw реализован&lt;/span&gt;
     &lt;span class="n"&gt;obj&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="na"&gt;draw&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
     &lt;span class="cm"&gt;/*&lt;/span&gt;
&lt;span class="cm"&gt;        на этот раз так как в крайнем случае&lt;/span&gt;
&lt;span class="cm"&gt;        в крайнем случае вызовется хотябы&lt;/span&gt;
&lt;span class="cm"&gt;        метод из класса Renderable&lt;/span&gt;
&lt;span class="cm"&gt;     */&lt;/span&gt;
  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Минимальные изменения - суть та же. Сразу хочу отметить, что этот
процесс так прост только в &lt;strong&gt;Java&lt;/strong&gt;, в других языках программирования
понадобилось бы использование дополнительных модификаторов для метода
&lt;code&gt;draw&lt;/code&gt; (например в &lt;strong&gt;C#&lt;/strong&gt;: &lt;code&gt;virtual&lt;/code&gt; или &lt;code&gt;abstract&lt;/code&gt; в
классе-потомке и &lt;code&gt;override&lt;/code&gt; в классе-наследнике, это необходимо для
обеспечения возможности их переопределения).&lt;/p&gt;
&lt;p&gt;На этом позвольте завершить данное повествование, очень надеюсь, что мне
удалось изложить суть максимально прозрачно. Эта тема будет активно
подниматься в дальнейших статьях по &lt;a href="/tag/oop/"&gt;ООП&lt;/a&gt;, так что очень
надеюсь, что она стала для Вас элементарной и очевидной. По традиции
напоминаю, что не пропустить публикацию новых постов можно &lt;a href="/feed/"&gt;подписавшись
на RSS&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Sun, 04 May 2008 13:41:00 +0400</pubDate><guid>tag:www.insight-it.ru,2008-05-04:theory/2008/interfejs/</guid><category>Java</category><category>интерфейс</category><category>ООП</category><category>Программирование</category></item><item><title>Hadoop</title><link>https://www.insight-it.ru//storage/2008/hadoop/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/30a7481/" rel="nofollow" target="_blank" title="http://hadoop.apache.org/core/"&gt;Hadoop&lt;/a&gt; представляет собой платформу
для построения приложений, способных обрабатывать огромные объемы
данных. Система основывается на распределенном подходе к вычислениям и
хранению информации, основными ее особенностями являются:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Масштабируемость:&lt;/strong&gt; с помощью &lt;a href="/tag/hadoop/"&gt;Hadoop&lt;/a&gt; возможно
    надежное хранение и обработка огромных объемов данных, которые могут
    измеряться петабайтами;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Экономичность:&lt;/strong&gt; информация и вычисления распределяются по
    &lt;a href="/tag/klaster/"&gt;кластеру&lt;/a&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;li&gt;&lt;strong&gt;Кроссплатформенность:&lt;/strong&gt; так как основным языком программирования,
    используемым в этой системе является &lt;a href="/tag/java/"&gt;Java&lt;/a&gt;, развернуть
    ее можно на базе любой операционной системы, имеющей &lt;abbr title="Java Virtual Machine"&gt;JVM&lt;/abbr&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;!--more--&gt;
&lt;h3 id="hdfs"&gt;HDFS&lt;/h3&gt;
&lt;p&gt;В основе всей системы лежит распределенная файловая система под
незамысловатым названием &lt;strong&gt;Hadoop Distributed File System&lt;/strong&gt;.
Представляет она собой вполне стандартную распределенную файловую
систему, но все же она обладает рядом особенностей:&lt;/p&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;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;h4&gt;Архитектура HDFS&lt;/h4&gt;
&lt;p&gt;Проще всего ее демонстрирует схема,
&lt;a href="https://www.insight-it.ru/goto/9c57006b/" rel="nofollow" target="_blank" title="http://hadoop.apache.org/core/docs/current/images/hdfsarchitecture.gif"&gt;позаимствованная&lt;/a&gt; с официального сайта проекта и переведенная мной на руский:
&lt;img alt="Архитектура HDFS" class="responsive-img" src="https://www.insight-it.ru/images/hdfsarchitecture.jpg" title="Архитектура HDFS"/&gt;&lt;/p&gt;
&lt;p&gt;Действующие лица:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Namenode&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Этот компонент системы осуществляет всю работу с метаданными. Он
должен быть запущен только на одном компьютере в кластере. Именно он
управляет размещением информации и доступом ко всем данным,
расположенным на ресурсах кластера. Сами данные проходят с остальных
машин кластера к клиенту мимо него.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Datanode&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;На всех остальных компьютерах системы работает именно этот
компонент. Он располагает сами блоки данных в локальной файловой
системе для последующей передачи или обработки их по запросу
клиента. Группы узлов данных принято называть Rack, они
используются, например, в схемах репликации данных.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Клиент&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Просто приложение или пользователь, работающий с файловой системой.
В его роли может выступать практически что угодно.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Пространство имен &lt;a href="/tag/hdfs/"&gt;HDFS&lt;/a&gt; имеет классическую иерархическую
структуру: пользователи и приложения имеют возможность создавать
директории и файлы. Файлы хранятся в виде блоков данных произвольной (но
одинаковой, за исключением последнего; по-умолчанию 64 mb) длины,
размещенных на &lt;strong&gt;Datanode&lt;/strong&gt;'ах. Для обеспечения отказоустойчивости блоки
хранятся в нескольких экземплярах на разных узлах, имеется возможность
настройки количества копий и алгоритма их распределения по системе.
Удаление файлов происходит не сразу, а через какое-то время после
соответствующего запроса, так как после получения запроса файл
перемещается в директорию &lt;strong&gt;/trash&lt;/strong&gt; и хранится там определенный период
времени на случай если пользователь или приложение передумают о своем
решении. В этом случае информацию можно будет восстановить, в противном
случае - физически удалить.&lt;/p&gt;
&lt;p&gt;Для обнаружения возникновения каких-либо неисправностей, &lt;strong&gt;Datanode&lt;/strong&gt;
периодически отправляют &lt;strong&gt;Namenode&lt;/strong&gt;'у сигналы о своей
работоспособности. При прекращении получения таких сигналов от одного из
узлов &lt;strong&gt;Namenode&lt;/strong&gt; помечает его как &lt;em&gt;"мертвый"&lt;/em&gt;, и прекращает какой-либо
с ним взаимодействие до возвращения его работоспособности. Данные,
хранившиеся на &lt;em&gt;"умершем"&lt;/em&gt; узле реплицируются дополнительный раз из
оставшихся &lt;em&gt;"в живых"&lt;/em&gt; копий и система продолжает свое функционирование
как ни в чем не бывало.&lt;/p&gt;
&lt;p&gt;Все коммуникации между компонентами файловой системы проходят по
специальным протоколам, основывающимся на стандартном &lt;strong&gt;TCP/IP&lt;/strong&gt;.
Клиенты работают с &lt;strong&gt;Namenode&lt;/strong&gt; с помощью так называемого
&lt;strong&gt;ClientProtocol&lt;/strong&gt;, а передача данных происходит по
&lt;strong&gt;DatanodeProtocol&lt;/strong&gt;, оба они &lt;em&gt;обернуты&lt;/em&gt; в &lt;strong&gt;Remote Procedure Call
(RPC)&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;Система предоставляет несколько интерфейсов, среди которых командная
оболочка &lt;strong&gt;DFSShell&lt;/strong&gt;, набор ПО для администрирования &lt;strong&gt;DFSAdmin&lt;/strong&gt;, а
также простой, но эффективный веб-интерфейс. Помимо этого существуют
несколько API для языков программирования: Java API, C pipeline, WebDAV
и так далее.&lt;/p&gt;
&lt;h3 id="mapreduce"&gt;MapReduce&lt;/h3&gt;
&lt;p&gt;Помимо файловой системы, &lt;a href="/tag/hadoop/"&gt;Hadoop&lt;/a&gt; включает в себя framework
для проведения масштабных вычислений, обрабатывающих огромные объемы
данных. Каждое такое вычисление называется Job (задание) и состоит оно,
как видно из названия, из двух этапов:&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;&lt;strong&gt;Map&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Целью этого этапа является представление произвольных данных (на
практике чаще всего просто пары ключ-значение) в виде промежуточных
пар ключ-значение. Результаты сортируются и групируются по ключу и
передаются на следующий этап.&lt;/dd&gt;
&lt;dt&gt;&lt;strong&gt;Reduce&lt;/strong&gt;&lt;/dt&gt;
&lt;dd&gt;Полученные после &lt;strong&gt;map&lt;/strong&gt; значения используются для финального
вычисления требуемых данных. Практические любые данные могут быть
получены таким образом, все зависит от требований и функционала
приложения.&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;Задания выполняются, подобно файловой системе, на всех машинах в
кластере (чаще всего одних и тех же). Одна из них выполняет роль
управления работой остальных - &lt;strong&gt;JobTracker&lt;/strong&gt;, остальные же ее
бесприкословно слушаются - &lt;strong&gt;TaskTracker&lt;/strong&gt;. В задачи &lt;strong&gt;JobTracker&lt;/strong&gt;'а
входит составление расписания выполняемых работ, наблюдение за ходом
выполнения, и перераспределение в случае возникновения сбоев.&lt;/p&gt;
&lt;p&gt;В общем случае каждое приложение, работающее с этим framework'ом,
предоставляет методы для осуществления этапов &lt;strong&gt;map&lt;/strong&gt; и &lt;strong&gt;reduce&lt;/strong&gt;, а
также указывает расположения входных и выходных данных. После получения
этих данных &lt;strong&gt;JobTracker&lt;/strong&gt; распределяет задание между остальными
машинами и предоставляет клиенту полную информацию о ходе работ.&lt;/p&gt;
&lt;p&gt;Помимо основных вычислений могут выполняться вспомогательные процессы,
такие как составление отчетов о ходе работы, кэширование, сортировка и
так далее.&lt;/p&gt;
&lt;h3 id="hbase"&gt;HBase&lt;/h3&gt;
&lt;p&gt;&lt;img alt="HBase Logo" class="right" src="https://www.insight-it.ru/images/hbase-logo.png" title="HBase"/&gt;
В рамках &lt;a href="/tag/hadoop/"&gt;Hadoop&lt;/a&gt; доступна еще и система хранения данных,
которую правда сложно назвать &lt;a href="/tag/subd/"&gt;СУБД&lt;/a&gt; в традиционном смысле
этого слова. Чаще проводят аналогии с проприетарной системой этого же
плана от &lt;a href="/tag/google/"&gt;Google&lt;/a&gt; - &lt;a href="/tag/bigtable/"&gt;BigTable&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/12419d3d/" rel="nofollow" target="_blank" title="http://hadoop.apache.org/hbase"&gt;HBase&lt;/a&gt; представляет собой
распределенную систему хранения больших объемов данных. Подобно
реляционным СУБД данные хранятся в виде таблиц, состоящих из строк и
столбцов. И даже для доступа к ним предоставляется язык запросов &lt;strong&gt;HQL&lt;/strong&gt;
(как ни странно - &lt;strong&gt;Hadoop Query Language&lt;/strong&gt;), отдаленно напоминающий
более распространенный &lt;a href="/tag/sql/"&gt;SQL&lt;/a&gt;. Помимо этого предоставляется
итерирующмй интерфейс для сканирования наборов строк.&lt;/p&gt;
&lt;p&gt;Одной из основных особенностей хранения данных в &lt;strong&gt;HBase&lt;/strong&gt; является
возможность наличия нескольких значений, соответствующих одной
комбинации таблица-строка-столбец, для их различения используется
информация о времени добавления записи. На концептуальном уровне таблицы
обычно представляют как набор строк, но физически же они хранятся по
столбцам, достаточно важный факт, который стоит учитывать при разработки
схемы хранения данных. Пустые ячейки не отображаются каким-либо образом
физически в хранимых данных, они просто отсутствуют. Существуют конечно
и другие нюансы, но я постарался упомянуть лишь основные.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;HQL&lt;/strong&gt; очень прост по своей сути, если Вы уже знаете &lt;a href="/tag/sql/"&gt;SQL&lt;/a&gt;,
то для изучения его Вам понадобится лишь просмотреть по диагонали
коротенький вывод команды &lt;strong&gt;help;&lt;/strong&gt;, занимающий всего пару экранов в
консоли. Все те же &lt;strong&gt;SELECT&lt;/strong&gt;, &lt;strong&gt;INSERT&lt;/strong&gt;, &lt;strong&gt;UPDATE&lt;/strong&gt;, &lt;strong&gt;DROP&lt;/strong&gt; и так
далее, лишь со слегка измененным синтаксисом.&lt;/p&gt;
&lt;p&gt;Помимо обычно командной оболочки &lt;strong&gt;HBase Shell&lt;/strong&gt;, для работы с &lt;strong&gt;HBase&lt;/strong&gt;
также предоставлено несколько API для различных языков программирования:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/f059ad5e/" rel="nofollow" target="_blank" title="http://hadoop.apache.org/hbase/docs/current/api/index.html"&gt;Java&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/e44fcd5/" rel="nofollow" target="_blank" title="http://wiki.apache.org/hadoop/Hbase/Jython"&gt;Jython&lt;/a&gt;,&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/8282e2e2/" rel="nofollow" target="_blank" title="http://wiki.apache.org/hadoop/Hbase/HbaseRest"&gt;REST&lt;/a&gt; и&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/185bb3f7/" rel="nofollow" target="_blank" title="http://wiki.apache.org/hadoop/Hbase/ThriftApi"&gt;Thrift&lt;/a&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="zakliuchenie"&gt;Заключение&lt;/h3&gt;
&lt;p&gt;&lt;a href="/tag/hadoop/"&gt;Hadoop&lt;/a&gt; является отличным решением для построения
высоконагруженных приложений, которое уже активно используется
&lt;a href="https://www.insight-it.ru/goto/ab057c2a/" rel="nofollow" target="_blank" title="http://wiki.apache.org/hadoop/PoweredBy"&gt;множеством интернет-проектов&lt;/a&gt;.
В последующих постах на эту тему я постараюсь описать процесс
развертывания этой системы и написания приложений, работающих по
принципу &lt;a href="/tag/mapreduce/"&gt;MapReduce&lt;/a&gt;. Не пропустить момент их публикации
Вам может помочь подписка на &lt;a href="/feed/"&gt;RSS-ленту&lt;/a&gt;.&lt;/p&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 22 Feb 2008 22:41:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-22:storage/2008/hadoop/</guid><category>Hadoop</category><category>HBase</category><category>HDFS</category><category>Java</category><category>MapReduce</category><category>архитектура</category><category>информационные технологии</category><category>кластер</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><item><title>Архитектура Flickr</title><link>https://www.insight-it.ru//highload/2008/arkhitektura-flickr/</link><description>&lt;p&gt;&lt;a href="https://www.insight-it.ru/goto/f50a76e1/" rel="nofollow" target="_blank" title="http://www.flickr.com"&gt;Flickr&lt;/a&gt; является мировым лидером среди сайтов
размещения фотографий. Перед Flickr стоит впечатляющая задача, они
должны контролировать обширное море ежесекундно обновляющегося контента,
непрерывно пополняющиеся легионы пользователей, постоянный поток новых
предоставляемых пользователям возможностей, а делается все это при
постоянной поддержке отличной производительности. Как же они это
делают?
&lt;!--more--&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/2008/arkhitektura-google/"&gt;"Архитектура Google"&lt;/a&gt;, этот тоже является
переводом &lt;a href="https://www.insight-it.ru/goto/e7a0ee0d/" rel="nofollow" target="_blank" title="http://highscalability.com/flickr-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;a href="/tag/google/"&gt;Google&lt;/a&gt; был более интересен, но подход Flickr к
масштабируемости тоже более чем заслуживает внимания. Далее привожу
источники информации из оригинальной статьи:&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/88014756/" rel="nofollow" target="_blank" title="http://www.niallkennedy.com/blog/uploads/flickr_php.pdf"&gt;Flickr и PHP&lt;/a&gt;
    (ранний документ)&lt;/li&gt;
&lt;li&gt;Планирование нагрузок на LAMP&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/6df1dabf/" rel="nofollow" target="_blank" title="http://www.bytebot.net/blog/archives/2007/04/25/federation-at-flickr-a-tour-of-the-flickr-architecture"&gt;Федерация Flickr: Тур по архитектуре Flickr&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/9e0a13a1/" rel="nofollow" target="_blank" title="http://highscalability.com/book-building-scalable-web-sites"&gt;Построение масштабируемых веб-сайтов&lt;/a&gt;
    от Call Handerson'а из Flickr&lt;/li&gt;
&lt;li&gt;История войн баз данных #3: Tim O'Reilly о Flickr&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.insight-it.ru/goto/d881b0d9/" rel="nofollow" target="_blank" title="http://www.iamcal.com/talks/"&gt;Cal Henderson's Talks&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/php/"&gt;PHP&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Сегментирование &lt;em&gt;(прим.: разбиение системы на части, обслуживающие
    каждая свою группу пользователей; называть можно было по-разному, но
    давайте остановимся на этом варианте перевода слова "Shards")&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; для кэширования&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; в качестве обратной-прокси для html и
    изображений&lt;/li&gt;
&lt;li&gt;&lt;a href="/linux"&gt;Linux&lt;/a&gt; (&lt;a href="/tag/redhat/"&gt;RedHat&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/smarty/"&gt;Smarty&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;PEAR для парсинга e-mail и XML&lt;/li&gt;
&lt;li&gt;ImageMagick для обработки изображений&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/apache/"&gt;Apache&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/systemimager/"&gt;SystemImager&lt;/a&gt; для развертывания систем&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/ganglia/"&gt;Ganglia&lt;/a&gt; для мониторинга распределенных систем&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/subcon/"&gt;Subcon&lt;/a&gt; хранит важные системные конфигурационные файлы
    в SVN-репозитории для легкого развертывания на машины в кластере.&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/cvsup/"&gt;Cvsup&lt;/a&gt; для распространения и обновления коллекций
    файлов по сети&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="statistika"&gt;Статистика&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Более четырех миллиардов запросов в день&lt;/li&gt;
&lt;li&gt;Примерно 35 миллионов фотографий в кэше &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Около двух миллионов фотографий в оперативной памяти
    &lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Всего приблизительно 470 миллионов изображений, каждое представлено
    в 4 или 5 размерах&lt;/li&gt;
&lt;li&gt;38 тысяч запросов к &lt;a href="/tag/memcached/"&gt;memcached&lt;/a&gt; (12 миллионов
    объектов)&lt;/li&gt;
&lt;li&gt;2 петабайта дискового пространства&lt;/li&gt;
&lt;li&gt;Более 400000 фотографий добавляются ежедневно&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id="arkhitektura"&gt;Архитектура&lt;/h3&gt;
&lt;p&gt;Симпатичное изображение архитектуры Flickr можно увидеть на &lt;a href="https://www.insight-it.ru/goto/d30e097b/" rel="nofollow" target="_blank" title="http://www.slideshare.net/techdude/scalable-web-architectures-common-patterns-and-approaches/138"&gt;этом слайде&lt;/a&gt;.
Краткое ее описание выглядит следующим образом:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Два ServerIron&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; кэши&lt;/li&gt;
&lt;li&gt;Системы хранения NetApp&lt;/li&gt;
&lt;li&gt;Серверы &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; приложений&lt;/li&gt;
&lt;li&gt;Менеджер хранения данных&lt;/li&gt;
&lt;li&gt;Master-master сегменты&lt;/li&gt;
&lt;li&gt;Центральная база данных, структурированная по принципу Dual
Tree&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&gt; кластер&lt;/li&gt;
&lt;li&gt;Поисковая система&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Хранение данных&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Структура Dual Tree является индивидуальным набором модификаций для
&lt;a href="/tag/sql/"&gt;MySQL&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;Отсутствие состояний заключается в том, что в случае необходимости
    они имеют возможность передать пользователей от сервера к серверу,
    что стало намного проще для них после создания своего 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;Обработка изображений, полученных от пользователей по электронной
    почте, происходит с помощью &lt;a href="/tag/php/"&gt;PHP&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;ul&gt;
&lt;li&gt;&lt;em&gt;Сегменты системы:&lt;/em&gt; Мои данные хранятся на моем сегменте, но
запись о Вашем комментарии хранится на Вашем сегменте.&lt;/li&gt;
&lt;li&gt;&lt;em&gt;Глобальное кольцо:&lt;/em&gt; Принцип работы схож с DNS, Вам необходимо
знать куда Вы хотите пойти и кто контролирует то место, куда Вы
собираетесь пойти.&lt;/li&gt;
&lt;li&gt;Логика на &lt;a href="/tag/php/"&gt;PHP&lt;/a&gt; устанавливает соединение с сегментом и
поддерживает целостность данных (10 строк кода с комментариями!)&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Сегменты:&lt;/strong&gt;&lt;ul&gt;
&lt;li&gt;Срез основной базы данных&lt;/li&gt;
&lt;li&gt;Активная репликация по принципу мастер-мастер: имеет несколько
недостатков в &lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt; 4.1. Автоматическое
инкрементирование идентификационных номеров используется для
поддержания системы в режиме одновременной активности обоих серверов
в паре&lt;/li&gt;
&lt;li&gt;Привязывание новых учетных записей к сегментам системы происходит
случайным образом&lt;/li&gt;
&lt;li&gt;Миграция пользователей проводится время от времени для того, чтобы
избавиться от проблем, связанных с излишне активными пользователями.
Необходима сбалансированность в этом процессе, особенно в случаях с
большим количеством фотографий&amp;hellip; 192 тысячи фотографий, 700 тысяч
тэгов, может занять несколько минут. Миграция выполняется вручную.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Нажатие на &lt;strong&gt;Favorite&lt;/strong&gt;:&lt;ul&gt;
&lt;li&gt;Получается информация об учетной записи владельца из кэша для
того, чтобы узнать к какому сегменту он привязан (допустим на
shard-5)&lt;/li&gt;
&lt;li&gt;Получается информация о моей учетной записи из кэша, более
конкретно - мой сегмент (например shard-13)&lt;/li&gt;
&lt;li&gt;Начинается "распределенная транзакция" для определения ответов на
вопросы: Кто добавил эту фотографию в избранное? Как изменился
список избранных фотографий?&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Подобные вопросы могут задаваться любому сегменту, информация на них
    абсолютно избыточна.&lt;/li&gt;
&lt;li&gt;Для избавления от задержек, связанных с репликацией...&lt;ul&gt;
&lt;li&gt;при каждой загрузке страницы, пользователю предоставляется список
серверов&lt;/li&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;Периоды пиковой нагрузки также нарушают правило 50% нагрузки. В
    такие моменты система получает 6-7 тысяч запросов в секунду, в то
    время как на данный момент система может работать на
    пятидесятипроцентном уровне нагрузки только при четырех тысячах
    запросов в секунду.&lt;/li&gt;
&lt;li&gt;В среднем при загрузке одной страницы выполняется 27-35
    SQL-запросов. Списки избранных фотографий обрабатываются в реальном
    времени, ровно как и доступ через API к базе данных. Все требования
    к нагрузке в реальном времени выполняются без каких-либо
    недостатков.&lt;/li&gt;
&lt;li&gt;Более 36 тысяч запросов в секунду может выполняться не выходя за
    рамки возможностей системы, даже при резком росте трафика.&lt;/li&gt;
&lt;li&gt;Каждый сегмент содержит данные о более чем 400 тысячах
    пользователей.&lt;/li&gt;
&lt;li&gt;Многие данные хранятся в двух местах одновременно. Например,
    комментарий является частью между комментатором и автором
    комментируемого контента. Где его хранить? Как насчет обоих мест?
    Транзакции используются для предотвращения рассинхронизации данных:
    открывается первая транзакция, выполняется запись, открывается
    вторая транзакция, выполняется запись, подтверждается первая
    транзакция если все нормально, после чего вторая подтверждается
    только в случае если первая прошла успешно.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Поиск&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Используется два варианта поиска: поиск в рамках сегмента,
поддерживающий до 35 тысяч запросов в секунду, а также проприетарный
веб-поиск от Yahoo!&lt;/li&gt;
&lt;li&gt;В 90% случаев используется система от Yahoo!, за исключением
поиска по тэгу фотографий одного пользователя и массовых изменений
тэгов.&lt;/li&gt;
&lt;li&gt;Эту систему стоит рассматривать как аналог Lucene.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Оборудование&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;EMT64 под управлением RHEL 4 с 16 Gb оперативной памяти.&lt;/li&gt;
&lt;li&gt;6 жестких дисков с 15000rpm, объединены в RAID-10.&lt;/li&gt;
&lt;li&gt;Размер для пользовательских метаданных достигает 12 терабайт (это
не включает фотографии, для них цифры существенно больше).&lt;/li&gt;
&lt;li&gt;Используются 2U корпуса.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Резервное копирование данных&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;ibbackup выполняется регулярно посредством cron daemon'а, на
каждом сегменте настроен на разное время.&lt;/li&gt;
&lt;li&gt;Каждую ночь делается снимок со всего кластера баз данных.&lt;/li&gt;
&lt;li&gt;Запись или удаление нескольких больших файлов с резервными копиями
одновременно на реплицирующую систему хранения может сильно
сократить производительность системы вцелом на последующие несколько
часов из-за процесса репликации. Выполнение этого на активно
работающей системе хранения фотографий было бы не самой лучшей
идеей.&lt;/li&gt;
&lt;li&gt;Содержание нескольких резервных копий всех Ваших данных требует
существенных материальных затрат, но оно того стоит. Особенно это
актуально для тех ситуаций, когда Вы понимаете, что что-то пошло не
так только спустя несколько дней после того как это случилось, в
таких случаях неплохо иметь, например, резервные копии 1, 3, 10 и
30-дневной давности.&lt;/li&gt;
&lt;li&gt;Фотографии хранятся в системе хранения данных. После загрузки
изображения система выдает различные его размеры, на чем ее работа
заканчивается. Метаданные и ссылки на файловые системы, где
расположены фотографии, хранятся в базе данных.&lt;/li&gt;
&lt;li&gt;Агрегация данных проходит очень быстро, так как она ограничена
пределами сегмента.&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_connections = 400&lt;/code&gt; соединений на каждый сегмент, неплохой запас.
Значение для кэша потоков установлено равным 45, так как не бывает
ситуаций когда более 45 пользователей одновременно выполняют
какие-либо действия с одним конкретным сегментом.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Тэги&lt;/h4&gt;
&lt;ul&gt;
&lt;li&gt;Тэги плохо вписываются в традиционную нормализованную схему
реляционной базы данных. Денормализация или активное кэширование -
единственные способы сгенерировать облако меток для сотен миллионов
тэгов в течении миллисекунд.&lt;/li&gt;
&lt;li&gt;Некоторые данные обрабатываются отдельными вычислительными
кластерами, которые сохраняют результаты своей работы в MySQL, так
как иначе вычисление сложных отношений заняло бы все процессорное
время основных серверов баз данных.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4&gt;Направления для развития&lt;/h4&gt;
&lt;p&gt;Ускорение работы с помощью создания
организационного плана для непрерывной работы всей системы на уровне
нескольких датацентров, таким образом чтобы все датацентры имели
возможность получать запросы на общий уровень данных (как сами БД,
так и memcache и прочее) все вместе одновременно. Если все части
системы постоянно активны - время простоя оборудования будет сведено
к минимуму.&lt;/p&gt;
&lt;h3 id="podvodim-itogi"&gt;Подводим итоги&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;Старайтесь думать о своем приложении как о чем-то большем, чем просто
    веб-приложении, тогда у Вас возможно появятся поддержка различных
    API, RSS и Atom ленты и многие другие возможности.&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;/li&gt;
&lt;li&gt;Создавайте четкие уровни абстракции между работой базы данных,
    бизнес-логикой, логикой страниц, разметкой страниц и презентационным
    уровнем. Это позволяет ускорить циклы итеративной разработки.&lt;/li&gt;
&lt;li&gt;Разделение приложения на уровни позволяет каждому заниматься своим
    делом: разработчики могут строить логику страниц, в то время как
    дизайнеры работают с удобством работы для пользователей.&lt;/li&gt;
&lt;li&gt;Делайте релизы как можно чаще, пускай даже это будет происходить
    каждые полчаса.&lt;/li&gt;
&lt;li&gt;Забудьте о всех небольших эффективных вещах, предварительная
    оптимизация является корнем всего зла в примерно 97% всех случаев.&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;li&gt;Как близко параметр находится к максимуму и каковы тенденции?&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/sql/"&gt;MySQL&lt;/a&gt; (дисковый ввод/вывод?)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/squid/"&gt;Squid&lt;/a&gt; (дисковый ввод/вывод? или процессорное время?)&lt;/li&gt;
&lt;li&gt;&lt;a href="/tag/memcached/"&gt;Memcached&lt;/a&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;Flickr получает на 20-40% больше новых фотографий в первый рабочий
день нового года, чем в любой пик в предыдущем году.&lt;/li&gt;
&lt;li&gt;По воскресеньям нагрузка в среднем на 40-50% выше, чем в любой
другой день недели.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Учтите возможность экспоненциального роста. Больше пользователей
    означает больше контента, больше контента означает больше
    соединений, больше соединений означает более активное использование.&lt;/li&gt;
&lt;li&gt;Планируйте возможные варианты управления работой системы в периоды
    пиковых нагрузок.&lt;/li&gt;
&lt;/ul&gt;</description><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Иван Блинков</dc:creator><pubDate>Fri, 08 Feb 2008 22:41:00 +0300</pubDate><guid>tag:www.insight-it.ru,2008-02-08:highload/2008/arkhitektura-flickr/</guid><category>Apache</category><category>Cvsup</category><category>flickr</category><category>Ganglia</category><category>Java</category><category>Linux</category><category>Memcached</category><category>MySQL</category><category>online</category><category>Perl</category><category>PHP</category><category>RedHat</category><category>shard</category><category>Smarty</category><category>Squid</category><category>Subcon</category><category>SystemImager</category><category>архитектура</category><category>архитектура Flickr</category><category>интернет</category><category>кластер</category><category>Масштабируемость</category><category>сервер</category></item></channel></rss>