<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Insight IT &#187; online</title>
	<atom:link href="http://www.insight-it.ru/tag/online/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.insight-it.ru</link>
	<description>Информационные технологии</description>
	<lastBuildDate>Tue, 31 Jan 2012 09:34:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Архитектура Plenty of Fish</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/#comments</comments>
		<pubDate>Mon, 18 Jan 2010 13:43:17 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Akamai CDN]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[dating]]></category>
		<category><![CDATA[Foundry]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Plenty of Fish]]></category>
		<category><![CDATA[POF]]></category>
		<category><![CDATA[ServerIron]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[Архитектура Plenty of Fish]]></category>
		<category><![CDATA[сайт знакомств]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=492</guid>
		<description><![CDATA[Plenty of Fish представляет собой очень популярный сервис онлайн знакомств, насчитывающий более 45 миллионов посетителей в месяц и 30+ миллионов просмотров страниц в сутки (что составляет около 500-600 страниц в секунду). Но это не самая интересная часть истории&#8230; Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.plentyoffish.com/" target="_blank" rel="external nofollow">Plenty of Fish</a> представляет собой очень популярный сервис онлайн знакомств, насчитывающий более 45 миллионов посетителей в месяц и 30+ миллионов просмотров страниц в сутки (что составляет около 500-600 страниц в секунду). Но это не самая интересная часть истории&#8230; Все это управляется единственным человеком при использовании нескольких серверов, при этом он тратит на работу всего пару часов в день и зарабатывает 6 миллионов долларов на рекламе от Google. Завидуете? Я тоже <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  Как же ему удалось соединить столько влюбленных пар, используя так мало ресурсов?<span id="more-492"></span></p>
<h2>Источники информации</h2>
<p><em>Данный пост является переводом <a href="http://highscalability.com/plentyoffish-architecture" target="_blank" rel="external nofollow">англоязычной статьи</a>, автор оригинала: Todd Hoff.</em></p>
<li><a href="http://channel9.msdn.com/ShowPost.aspx?PostID=331501#331501" target="_blank" rel="external nofollow">Channel9 интервью с Markus Frind</a></li>
<li><a href="http://plentyoffish.wordpress.com/ target="_blank" rel="external nofollow"">Блог Markus Frind</a></li>
<li><a href="http://www.readwriteweb.com/archives/plentyoffish_one_billion.php" target="_blank" rel="external nofollow">Plentyoffish: компания одного человека может стоить 1 миллиард долларов</a><br />
<h2>Платформа</h2>
</li>
<li>Microsoft Windows</li>
<li>ASP.NET</li>
<li>IIS</li>
<li>Akamai CDN</li>
<li>Foundry ServerIron Load Balancer</li>
<h2>Статистика</h2>
</li>
<li>PlentyOfFish (POF) имеет 1.2 миллиарда просмотров страниц в месяц, в среднем 500 тысяч уникальных авторизованных пользователей в день. Пиковый сезон приходится на январь каждого года, когда эти цифры возрастают на 30%.</li>
<li>POF имеет единственного сотрудника: создатель и генеральный директор Markus Frind.</li>
<li>Зарабатывает до 10 миллионов долларов в год на рекламе от Google, работает при этом только около двух часов в день.</li>
<li>30+ миллионов просмотров страниц в день (500 &#8212; 600 страниц в секунду).</li>
<li>1.2 миллиарда просмотров страниц  и 45 миллионов посетителей в месяц.</li>
<li>Имеет <a href="http://ru.wikipedia.org/wiki/CTR_(%D0%B8%D0%BD%D1%82%D0%B5%D1%80%D0%BD%D0%B5%D1%82)" target="_blank" rel="external nofollow">CTR</a> в 5-10 раз выше, чем Facebook.</li>
<li>Находится в top 30 сайтов США по данным Competes Attention, top 10 в Канаде и top 30 в Великобритании.</li>
<li>Нагрузка балансируется между двумя веб-серверами с 2 Quad Core Intel Xeon X5355 @ 2.66Ghz, 8GB RAM (используется около 800 MB), 2 жесткими дисками, работают под управлением Windows x64 Server 2003.</li>
<li>3 сервера баз данных. Информация об их конфигурации не предоставляется.</li>
<li>Приближается к 64000 одновременных соединений и 2 миллионам просмотрам страниц в час.</li>
<li>Интернет-канал в 1Gbps, из которых используется только 200Mbps.</li>
<li>1 TB трафика от отдачи 171 миллионов изображений через Akamai.</li>
<li>6TB система хранения данных для обработки миллионов полноразмерных изображений, которые загружаются на сайт каждый месяц.<br />
<h2>Что внутри?</h2>
</li>
<li>Модель монетизации заключалась в использовании рекламы от Google. Match.com, для сравнения, получает 300 миллионов долларов в год, в основном с платных подписок. Источник дохода POF должен измениться, чтобы позволить ему получать больше выручки от имеющихся пользователей. Планируется нанять больше сотрудников, в частности людей, которые будут заниматься продажей рекламы напрямую вместо того, чтобы полностью полагаться на AdSense.</li>
<li>При 30 миллионах просмотрах страниц в день можно зарабатывать неплохие деньги на рекламе, даже если <a href="http://en.wikipedia.org/wiki/Cost_per_mille" target="_blank" rel="external nofollow">CPM</a> будет всего 5-10 центов.</li>
<li>Akamai используется для отдачи более 100 миллионов изображений в день. Если на странице 8 изображений и каждое загружается за 100 миллисекунд &#8212; их загрузка займет почти секунду, так что распределение изображений целесообразно.</li>
<li>Десятки миллионов изображений отдаются с серверов POF, но большинство из них размером меньше 2KB и практически полностью закешированы в оперативной памяти.</li>
<li>Все динамично. Практически никакой статики.</li>
<li>Все исходящие данные сжимаются с использованием Gzip, что обходится всего 30% использованием процессорного времени. Используется много вычислительных ресурсов, но зато существенно сокращается использование пропускной способности интернет-канала.</li>
<li>Кэширование ASP .NET не используется, так как данные теряют свою актуальность практически сразу же.</li>
<li>Встроенные компоненты ASP также не используется. Почти все написано с чистого листа. Ничего не может быть более сложным, чем кучка простых if-then-else и циклов. Все максимально элементарно.</li>
<li>Балансировка нагрузки:<br />
- IIS  произвольно ограничивает общее количество соединений до 64000, таким образом балансировщик нагрузки был добавлен для обработки большего количества одновременных соединений. Вариант с добавлением второго IP адреса и использованием round robin DNS также рассматривался, но вариант с балансировщиком нагрузки выглядел более избыточным и позволял более легко расширять количество серверов. Помимо этого ServerIron позволял использовать более продвинутую функциональность, вроде блокировки ботов и балансировку запросов по cookies, сессиям или IP-адресам пользователей.<br />
- Windows Network Load Balancing (NLB) функция не использовалась, так как не поддерживает привязку сессий к серверам. Обходным путем было бы хранение сессионных данных в базе данных или общей файловой системе.<br />
- 8-12 NLB серверов могут объединяться в кластер и может использоваться неограниченное количество таких кластеров. Схема DNS round robin может использоваться для распределения запросов между кластерами. Теоретически такая архитектура могла бы позволить 70 веб-серверам обрабатывать более  300 тысяч одновременных соединений.<br />
- NLB имеет опцию для отправки каждого пользователя на конкретный сервер, таким образом не используется внешнее хранилище для сессионных данных и если сервер выходит из строя &#8212; пользователи просто разлогиниваются из системы. Если это состояние включает в себя например корзину интернет-магазина или какую-то другую важную информацию, то такой подход мог бы показаться неприемлемым, но для сайта знакомств это было бы не так критично.<br />
- Было решено, что хранение и получение сессионных данных программными средствами слишком дорого. Аппаратная балансировка нагрузка проще: пользователи просто назначаются конкретным серверам и в случае сбоя сервера назначенным ему пользователям предлагается пройти процесс авторизации еще раз.<br />
- Покупка ServerIron была дешевле и проще, чем использование NLB. Многие крупные сайты используют их для создания пулов TCP соединений, автоматическому определению ботов и так далее. ServerIron может делать намного больше, чем просто балансировать нагрузку и такие функции достаточно привлекательные за эту цену.</li>
<li>Была большая проблема с выбором системы размещения рекламы. Многие из них хотели несколько сотен тысяч в год и многолетний контракт.</li>
<li>В процессе избавления от ASP.NET повторителей и использование взамен конкатенации строк или response.write. Если у вас миллионы просмотров страниц в день &#8212; просто напишите весь код для отображения на экране пользователя.</li>
<li>Большинство изначальных вложений ушло на построение SAN. Избыточность любой ценой.</li>
<li>Рост был за счет вирусного эффекта. Портал начал набирать популярность в Канаде, затем о нем узнали в Великобритании и Австралии, и только потом в США.</li>
<li>База данных:<br />
- Одна база данных является основной.<br />
- Две базы данных для поиска. Поисковые запросы распределяются по их типу.<br />
- Производительность наблюдается через диспетчер задач. Когда появляются пики &#8212; ситуация рассматривается более детально. Проблемы обычно заключались в блокировках на уровне СУБД. Собственно говоря почти всегда это были проблемы с базами данных, очень редко они возникают на уровне .NET. Так как POF не использует библиотеки .NET, отследить проблемы с производительностью оказывается достаточно просто. Если бы использовалось много уровней framework&#8217;ов, поиск мест, где скрываются проблемы, был бы трудным и утомляющим.<br />
- Если Вы делаете запрос к базе данных 20 раз при отображении одной страницы,  Вы проиграли в любом случае, вне зависимости от того, что Вы будете делать.<br />
- Разделяйте запросы чтения и записи к базе данных. Если у вас нет избыточного количества оперативной памяти не следование этому правилу может заставить систему зависнуть на несколько секунд.<br />
- Постарайтесь делать базы данных только для чтения.<br />
- Денормализуйте данные. Если Вам приходится доставать данные из 20 разных таблиц, попробуйте сделать просто одну таблицу, где будут лежать все нужные для чтения данные.<br />
- Один день может проработать почти что угодно, но когда Ваша база данных удвоится &#8212; использованные подход может внезапно перестать работать.<br />
- Если система делает только что-то одно, она будет делать это реально хорошо. Только записывайте данные и все будет нормально. Только читайте данные и все будет нормально. Делайте и то и другое &#8212; и все испортится. База данных погрязнет в проблемах с блокировками.<br />
- Если Вы полностью используете вычислительные мощности, Вы либо делаете что-то не так, либо Ваша система на самом деле очень оптимизирована. Если вы можете разместить всю базу в оперативной памяти &#8212; обязательно делайте это.</li>
<li>Процесс разработки выглядит примерно следующим образом: появляется идея, быстро реализуется и выдается пользователям в пределах 24 часов. Отклик от пользователей получается по слежению за тем, что они делают на сайте: выросло количество сообщений на пользователя? среднее время сессий выросло? Если пользователям новая фишка не пришлась по вкусу &#8212; просто уберите её.</li>
<li>При небольшом количестве серверов системные сбои достаточно редки и краткосрочны. Наибольшими сложностями были проблемы с DNS, когда некоторые интернет-провайдеры говорили, что POF больше не существует. Но так как сайт бесплатен, пользователи нормально относятся к небольшим периодам его недоступности. Люди часто не замечают простой сайта, так как думают, что это какая-то проблема у них, с интернет-соединением или еще чем-то.</li>
<li>Переход от миллиона пользователей к 12 миллионам пользователей был большим прыжком. Система может обслуживать и 60 миллионов пользователей с двумя веб-серверами.</li>
<li>Часто смотрите на конкурентов для идей новых функциональных возможностей.</li>
<li>Рассмотрите использование чего-то вроде S3, когда система начнет требовать географической балансировки.<br />
<h2>Подводим итоги</h2>
</li>
<li>Вам не нужны миллионы в финансировании, размашистая инфраструктура и целое здание сотрудников для того, чтобы создать вебсайт мирового уровня, который обслуживает кучу пользователей и приносит неплохие деньги. Все что нужно &#8212; всего лишь привлекательная идея, которая понравится большому количеству идей, сайт, который становится популярным благодаря слухам, а также опыт и видение для построения сайта, не наступая на типичные &#171;грабли&#187;. Вот и все, что Вам нужно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </li>
<li>Необходимость &#8212; мать всех изменений.</li>
<li>Когда вы растете быстро, но не слишком быстро, у Вас появляется шанса расти, модифицировать и адаптироваться.</li>
<li>Максимальное использование оперативной памяти решает массу проблем. После этого рост возможен просто за счет использование более мощных серверов.</li>
<li>В начале старайтесь держать все максимально простым. Практически все дают этот же самый совет, а Markus говорит, что все что он делает &#8212; всего лишь очевидный здравый смысл. Но то что просто, не всегда означает всего лишь осмысленную вещь. Создание простых вещей является результатом многих лет практического опыта.</li>
<li>Поддерживайте время доступа к базе данных быстрым и у Вас не будет проблем.</li>
<li>Одной из основных причин, по которой POF может работать с таким небольшим количеством сотрудников и оборудования, является использование CDN для отдачи активно используемого контента. Использование CDN может оказаться секретным соусом для многих крупных сайтов. Markus считает, что в top 100 не существует ни одного сайта, не использующего CDN. Без CDN время загрузки страницы в Австралии возросло бы до 3-4 секунд только за счет изображений.</li>
<li>Реклама на Facebook принесла плохие результаты. Из 2000 кликов только 1 человек регистрировался. С CTR равным 0.04% Facebook выдавал 0.4 клика на 1000 показов рекламы (CPM). При 5 центах CPM = 12.5 центов за клик, 50 центах CPM = 1.25$ за клик. 1 доллар CPM = 2.50$ за клик. 15$ CPM = 37.50$ за клик.</li>
<li>Это просто продавать несколько миллионов просмотров страниц с высоким CPM, но НАМНОГО сложнее продавать миллиарды просмотров с высоким CPM, как это делают Myspace и Facebook.</li>
<li>Модель монетизации, основанная на рекламе, ограничивает Ваши доходы. Вам придется переходить к платной модели чтобы повышать прибыль. Генерировать 100 миллионов долларов в год за счет бесплатного сайта  практически невозможно &#8212; Вам потребуется слишком большой рынок.</li>
<li>Повышение количества просмотров за счет Facebook не работает для сайтов знакомств. Иметь посетителя на собственном сайте намного более прибыльно. Большинство просмотров страниц на Facebook находятся за пределами США и Вам придется делить 5 центов CPM с Facebook.</li>
<li>Предложение пользователям при регистрации получить информацию об ипотеке или каком-то другом продукте, может стать неплохим источником дополнительной выручки.</li>
<li>Вы не можете постоянно прислушиваться к отзывам пользователей. Кому-то всегда будут нравиться новые функции, а кто-то всегда будет их ненавидеть, но только часть из них сообщит Вам об этом. Вместо этого лучше смотреть как новые функции влияют на то, чем люди на самом деле занимаются, просто смотря на Ваш сайт и статистику его использования.</li>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-plenty-of-fish/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Aladdin от Baidu</title>
		<link>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/#comments</comments>
		<pubDate>Wed, 13 Jan 2010 21:01:12 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Aladdin]]></category>
		<category><![CDATA[Baidu.com]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[поиск]]></category>
		<category><![CDATA[поисковые системы]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=407</guid>
		<description><![CDATA[Наверняка все прекрасно знают о лидерах интернет-поиска в российской части интернета: про Google, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали &#8212; ведь уже прошло больше 10 лет с момента создания каждой из этих поисковых систем и, как следствие, их конкуренции на просторах рунета. Намного меньше же [...]]]></description>
			<content:encoded><![CDATA[<p><img title="Aladdin" src="http://www.insight-it.ru/wp-content/uploads/2009/12/left01.gif" alt="Aladdin Logo" width="643" height="176" /></p>
<p>Наверняка все прекрасно знают о лидерах интернет-поиска в российской части интернета: про Google, Яндекс или Рамблер сказано уже не мало слов, все много раз о них читали, пользовались, обсуждали &#8212; ведь уже прошло больше 10 лет с момента создания каждой из этих поисковых систем и, как следствие, их конкуренции на просторах рунета. Намного меньше же внимания на российских информационных сайтах уделяется национальным проектам других стран, а ведь среди них тоже есть заслуживающие внимания экземпляры, об одном из них я бы и хотел сегодня поведать.<br />
<span id="more-407"></span></p>
<h2>Источники данных</h2>
<ul>
<li><a href="http://tech.sina.com.cn/i/2009-12-16/14423683386.shtml" target="_blank" rel="external nofollow">Baidu Aladdin Technology Guashudila</a></li>
<li><a href="http://tech.sina.com.cn/i/2009-08-18/16063362415.shtml" target="_blank" rel="external nofollow">Rachel Liao, лекция директора по архитектуре Baidu</a></li>
<li><a href="http://news.xinhuanet.com/it/2006-04/06/content_4390847.htm" target="_blank" rel="external nofollow">Baidu Chief Architect: алгоритмы на службе разработчиков Baidu</a></li>
<li><a href="http://baike.baidu.com/view/2086291.htm" target="_blank" rel="external nofollow">Aladdin Plans</a></li>
</ul>
<p><em>Если кто-то достаточно любопытен, чтобы нажать на приведенные ссылки &#8212; они все на китайском, так что статья написана на основе перевода Google Translate со всеми вытекающими последствиями. Даже за название &#171;Aladdin&#187; не ручаюсь, его тоже он придумал <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </em></p>
<h2>О компании Baidu</h2>
<p><a href="http://www.baidu.com" target="_blank" rel="external nofollow">Baidu.com</a> является лидером китайского рынка интернет-поиска, объем которого достаточно значителен. На данный момент Китай насчитывает около 340-360 миллионов интернет-пользователей, что превышает общую численность населения США. Не трудно представить с каким трафиком приходится сталкиваться крупнейшей китайской поисковой системе.</p>
<p>Чтобы не быть голословным, еще немного цифр о Baidu:</p>
<ul>
<li>100 миллионов поисковых запросов в день</li>
<li>Более миллиарда проиндексированных страниц</li>
<li>300-400 миллионов проиндексированных сайтов</li>
</ul>
<p>Уже на сегодняшний день размеры китайской части интернета производят впечатление и с каждым днем она расширяется все больше. Как следствие, на рынке образуются все новые и новые возможности для создания сервисов, удовлетворяющих потребности китайских пользователей Интернет. Компания <strong>Baidu Inc.</strong> пристально наблюдает за развитием ситуации и обнаружила огромную потребность среди сервис-провайдеров в удобной платформе для создания и предоставления пользователям новых сервисов. Baidu считает создание платформы для использования их технологии сторонними разработчиками и сервис-провайдерами очень важным направлением развития на пути к повышению качества пользовательского опыта в целом. Эти наблюдения стали толчком к рождению в рамках Baidu новой технологии под названием <a href="http://open.baidu.com/" target="_blank" rel="external nofollow">Aladdin</a>.</p>
<p>Как крупнейшей китайской поисковой системе, Baidu приходится быть чем-то большим, чем просто инструментом для поиска, это позволяет удовлетворять потребности потенциальных клиентов наиболее гармоничным и целесообразным образом. Помимо неустанной погони за технологическими инновациями, Baidu предпочитает придерживаться политики &#171;потребности клиентов важнее всего&#187;.</p>
<h2>Aladdin</h2>
<p>Согласно официальному сайту Baidu, эта технология представляет собой открытую поисковую платформу, позволяющую сторонним разработчикам использовать технологию Baidu в своих приложениях и сервисах. Владельцы интернет-проектов и разработчики могут предоставить Baidu данные в уже структурированном виде для того, чтобы создать еще более мощные и функционально-насыщенные приложения, позволяя интернет-сайтам получать еще более значимый трафик, а пользователям &#8212; еще больше облегчить использование сайтов и поиск в сети Интернет.</p>
<p>В декабре 2008 года Baidu объявили о высокоприоритетной программе под кодовым названием <em>&#171;Aladdin&#187;</em>, основной идеей была попытка расширить текущие рамки веб-поиска, по большей части за счет включения так называемого &#171;глубинного интернета&#187; в поисковую базу, проведения более глубокого анализа контента. Помимо этого упоминались возможность интеграции и управляемой обработки информации, направленных на минимизацию издержек поиска и времени обработки запроса при повышение общего качества поисковых результатов. В том же заявлении Baidu также описали их общую позицию по данному направлению: платформа Aladdin является надстройкой над текущей поисковой системой Baidu, позволяющей дополнение и расширение функциональных возможностей.</p>
<p>Согласно исследованиям Baidu, только 75% пользователей поисковых систем в конечном итоге удовлетворяют свои информационные потребности. В процессе анализа причин данного факта было выявлено, что в большом количестве случаев искомая информация находится на ресурсах по каким-то причинам находящимся вне доступа поисковых систем (начиная от технических ограничений, отсутствия внешних ссылок на ресурс и заканчивая искусственными барьерами вроде REP или принудительной авторизации).</p>
<p>Перед разработчиками Aladdin встают две основные проблемы с точки зрения технической реализации: &#171;как определить пользовательские потребности&#187; и &#171;как сортировать&#187;. Конечно же они очень тесно связаны между собой, это хорошо демонстрирует пример с поисковым запросом &#171;полное солнечное затмение&#187;: до затмения пользователи хотят когда оно будет и откуда лучше смотреть, а во время и после него намного актуальнее будет увидеть видео-запись или прямую трансляцию, а также прочитать и поделиться комментариями. Самым простым методом решения данного класса задач является статистический анализ &#8212; Aladdin выделяет два основных фактора, используемых для сортировки результатом в соответствии с потребностями пользователей: &#171;удовлетворенность потребностей&#187; и &#171;уровень отклика на спрос&#187;. Конечно же оценочные характеристики спроса и потребностей не означают сам спрос, то есть возможны и более сложные ситуации, когда за пользовательским запросом стоит целый комплекс более простых потребностей.</p>
<p>Алгоритмы, используемые в Aladdin для решения упомянутых проблем, основаны на машинном обучении, анализе поведения пользователей, а также обратной связи от использования технологии на практике. Конечная цель данной платформы заключается в построении целой интеллектуальной экосистемы,  которая станет новым шагом в развитии компании Baidu и китайской части интернета в целом.</p>
<h3>Возможности платформы</h3>
<p>С технической точки зрения Aladdin от Baidu представляет собой открытый API к поисковой технологии Baidu, позволяющий добавлять свои данные в структурированном виде в поисковый индекс, отмечать релевантные ключевые слова, методы отображения информации и пометки данных гео-метками.</p>
<p>Одним из важнейших направлений развития поисковых систем является повышение &#171;интеллектуальности&#187; поиска, Baidu уделяет внимание не только обнаружению более ценной информации в глубинах Интернета, но и предоставлению более удобных, точных и сообразительных поисковых сервисов.</p>
<p>На сегодняшний день, технология Aladdin была интегрирована в ряд приложений, позволив тем самым реализовать на страницах с результатами поиска множество интересных возможностей: прямой звонок клиенту для обсуждения каких-то товаров или услуг, интеграция с почтовым сервисом, прослушивание музыки с использованием встроенного flash-плеера и многие другие.</p>
<p>После обязательной процедуры подачи и рассмотрения заявки пользователям платформы Aladdin предоставляются следующие возможности:</p>
<ul>
<li>Добавление данных в индекс в структурированном виде</li>
<li>Указание ключевых слов для более точного прямого воздействия на целевую аудиторию</li>
<li>Управление сортировкой и отображением информационного контента</li>
<li>Управление стилем и внешним видом имеющихся ресурсов, причем не только текстовых</li>
<li>Выбор частоты обновления информации для синхронизации данных</li>
</ul>
<p>На первый взгляд все эти рассуждения и заявления о функциональных возможностях кажутся абсурдными, даже отчасти ироничными. Ну кому может понадобиться вручную управлять результатами поиска, добавлять и структурировать данные, возиться с сортировкой и внешним видом?</p>
<h3>Взгляд с другой стороны</h3>
<p>Да, вся платформа Aladdin по своей задумке очень искуственна: практически все делается вручную, но по сути это лишь процесс интеграции, а не работа с самим контентом. Для большинства других поисковых систем такой подход неприемлем: где найти столько людей, чтобы управлять огромными массивами данных вручную? Наоборот все поисковые системы стремятся по максимуму все автоматизировать и борятся с искуственным вмешательством в поисковый индекс (т.н. SEO), но&#8230; если вспомнить, что Baidu работает в Китае &#8212; вся затея начинает обретать здравый смысл. Как сама компания Baidu, так и большинство их потенциальных партнеров, клиентов и пользователей находится в примерно одинаковой ситуации: большое количество дешевой рабочей силы, относительно низкий уровень образования и профессиональной подготовки, а также прочие национальные особенности. В их ситуации не выгодно идти по пути Google и делать <em>основной</em> акцент на построении полностью автоматизированных систем анализа контента, добавления дополнительного материала к поисковым результатам и самим делать различные дополнительные приложения и сервисы. Намного выгоднее пойти по собственному пути, более адаптированному к ситуации в Китае, большое количество трудолюбивых людей позволяет строить сервисы коллективно, с привлечением партнеров, клиентов и заинтересованных лиц. Да, во многом вручную, за счет интеграции совершенно различных систем и сервисов, но зато более качественно и продуманно. В этом-то и заключается вся магия Китая.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/aladdin-ot-baidu/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Нам два годика</title>
		<link>http://www.insight-it.ru/life/wordpress/nam-dva-godika/</link>
		<comments>http://www.insight-it.ru/life/wordpress/nam-dva-godika/#comments</comments>
		<pubDate>Sun, 03 Jan 2010 20:59:22 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[День Рождения]]></category>
		<category><![CDATA[ДР]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[итоги года]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=439</guid>
		<description><![CDATA[В общем судя по всему я решил считать 3 января 2008 года Днем Рождения Insight IT, так что как раз самое время написать очередной бестолковый &#171;праздничный&#187; пост, по совместительству выполняющий роль &#171;новогоднего&#187; (надо же поздравить всех читателей с Наступившим, хоть и несколько поздновато; отметил я просто замечательно и три дня провел без интернета). В повестке дня [...]]]></description>
			<content:encoded><![CDATA[<p>В общем судя по всему я решил считать 3 января 2008 года Днем Рождения <strong>Insight IT</strong>, так что как раз самое время написать очередной бестолковый &#171;праздничный&#187; пост, по совместительству выполняющий роль &#171;новогоднего&#187; (надо же поздравить всех читателей с Наступившим, хоть и несколько поздновато; отметил я просто замечательно и три дня провел без интернета). В повестке дня у нас сегодня обзор основных событий прошедшего года и планы на наступивший, кому интересно &#8212; читаем дальше <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> <span id="more-439"></span></p>
<p><img title="Далее..." src="http://www.insight-it.ru/wp-includes/js/tinymce/plugins/wordpress/img/trans.gif" alt="" />Как не сложно увидеть по датам постов &#8212; первые 10 месяцев года прошли очень пассивно для данного блога. Я был весь в работе и учебе, постов писал мало, на комментарии отвечал редко &#8212; в общем халтурил по полной программе. Впрочем время для меня зря не прошло &#8212; успел получить степень бакалавра Бизнес-Информатики и поступить в магистратуру на программу &#171;Электронный бизнес&#187;. В дополнение к общему затишью ложку дегтя добавлял теперь уже бывший хостинг провайдер (по прежнему не хочу устраивать анти-рекламу, российская компания с доменом из двух букв, кому было интересно уже наверное давно успели посмотреть) &#8212; возможно кто-то из читателей помнит эти регулярные проблемы с доступностью сайта, некоторые из которых даже доходили до простоев более двух недель подряд.</p>
<p>На этом в общем-то негативные стороны заканчиваются, так что перейдем к положительным моментам. Во-первых, блог переехал-таки на новый хостинг в США: там существенно более ответственно относятся к клиентам, отличная техподдержка, пока никаких сбоев, современное оборудование, никаких фиксированных ограничений по трафику/дисковому пространству/процессорному времени/чему-то еще в этом духе &#8212; в целом пока вижу в данном решении почти только плюсы, из минусов разве что чуть больший пинг и цена на 500р./год выше. Во-вторых, в октябре я остался без работы &#8212; про это я уже рассказывал достаточно подробно, повторяться не буду. В общем у меня стало появляться существенно больше свободного времени, которое я мог позволить себе тратить на блог. Не трудно заметить возросшую активность как в постах, так и в комментариях, циферки в статистике <em>Google Analytics</em>, <em>Feedburner</em> и <em>WordPress.com Stats</em> достаточно резво растут вверх и я надеюсь, что эта тенденция продолжится и на протяжении всего наступившего года. Уже накопилась масса идей для новых постов &#8212; осталось только найти в себе силы материализовать их.</p>
<p>Вообще я уже почти три месяца сижу без работы и почему-то чем дальше &#8212; тем менее активно ищу новую. Некоторое время назад, примерно одновременно с принятием решения о смене хостинга, мне пришла в голову идея попробовать зарабатывать на <strong>Insight IT</strong>, чтобы позволить себе оттягивать <a href="/resume" target="_blank">процесс поиска работы</a> как можно дальше. Сначала попробовал наиболее &#171;гуманный&#187; по отношению к читателям метод, который более-менее сносно работал в 2008 году &#8212; поставил побольше блоков <em>Google AdSense</em>. Оказалось больше не работает, цены за клик упали в 3-5 раз, да и CTR ниже плинтуса. Этот факт подтолкнул меня создать появившуюся в меню навигации несколько дней назад страничку <a href="/reklama" target="_blank"><em>&#171;Реклама&#187;</em></a> (возможно кто-то уже успел ознакомиться), основная идея &#8212; я готов размещать ту или иную форму рекламы напрямую, без посредников в виде бирж или каких-то других автоматизированных систем. Очень надеюсь, что кто-то заинтересуется и откликнется, иначе у меня останется только очень не нравящийся мне самому вариант со всяким бредом из области SEO: вроде продажи ссылок на биржах, размещении чужих статей и тому подобного&#8230; Либо вообще отказываться от затеи с монетизацией блога и возвращаться к поиском &#171;офисной&#187; работы, но вообще мне очень не хотелось бы снова забрасывать <strong>Insight IT</strong>, одно из самых любимых хобби как-никак.</p>
<p>Основные темы блога мне по-прежнему очень интересны: как информационные технологии в целом, так и <a href="/highload">архитектуры высоконагруженных систем</a> в частности. Мне наверное еще предстоит поэкспериментировать с различными форматами изложения информации, более узкими темами и вопросами, чтобы подстроиться под наверняка изменившиеся за прошедший год интересы аудитории блога, я по прежнему рад комментариям, письмам на wordpress@insight-it.ru и другим видам обратной связи. По старинке хочется порекомендовать всем, кто этого еще не сделал, <a href="/feed" target="_blank"><em>подписаться на RSS</em></a>.</p>
<p>До новых встреч!</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/wordpress/nam-dva-godika/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Новый Google: интернет-гигант проливает свет на темы поиска в реальном времени, локального поиска, облачных вычислений и освобождения данных</title>
		<link>http://www.insight-it.ru/set/novyjj-google-internet-gigant-prolivaet-svet-na-temy-poiska-v-realnom-vremeni-lokalnogo-poiska-oblachnykh-vychislenijj-i-osvobozhdeniya-dannykh/</link>
		<comments>http://www.insight-it.ru/set/novyjj-google-internet-gigant-prolivaet-svet-na-temy-poiska-v-realnom-vremeni-lokalnogo-poiska-oblachnykh-vychislenijj-i-osvobozhdeniya-dannykh/#comments</comments>
		<pubDate>Tue, 29 Dec 2009 15:17:27 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Сеть]]></category>
		<category><![CDATA[cloud computing]]></category>
		<category><![CDATA[data liberation]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[local search]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[realtime search]]></category>
		<category><![CDATA[интервью]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[облачные вычисления]]></category>
		<category><![CDATA[освобождение данных]]></category>
		<category><![CDATA[поиск]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=385</guid>
		<description><![CDATA[Когда речь заходит о продуктовых и бизнес стратегиях, Google обычно становится одной из самых скрытных и секретных компаний. Но не смотря на это, интернет-гигант некоторое время назад согласился дать серию интервью, в основном с участием высшего продуктового менеджмета, работающего в штабквартире в Mountain View, CA. В четырех отдельных интервью, сотрудники Google окунулись в самые насущные [...]]]></description>
			<content:encoded><![CDATA[<p>Когда речь заходит о продуктовых и бизнес стратегиях, Google обычно становится одной из самых скрытных и секретных компаний. Но не смотря на это, интернет-гигант некоторое время назад согласился дать серию интервью, в основном с участием высшего продуктового менеджмета, работающего в штабквартире в Mountain View, CA.</p>
<p>В четырех отдельных интервью, сотрудники Google окунулись в самые насущные темы, наиболее актуальные для компании в целом. Среди них оказались различные вопросы, начиная с поиска в реальном времени, локального поиска, и заканчивая облачными вычислениями, а также так называемой возможностью освобождения данных. Под освобождением данных имеется ввиду комплекс мер, направленных на предоставлении пользователям возможности экспортировать их файлы и другую цифровую информацию из продуктов Google (если они сами этого захотят, конечно же).</p>
<p>Достаточно любопытный факт: менеджеры Google реально очень скучные. И им правда нравится выглядеть именно так (по крайней мере пока их PR-коллеги находятся рядом). Они не разговаривают о конкурентах. Они не делают прогнозов о развитии индустрии. И они не говорят конкретно кто над чем работает внутри Google. Просто-напросто они фокусируются на совершенствовании своих продуктов, особенно в направлении удобства использования пользователями, разве этого не достаточно?</p>
<p>Возможно Jack Menzel, старший продукт-менеджер, лучше всего это выразил, когда пошутил о &#171;неблагодарности&#187; работы над веб-поиском в Google: &#171;Вы демонстрируете [новую функцию поиска] людям, а они говорят: &#8216;Да, вроде она работает, ну и что?&#8217;&#187; (Как быстро все мы забываем, каково это было искать информацию в Интернете всего несколько лет назад.) Что ж, без дальнейших предисловий, перейдем к основным моментам, связанным с различными аспектами работы Google.</p>
<p><span id="more-385"></span> <em>По мотивам <a href="http://www.xconomy.com/national/2009/12/21/the-new-google-internet-giant-opens-up-about-real-time-and-local-search-cloud-computing-and-data-liberation/?single_page=true" target="_blank" rel="external nofollow">статьи на xconomy.com</a>, автор <a title="Posts by Gregory T. Huang" href="http://www.xconomy.com/author/ghuang/" target="_blank" rel="external nofollow">Gregory T. Huang</a>.</em></p>
<h2>Поиск в реальном времени</h2>
<p>Google активно работает над максимально оперативным обновлением результатов поиска по сети Интернет, в том числе и по социальным медиа вроде Twitter или Facebook, практически так же быстро, как такая информация и публикуется.</p>
<p>Menzel, бывший сотрудник Microsoft, который изучал компьютерное ремесло в University of Washington, возглавляет продуктовую группу на данном фронте. Он говорит, что компания Google работала над ускорением процесса индексации и ранжирования на протяжении уже многих лет: когда-то данные обновлялись раз в месяц, потом обновление стало ежедневным, чтобы поспевать за блогами и новостными сайтами. В течении прошлого года <a href="/tag/twitter" target="_blank">Twitter</a> стал популярен и, как следствие, появилась достаточно критичная потребность в обновлении информации за считанные секунды или в крайнем случае минуты. &#171;Мы двигались по направлению к тому, чтобы становиться все быстрее и быстрее, на протяжении уже достаточно длительного периода времени&#187;, говорит Menzel. &#171;Данная траектория развития была выбрана уже давно. Каждый шаг в данном направлении приводит к все новым и новым проблемам и трудностям. Мы верим, что именно получение доступа к свежей информации является одним из ключевых факторов, являющихся залогом успеха Google.&#187; (В число остальных факторов, относящихся к самому поиску, входят такие показатели как релевантность, быстрота получения результата и полнота контента.)</p>
<p>Menzel считает, что самой сложной задачей является не просто быстродействие, а релевантность результатов потребностям пользователей (возможно, кто-то привык называть этот показатель словом <em>&#171;пертинентность&#187;</em>). &#171;Это очень, очень непросто собирать свежий короткоживущий контент и ранжировать его рядом с, скажем, статьями из New York Times или просто постами из блогов.&#187; Стоит заметить, что когда контент появился буквально только что, обычно на него еще практически никто не успел сослаться, а значит Google не может полноценно использовать PageRank, их классическую технологию.</p>
<p>Вместо этого, они &#171;тяжело опираются на все то, что они выявили в течении последних 10 лет&#187;, говорит Menzel. Это включает в себя, например, способы отбрасывания контента, который скорее всего является иррелевантным или спамом, в более общем случае.  Помимо этого он упоминал &#171;совершенно новые сигналы&#187;, скажем &#171;новые языковые модели&#187;, которые позволяют понять какие обновления являются релевантыми, а какие &#8212; просто горстка никому не нужных данных от какого-нибудь ученого-океанографа, или методы определения насколько тот или иной создатель контента авторитетен в своей области.</p>
<p>Говоря о будущем, Menzel повторил то, что казалось бы на сегодняшний день говорят все о поиске: еще рано. &#171;На самом деле мы лишь начали работать над данной задачей и у нас все еще очень долгий путь впереди&#187;. Он надеется, что в течении 5 лет Google сделает поиск намного более персонализированным, чем он есть сегодня. Например, Google будет знать что ты увлекаешься футболом, но привык называть его не &#171;soccer&#187;, а &#171;football&#187;, то есть помимо прочего поисковая система должна понимать кем является каждый ее конкретный пользователь, как и с кем он связан, кем он является в реальной жизни, где находится, и, тем самым, помогать ему организовывать всю информацию вокруг него.</p>
<p>&#171;Поиск &#8212; все еще очень далекая от решения проблема,&#187; &#8212; говорит Menzel.  &#187;Существует еще масса вещей, которые очень не просто найти в Интернете.&#187;</p>
<h2>Локальный поиск</h2>
<p>В эту категорию попадают все виды поисковых запросов, так или иначе связынных с географической информацией, скажем &#171;отели в Гонг-Конге&#187; или &#171;рестораны в Сиэттле&#187;, а также запросы с мобильных устройств на поиск близлежайших мест, заведений, достопримечательностей и прочих объектов.</p>
<p>Carter Maslan, директор продуктового менеджмента в области локального поиска в Google, называет эту область &#171;организацией мировой информации географически&#187; , или созданием быстрого и простого гида по &#171;гео-Интернету&#187;. Самым сложным моментом в данном вопросе по его мнению является отображение всех этих различных способов выражения пользовательского запроса на очень большой массив локализированных данных, а также возвращение правильного ответа на полученный запрос в минимальные сроки.</p>
<p>Maslan, еще один экс-сотрудник Microsoft, говорит, что Google обрабатывает большое количество поисковых запросов для анализа того, как люди предпочитают искать локальную информацию, и как с географической точки зрения создаются ссылки на различные вещи. По его мнению конечная цель заключается в том, чтобы сделать поиск и обнаружение мест рядом с собой практически не требующим от пользователя каких-либо усилий. Наиболее знакомые сценарии, это помощь в ориентировании в новом окружении, скажем после приземления в аэропорту, или поиск баров во время ночной прогулки по пригородам Нью-Йорка.</p>
<p>Складывается впечатление, что все это должно плотно вписываться в более широкую стратегию Google, связанную с мобильными технологиями. &#171;Ваш телефон знает многое&#187;  - говорит Maslan. &#171;Он знает где Вы сейчас находитесь, он может определить в каком направлении Вы направляетесь. Все не ограничивается только текстом в окошке для поискового запроса. Мы хотим вывести мобильную информацию на передний план.&#187; Существующим на данный момент примером является <a href="http://www.google.com/mobile/goggles/" target="_blank" rel="external nofollow">Google Goggles</a>, приложение, которое позволяет сфотографировать логотип, достопримечательность или какое-то место и мгновенно получить информацию о нем.</p>
<p>Maslan считает, что основной отличительной чертой Google в области локального поиска является &#171;открытость для всех источников&#187;, что достаточно сложно с технической точки зрения. Это включает в себя пребывание в состоянии &#171;активной глобальности&#187;, а не просто в индексировании информации о ключевых станциях метро. &#171;Масштаб, с которым Google работает с картографическими и гео-кодированными данными, в совокупности с пониманием принципов работы Интернета является ключем для успешной работы в данной области&#187;.</p>
<p>Возможно в скором будущем мы увидим вещи вроде карт и списков компаний или мест от Google в еще большем количестве мест и языков по всему миру, с еще более точной информацией, чутко реагирующей на локальные события вроде открытия, закрытия или перемещения предприятий и организаций. &#171;Мы четко понимаем, какие именно вещи у нас получаются лучше всего&#187; &#8212; говорит Maslan. &#171;У нас есть небольшие команды из людей, фанатично настроенных на реализацию их наиболее правильным образом&#187;.</p>
<h2>Облачные вычисления</h2>
<p>Наверняка все наслышаны о знаменитых вычислениях &#171;в облаках&#187;, то есть с использованием программного обеспечения, работающем на удаленных серверах, часто нескольких одновременно и в виртуализированном окружении, а не прямо на персональном компьютере. В этом ключе Google наиболее интересует выполнение повседневных задач, таких как работа с электронной почтой, составление расписаний и управление документами. На самом деле это всего лишь часть более широкой стратегии Google по облачным вычисления &#8212; именно она создает видимость того, что потребитили, предприятия и организации арендуют вычислительный мощности и хранилища данных через Интернет, так как это дешевле и более эффективно для многих приложений.</p>
<p>Ken Norton, старший продукт-менеджер Google (а также выпускник Boston University и бывший предприниматель), поведал о Google Apps и стратегии компании в области облачных вычислений. Команда Norton&#8217;а работает конкретно над Google Calendar, но Google Apps также включают в себя и другие продукты, такие как Gmail, Google Talk, Google Docs и Google Sites. “Сеть выигрывает на том, как приложения будут потребляться” &#8212; он сказал.</p>
<p>Ключевым преимуществом Google на данном фронте является масштаб и инфраструктура. &#171;У нас есть настолько много серверов и датацентров по всему миру, что мы можем содержать их достаточно дешево и эффективно&#187; &#8212; говорит Norton. Это преимущество оказывает влияние и на индивидуальные устройства, так как оно &#171;открывает новые возможности&#187; для потребителей, возможность использовать веб-приложения с любого типа устройств, будь то смартфон, нетбук или обычный полноразмерный ноутбук.</p>
<p>Работа Google в области облачных вычислений сфокусирована на двух уровнях: на первом располагаются готовые программные продукты вроде Google Apps, направленные на прямое потребление конечными пользователями (как индивидуальными, так и корпоративными); второй же уровень занимает App Engine, &#171;облачная&#187; платформа, предназначенная для использования разработчиками программного обеспечения для эффективного построения их собственных веб-продуктов.</p>
<p>Относительно прогнозов на следующий год на фронте облачных вычислений, Norton сказал, что &#171;мы постоянно совершенствуемся&#187;. В 2009 году было запущенно более 100 основных новых функциональных возможностей в Google Apps &#8212; таких вещей, как видео чат в GTalk или Gmail offline. Он считает, что Google &#171;продолжит делать акцент на коммуникационных предложениях&#187;. Помимо развития Gmail и Calendar, это включает в себя доведение до ума Google Docs и придание более завершенного вида набору их возможностей. Norton говорит, что Google также ищет возможности по расширению своих предложений в области коллаборации, в том числе в виде продуктов для крупного бизнеса, совместимыми с различными системами обеспечения безопасности для аутентификации.</p>
<p>Подведем черту: все выглядит как-будто Google совершает переход от фокусирования на бесплатных потребительских продуктах, работающих в &#171;облаках&#187;, к более активной работе над платными облачными сервисами для бизнес-пользователей.</p>
<h2>Освобождение данных</h2>
<p>Последнее время в компании все больше внимания уделяется предоставлению пользователям легко экспортировать их данные из продуктов Google, таких как Blogger, Google Maps, Google Docs, Chrome и App Engine (пользовательские данные разработчиков). На первый взгляд это может показаться очередным капризом PR-менеджеров, но на самом деле за этим фактом стоит более глубокая и интересная инновационная стратегия.</p>
<p>Brian Fitzpatrick, ветеран opensource разработок, возглавляет двухлетний проект от офисов Google в Чикаго. Основная идея заключается в оказании помощи пользователям, если они хотят получить свои файлы и другие данные из облака Google, чтобы у них была возможность перейти на какую-то другую систему, если они захотят. &#171;Большинство людей не думает о возможности экспорта данных до тех пор пока не станет слишком поздно&#187; &#8212; говорит Fitzpatrick. &#171;Мы надеемся, что если вы прекратите использование одного нашего продукта сегодня, то у вас будет возможность попробовать другой продукт завтра.&#187;</p>
<p>Помимо &#171;создания правильных возможностей для пользователей&#187; существует и другая мотивация. &#171;Мы, как компания, старательно работаем над такими вещами, как поиск. Если пользователи становятся привязанным к вашим продуктам, то вы становитесь более самодовольными, расслабленными. Если же уйти достаточно просто, то вы будете серьезно мотивированны делать свои продукты как можно лучше, чтобы избежать ухода пользователей любой ценой.&#187;</p>
<p>Что ж, теперь у нас есть эта возможность. Google считает, что эта открытость с точки зрения пользовательских данных, заставит компанию работать более старательно для удержания пользовательской базы. Fitzpatrick не знает других компаний, которые бы открыто заявляли об инициативе создания подобных возможностей для своих пользователей.</p>
<p>По его мнению наибольшая трудность лежит не собственно в разработке такого функционала, а в повышение осведомленности пользователей о наличии возможности экспортировать свои данные из облака. &#171;Достаточно сложно заставить пользователей думать, что это на самом деле важно&#187;. Но в целом этот подход достаточно достаточно хорошо вписывается в понятие о том, как потребители и корпоративные пользователи заботятся о всех своих данных, когда все большая и большая их част мигрирует &#171;в облака&#187; и как Google хочет быть ответственным за организацию мировых данным, шаг за шагом, на протяжении всего пути.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/novyjj-google-internet-gigant-prolivaet-svet-na-temy-poiska-v-realnom-vremeni-lokalnogo-poiska-oblachnykh-vychislenijj-i-osvobozhdeniya-dannykh/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Дизайн, верстка и RSS</title>
		<link>http://www.insight-it.ru/life/wordpress/dizajjn-verstka-i-rss/</link>
		<comments>http://www.insight-it.ru/life/wordpress/dizajjn-verstka-i-rss/#comments</comments>
		<pubDate>Mon, 28 Dec 2009 17:44:03 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[feedback]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[RSS]]></category>
		<category><![CDATA[верстка]]></category>
		<category><![CDATA[внешний вид]]></category>
		<category><![CDATA[дизайн]]></category>
		<category><![CDATA[опрос]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=390</guid>
		<description><![CDATA[Я лично считаю, что очень важно после каких-либо кардинальных изменений сайта получить feedback от пользователей. Данный пост служит именно для этих целей. Для затравки пара опросов: [poll id="11"] [poll id="12"] В добавок хочется услышать отзывы об этих и других нововведениях (вроде нового хостинга) в комментариях. Еще буду рад, если кто-то предложит какие-нибудь интересные и востребованные [...]]]></description>
			<content:encoded><![CDATA[<p>Я лично считаю, что очень важно после каких-либо кардинальных изменений сайта получить feedback от пользователей. Данный пост служит именно для этих целей.<span id="more-390"></span></p>
<p>Для затравки пара опросов:</p>
<p>[poll id="11"]</p>
<p>[poll id="12"]</p>
<p>В добавок хочется услышать отзывы об этих и других нововведениях (вроде нового хостинга) в комментариях.</p>
<p>Еще буду рад, если кто-то предложит какие-нибудь интересные и востребованные темы для новых постов и обсуждений, у меня есть и свои соображения, но мнение читателей для меня тоже очень важно.</p>
<p>Всем, проявившим инициативу, заранее спасибо за помощь в улучшении блога <strong>Insight IT</strong>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/wordpress/dizajjn-verstka-i-rss/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Архитектура MySpace</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/#comments</comments>
		<pubDate>Mon, 21 Dec 2009 13:15:56 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[ASP]]></category>
		<category><![CDATA[ASP .NET]]></category>
		<category><![CDATA[highload]]></category>
		<category><![CDATA[IIS]]></category>
		<category><![CDATA[Microsoft]]></category>
		<category><![CDATA[MSSQL]]></category>
		<category><![CDATA[MySpace]]></category>
		<category><![CDATA[myspace.com]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Windows]]></category>
		<category><![CDATA[Windows Server]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура MySpace]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=370</guid>
		<description><![CDATA[MySpace.com является одним из наиболее быстро набирающих популярность сайтов в Интернете с 65 миллионами пользователей и 260000 регистрациями в день. Этот сайт часто подвергается критике из-за не достаточной производительности, хотя на самом деле MySpace удалось избежать ряда проблем с масштабируемостью, с которыми большинство других сайтов неизбежно сталкивались. Как же им это удалось? Источники информации Данная [...]]]></description>
			<content:encoded><![CDATA[<p><a rel="external nofollow" href="http://www.myspace.com" target="_blank">MySpace.com</a> является одним из наиболее быстро набирающих популярность сайтов в Интернете с 65 миллионами пользователей и 260000 регистрациями в день. Этот сайт часто подвергается критике из-за не достаточной производительности, хотя на самом деле MySpace удалось избежать ряда проблем с масштабируемостью, с которыми большинство других сайтов неизбежно сталкивались. Как же им это удалось?<br />
<span id="more-370"></span></p>
<h2>Источники информации</h2>
<p><em>Данная статья является переводом статьи <a rel="external nofollow" href="http://highscalability.com/blog/2009/2/12/myspace-architecture.html" target="_blank">MySpace Architecture</a>, автором которой является Todd Hoff. Когда-то давно один из читателей этого блога просил меня осветить и эту тему, тогда я так и не решился из-за отсутствия моего личного интереса, но сейчас снова случайно наткнулся на эту статью и подумал: а почему бы и нет?</em></p>
<ul>
<li><a rel="external nofollow" href="http://www.infoq.com/news/2009/02/MySpace-Dan-Farino" target="_blank">Презентация: за сценой MySpace.com</a></li>
<li><a rel="external nofollow" href="http://www.baselinemag.com/c/a/Projects-Networks-and-Storage/Inside-MySpacecom/" target="_blank">Внутри MySpace.com</a></li>
</ul>
<h2>Платформа</h2>
<ul>
<li>ASP .NET 2.0</li>
<li>Windows</li>
<li>IIS</li>
<li>MSSQL Server</li>
</ul>
<h2>Что внутри?</h2>
<ul>
<li>300 миллионов пользователей.</li>
<li>Отдает 100Gbps в Интернет. 10Gbps из них является HTML контентом.</li>
<li>4,500+ веб серверов со связкой: Windows 2003 / IIS 6.0 / ASP .NET.</li>
<li>1,200+ кэширующих серверов, работающих на 64-bit Windows 2003. На каждом 16GB объектов находятся в кэше в оперативной памяти.</li>
<li>500+ серверов баз данных, работающих на 64-bit Windows и SQL Server 2005.</li>
<li>MySpace обрабатывает 1.5 миллиарда просмотров страниц в день, а также 2.3 миллионов одновременно работающих пользователей в течении дня.</li>
<li>Вехи по количеству пользователей:<br />
- 500 тысяч пользователей: простая архитектура перестает справляться<br />
- 1 миллион пользователей: вертикальное партиционирование временно спасает от основных болезненных вопросов с масштабированием<br />
- 3 миллиона пользователей: горизонтальное масштабирование побеждает над вертикальным<br />
- 9 миллионов пользователей: сайт мигрирует на ASP.NET, создается виртуализированная система хранения данных (SAN)<br />
- 26 миллионов пользователей: MySpace переходит на 64-битную технологию.</li>
<li>500 тысяч учетных записей было многовато для двух веб-серверов и одного сервера баз данных.</li>
<li>На 1-2 миллионах учетных записей:<br />
- Они использовали архитектуру базы данных, построенную на концепции вертикального партиционирования, с отдельными базами данных для разных частей сайта, которые использовались для выполнения различных функций, таких как экран авторизации, профили пользователей и блоги.<br />
- Схема с вертикальным партиционированием помогала разделить нагрузку как для операций чтения, так и для операций записи, а если пользователям в друг оказывалась нужна новая функциональная возможность &#8212; достаточно было просто добавить еще один сервер баз данных для её обслуживания.<br />
- MySpace переходит от использования систем хранения, подключенных к серверам баз данных напрямую, к сетям хранения данных (SAN), при таком подходе целый массив систем хранения объединяется вместе специализированной сетью с высокой пропускной способностью, и сервера баз данных также получают доступ к хранилищам через эту сеть. Переход к SAN оказал положительное влияние как на производительность, так и на доступность и надежность системы.</li>
<li>На 3 миллионах учетных записей:<br />
- Решение с вертикальным партиционированием не протянуло долго, так как им приходилось реплицировать какую-то часть информации (например информацию об учетных записях) по всем вертикальным частям базы данных. С таким большим количеством операций репликации данных один узел даже при незначительном сбое мог существенно замедлить обновление информации во всей системе.<br />
- Индивидуальные приложения вроде блогов на под-секциях сайта достаточно быстро стали слишком большими для нормальной работы с единственным сервером базы данных<br />
- Произведена реорганизация всех ключевых данных для более логичной организации в единственную базу данных<br />
- Пользователи были разбиты на группы по миллиону в каждой и каждая такая группа была перемещена на отдельный SQL Server</li>
<li>9–17 миллионов учетных записей:<br />
- Переход на ASP .NET, который требовал меньше ресурсов по сравнению с их предыдущим вариантом архитектуры. 150 серверов, использовавших новый код могли обработать нагрузку, для которой раньше требовалось 246 серверов.<br />
- Снова пришлось столкнуться с узким местом в системе хранения данных. Реализация SAN решило какую-то часть старых проблем с производительностью, но на тот момент потребности сайта начали переодически превосходить возможности SAN по пропускной способности операций ввода-вывода &#8212; той скорости, с которой она может читать и писать данные на дисковые массивы.<br />
- Столкнулись с лимитом производительности при размещении миллиона учетных записей на одном сервере, ресурсы некоторых серверов начали исчерпываться.<br />
- Переход к виртуальному хранилищу, где весь SAN рассматривается как одно большое общее место для хранения данных, без необходимости назначать конкретные диски для хранения данных определенной части приложения. MySpace на данный момент работает со стандартизированным обородуванием от достаточно нового вендора SAN &#8212; 3PARdata</li>
<li>Был добавлен кэширующий уровень — прослойка из специализированных серверов, расположенных между веб-серверами и серверами данных, чья единственная задача была захватывать копии часто запрашиваемых объектов с данными в памяти и отдавать их веб-серверам для минимизации количества поиска данных в СУБД.</li>
<li>26 миллионов учетных записей:<br />
- Переход на 64-битные сервера с SQL Server на правах решения проблемы с недостатком оперативной памяти. С тех пор их стандартеый сервер баз данных оснащен 64 GB RAM.</li>
<li><strong>Горизонтальная федерация баз данных</strong>. Базы данных партиционируются в зависимости от своего назначения. У них есть базы данных с профилями, электронными сообщениями и так далее. Каждая партиция основана на диапазоне пользоваталей. По миллиону в каждой базе данных. Таким образом,  у них есть Profile1, Profile2 и все остальные базы данных вплоть до Profile300, если считать, что у них на данный момент зарегистрировано 300 миллионов учетных записей.</li>
<li>Кэш ASP не используется, так как он не обеспечивает достаточного процента попаданий на веб серверах. Кэш, организованный как промежуточный слой, имеет существенно более высокое значение данного показателя.</li>
<li><strong>Изоляция сбоев</strong>. Внутри веб-сервера запросы сегментируются по базам данным. Разрешено использование только 7 потоков для работы с каждуой базой данных. Таким образом, если база данных по каким-то причинам начинает работать медленно, только эти потоки замедлятся, в то время как остальные потоки будут успешно продолжать обрабатывать поток трафика.</li>
</ul>
<h2>Работа сайта</h2>
<ul>
<li><strong>Коллектор данных о производительности</strong>. Централизованная система сбора информации о производительности через UDP. Такой подход более надежен, чем стандартный механизм Windows, а также позволяет любому клиенту подключиться и увидеть статистику.</li>
<li><strong>Веб-система по просмотру дампов стеков процессов</strong>. Можно просто сделать клик правой кнопкой мыши на проблемном сервере и увидеть дамп стека процесов, управляемых .NET. И это после привычки каждой раз удаленно подключаться к серверу, влючать дебаггер и через полчаса получать свой ответ о том что же все таки происходит. Медленно, немасштабируемо и утомительно. Эта же система позволяет увидеть не просто стек процесса, но и предоставляет большое количество информации о контектсе, в котором он работает. Обнаружение проблем намного проще при таком подходе, например можно легко увидеть, что база не отвечает, так как 90 ее потоков заблокировано.</li>
<li><strong>Веб-система создания дампа heap-памяти</strong>. Создает дамп всей выделенной памяти. Очень удобно и полезно для разработчиков. Сэкономьте часы на выполнение этой работы вручную.</li>
<li><strong>Профайлер</strong>. Прослеживает запрос от начала до конца и выводит подробный отчет. В нем можно увидеть URL, методы, статус, а также все, что поможет идентифицировать медленный запрос и его причины. Обнаруживает проблемы с блокировкой потоков, непредвиденными исключениями, другими словами все, что может оказаться интересным. В то же время остается очень легковесным решением. Работает на одной машине из каждой VIP (группа из 100 серверов) в production-среде. Опрашивает 1 поток каждые 10 секунд. Постоянно следит за системой в фоновом режиме.</li>
<li><strong>Powershell</strong>. Новая программная оболочка от Microsoft, которая работает в процессе и передаем объекты между командами вместо работы с текстовыми данными. MySpace разрабатывает множество так называемых commandlets&#8217;ов для поддержки различных операций.</li>
<li>Разработана собственная технология асинхронной коммуникации для того, чтобы обойти проблемы с сетевыми проблемами Windows и работать с серверами как с группой. Например, она позволяет доставить файл .cs, скомпилировать его, запустить, и доставить результат обратно.</li>
<li><strong>Развертывание</strong>. Обновление кодовой базы происходит с помощью упомянутой выше собственной технологии. Ранее происходило до 5 таких обновлений в день, сейчас же они происходят лишь раз в неделю.</li>
</ul>
<h2>Подводим итоги</h2>
<ul>
<li>С помощью стека Microsoft тоже можно делать большие веб-сайты.</li>
<li>Стоит использовать кэширование с самого начала.</li>
<li>Кэш является более подходящим местом для хранения временных данных, не требующих персистентности, например информации о пользовательских сессиях.</li>
<li>Встроенные в операционные систему возможности, например по обнаружению DDoS-атака, могут приводить к необъяснимым сбоям.</li>
<li>Храните свои данные в географически удаленных датацентрах для минимизации проблем, связанных со сбоями в электросети.</li>
<li>Рассматривайте возможности использования виртуализированных систем хранения данных или кластерных файловых систем с самого начала. Это позволит существенно параллелизировать операции ввода-вывода, а также увеличивать дисковое пространство без необходимости какой-либо реорганизации.</li>
<li>Разрабатывайте утилиты для работы с production окружением. Невозможно смоделировать все ситуации в тестовой среде. Масштабируемость и все различные варианты использования API не могут быть симулированы в процессе тестирования качества программного обеспечения.  Обычные пользователи и хакеры обязательно найдут такие способы использования вашего продукта, о которых вы даже никогда и не подумаете в процессе тестирования, хотя конечно большая часть все же обнаружима в процессе QA тестирования.</li>
<li>Когда это возможно &#8212; лучше просто использовать дополнительное оборудование для решения проблем. Это намного проще, чем изменять поведение программного обеспечения для того чтобы решать задачи как-то по-другому. Примером может служить добавление нового сервера на каждый миллион пользователей. Возможно было бы более эффективным изменить подход к самой работе с СУБД, но на практике все же проще и дешевле добавлять все новые и новые сервера. По крайней мере на данный момент.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-myspace/feed/</wfw:commentRss>
		<slash:comments>18</slash:comments>
		</item>
		<item>
		<title>Google Chrome</title>
		<link>http://www.insight-it.ru/unix-way/linux/google-chrome/</link>
		<comments>http://www.insight-it.ru/unix-way/linux/google-chrome/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 21:36:49 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Chrome]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Chrome]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[браузер]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=90</guid>
		<description><![CDATA[Наверное многие из вас уже успели за последние пару дней стать свидетелями всей этой шумихи на просторах Сети, связанной с выходом Google на рынок браузеров. Сопутствующие релизу комиксы произвели на меня вполне положительное впечатление, благодаря достаточно большой актуальности поднятых в них проблем и интересным вариантам их решений. Так что я определенно решил, что поглядеть что [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/google-chrome.png" title="Google Chrome" alt="Google Chrome" style="float:right;margin:64px 16px;" /><br />
Наверное многие из вас уже успели за последние пару дней стать свидетелями всей этой шумихи на просторах Сети, связанной с выходом Google на рынок браузеров. Сопутствующие релизу <a href="http://www.google.com/googlebooks/chrome/#" target="_blank" rel="nofollow">комиксы</a> произвели на меня вполне положительное впечатление, благодаря достаточно большой актуальности поднятых в них проблем и интересным вариантам их решений. Так что я определенно решил, что поглядеть что за зверь такой &#8212; <strong>Google Chrome</strong>, определенно стоит, а что из этого вышло я и хотел бы тут рассказать, так что очередную рекламу нового продукта или какие-либо практически полезные советы у Вас врядли получится здесь обнаружить.<br />
<span id="more-90"></span><br />
Первым делом я посетил <a href="http://www.google.com/chrome" target="_blank" rel="nofollow">официальную страничку браузера</a> и практически сразу немного разочаровался, увидев в заголовке надпись <strong>Google Chrome (BETA) for W****ws</strong>. Сразу напросился вопрос: а где версия для <strong><em>Linux</em></strong>? Покопавшись в соседних страничках ничего подобного обнаружить не удалось &#8212; пришлось пожать плечами с мыслью &#171;наверное еще не сделали&#187;.</p>
<p>Зато через какое-то время наткнувшись на очередную заметку про все ту же довольно избитую тему, я заметил ма-а-аленькую неприметную <a href="http://dev.chromium.org/developers/how-tos/build-instructions-linux" target="_blank" rel="nofollow">ссылку</a> на &#171;инструкцию по компиляции Google Chrome из исходников в Linux&#187;. В очередной раз пожав плечами с мыслью &#171;а нам не привыкать, все равно Gentoo пользуюсь&#187; отправился вводить заветное заклинание в свежесозданную консольку.</p>
<p>Заклинание это выглядит примерно следующим образом:</p>
<pre lang="bash">
#!/bin/bash
CHROME=/usr/local/src
mkdir $CHROME/chrome
cd $CHROME/chrome
export LANG=C
$CHROME/depot_tools/gclient config http://src.chromium.org/svn/trunk/src
$CHROME/depot_tools/gclient sync
cd $CHROME/src/chrome
../third_party/scons/scons.py Hammer
</pre>
<p>Для успешного каста требуются следующие ингридиенты:</p>
<ul>
<li>subversion &gt;= 1.4</li>
<li>pkg-config &gt;= 0.20</li>
<li>python &gt;= 2.4</li>
<li>perl &gt;= 5.x</li>
<li>gcc/g++ &gt;= 4.2</li>
<li>bison &gt;= 2.3</li>
<li>flex &gt;= 2.5.34</li>
<li>gperf &gt;= 3.0.3</li>
<li>libnss3-dev &gt;= 3.12</li>
</ul>
<p>Начался процесс вполне оптимистично &#8212; строчки, генерируемые <strong>svn co</strong> побежали по экрану вполне весело, но когда этот процесс затянулся на более чем час &ndash; стало очевидно, что даже <em>Google</em> оказалось не по зубам выдержать такой наплыв желающх &#171;заценить&#187; новую игрушку и обеспечить достаточную пропускную способность на сервере с SVN. Правда и масштабы проекта мягко говоря впечатляют &#8212; директория с исходным кодом перед инициализацией компиляции оказалось очень даже весомой: <strong>2.6 GB</strong>. В общем в итоге я не придумал ничего лучше, чем по старой традиции оставить браузер компилироваться на ночь и с чистой совестью уползти спать.</p>
<p>В итоге оказалось, что в результате получается не вовсе браузер, а лишь некоторые непонятно зачем нужные бинарники: надо было внимательно читать инструкцию, особенно обведенный в красную рамку блок &#8212; студенческая привычка при чтении чего-либо подсознательно отфильтровывать всю на первый взгляд второстепенную информацию, попадающую в категорию &#171;слишком много букв&#187;, дала о себе знать <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_sad.gif' alt=':(' class='wp-smiley' />  В общем там об этом все заранее предупреждали &#8212; я просто не заметил, ну да ладно: в wine-то оно точно заведется, все тот же Google с легкостью помог обнаружить соответствующий мануал, для моего Gentoo он свелся к следующему:</p>
<pre lang="bash">
#!/bin/bash
emerge --sync; emerge -av wine cabextract
cd /usr/bin
sudo wget www.kegel.com/wine/winetricks
sudo chmod +x winetricks
winetricks riched20 riched30 flash allfonts
cd ~
wget gpdl.google.com/chrome/install/149.27/chrome_installer.exe
wine chrome_installer.exe
rm chrome_installer.exe
</pre>
<p>Запуск с ходу из инсталлятора ничем хорошим не закончилcя, но вот такая команда вполне нормально запустила-таки браузер</p>
<pre lang="bash">
wine ~/.wine/drive_c/windows/profiles/m11/Local Settings/Application Data/Google/Chrome/Application/chrome.exe--new-http --in-process-plugins
</pre>
<p><em>(если кто соберется копипастить &#8212; не забываем подменять m11 на свое имя пользователя)</em></p>
<p>Первое впечатление &#8212; ужасный V**ta-like дизайн, вернее не то чтобы он совсем ужасный &#8212; минималистичность очень даже полезное свойство для дизайна браузера, но в мое KDE 3.5.9 темно-фиолетовой раскраски он не вписывается ну совсем никак. Ну да ладно &#8212; пока он стоит &#171;просто побаловаться&#187;, то можно и потерпеть. Далее я решил пройтись по основным &#171;фишечкам&#187;, заинтересовавшим меня в комиксах &#8212; все реализовано вполне &#171;как обещали&#187;, очень много концептуально правильных решений, которых в старом-добром FF определенно не хватает (перечислять наверное смысла нет &#8212; все и так уже, наверное, в курсе что там есть &#171;вкусненького&#187;). Но и многих абсолютно жизненно-важных вещей я там не обнаружил &#8212; начиная с блокировки рекламы и заканчивая все тем же стандартно-фиксированным дизайном и отсутствием центрального репозитория плагинов. Кое-какие неприятности можно свалить на все еще не окончательную доведенность до ума wine (проблемы с SSL/TSL, скажем), но на них я смело закрывал глаза &#8212; пока не будет полноценной Linux-версии о регулярном использовании данного продукта речи быть просто не может. Скорость работы новинки также произвела впечатление &#8212; на его фоне даже FF чисто субъективно показался медлительным (не смотря на все огрехи wine, как оно будет выглядить в native-версии &#8212; предсказать сложно).</p>
<p>Меню настроек оказалось вполне стандартным &#8212; ничего лишнего, лишь самые необходимые вещи, даже ребенок разберется. Хотя сложно на самом деле сказать плюс это или минус: если вдруг взбредет в голову потюнить что-либо более специфическое, могут возникнуть проблемы, хотя впринципе возможно там всетаки предусмотренно какое-то более расширенное меню настроек, по аналогии с about:config в FF, а я его просто не нашел.</p>
<p>Вдоволь наигравшись, я смело закрыл окошко браузера, с твердой уверенностью, что когда-нибудь потом обязательно заморочусь и с установкой и (возможно) эксплуатацией полноценной native Linux версии, когда граждане из Google соизволят-таки довести ее до работоспособного состояния &#8212; к тому времени глядишь и ситуацию с плагинами и темами исправят. Вот такая вот бестолковая история, спасибо, что дочитали до конца <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>P.S.: А вот <a href="/feed" target="_blank">тут есть RSS</a>, если вдруг кто еще не в курсе.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/unix-way/linux/google-chrome/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Приношу свои извинения</title>
		<link>http://www.insight-it.ru/life/wordpress/prinoshu-svoi-izvineniya-2/</link>
		<comments>http://www.insight-it.ru/life/wordpress/prinoshu-svoi-izvineniya-2/#comments</comments>
		<pubDate>Fri, 11 Jul 2008 19:05:31 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[WordPress]]></category>
		<category><![CDATA[corruption]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[блог]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=84</guid>
		<description><![CDATA[&#8230;за временную недоступность блога и длительное отсутствие обновлений. Пару дней назад произошел corruption данных в MySQL (судя по логам), нужно было восстанавливать ее из дампа, но руки никак не доходили из-за работы. Слушать музыку в техподдержке хостинга желания тоже особо не было, так что не нашел ничего лучшего, чем закрыть временно блог под пароль до [...]]]></description>
			<content:encoded><![CDATA[<p><strong>&#8230;за временную недоступность блога и длительное отсутствие обновлений.</strong></p>
<p>Пару дней назад произошел corruption данных в MySQL (судя по логам), нужно было восстанавливать ее из дампа, но руки никак не доходили из-за работы. Слушать музыку в техподдержке хостинга желания тоже особо не было, так что не нашел ничего лучшего, чем закрыть временно блог под пароль до тех пор пока не разберусь. Когда я добрался-таки до блога выяснилось, что хостинг провайдер меня в phpmyadmin пускать отказывается с формулировкой <em>&#171;Access denied&#187;</em>. Разбираться в чем причина опять же было не охота, так что не обломавшись залез на хостинг по <strong>ssh</strong> и загрузил дамп в базу через консольный mysql-клиент. Ничем хорошим тоже не закончилось &#8212; он умудрился каким-то образом напутать что-то с кодировкой, хотя и сам файл и в <strong>create table</strong> явно был указан <em>UTF-8</em>.</p>
<p>Забросив это дело, на следующий день я обнаружил, что хостинг-провайдер передумал и решил пустить-таки меня в phpmyadmin. Пободавшись с которым насчет излишне большого размера дампа (не знаю с каких пор 700кб стало считаться большим дампом), мне удалось-таки вернуть все в исходное состояние, так что <strong>WELCOME</strong>!</p>
<p>Очень надеюсь, что в ближайшее время работа перестанет потреблять все мое свободное и несвободное время и я снова смогу написать что-нибудь интересное.</p>
<p>Если Вы хотите помочь развитию блога &#8212; <a href="/guest-posts" target="_blank">мое предложение</a> все еще в силе, да и <a href="/feed" target="_blank">подписаться на RSS</a> еще не поздно <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/wordpress/prinoshu-svoi-izvineniya-2/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Архитектура Mailinator</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/#comments</comments>
		<pubDate>Tue, 24 Jun 2008 15:17:50 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Tomcat]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Mailinator]]></category>
		<category><![CDATA[электронная почта]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=81</guid>
		<description><![CDATA[Ваш пьяный друг когда-либо вдохновлял Вас на создание первого в своем роде интернет-сервиса, который пришелся бы по вкусу миллионам пользователей и при этом неприхотливо обрабатывал миллиарды электронных писем ежегодно? Именно так Paul Tyma и создал Mailinator. Mailinator представляет собой бесплатный, не требующий инсталляции, сервис для разрушения планов злобных спаммеров путем предоставления регистрации &#171;одноразовых&#187; почтовых адресов. [...]]]></description>
			<content:encoded><![CDATA[<p>Ваш пьяный друг когда-либо вдохновлял Вас на создание первого в своем роде интернет-сервиса, который пришелся бы по вкусу миллионам пользователей и при этом неприхотливо обрабатывал миллиарды электронных писем ежегодно? Именно так Paul Tyma и создал Mailinator.</p>
<p><a href="http://www.mailinator.com" target="_blank" rel="nofollow">Mailinator</a> представляет собой бесплатный, не требующий инсталляции, сервис для разрушения планов злобных спаммеров путем предоставления регистрации &#171;одноразовых&#187; почтовых адресов. Если Вы не не будете публиковать в Сети свой настоящий интернет-адрес &#8212; спаммеру не будут слать вам письма, вместо этого они будут спамить Mailinator <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Как же Mailinator справляется со своей ролью анти-спам супергероя?<br />
<span id="more-81"></span></p>
<h3>Источники информация</h3>
<p><em>Да-да, это снова перевод <a href="http://highscalability.com/mailinator-architecture" target="_blank" rel="nofollow">статьи</a> от <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd</a>&#8216;а (цифры правда не первой свежести, но все же). На что-то более глобальное я в ближайшее время способен не буду, в основном благодаря незаметно подкравшейся сессии и, отчасти, работе.</em></p>
<li><a href="http://mailinator.blogspot.com/2007/01/architecture-of-mailinator.html" target="_blank" rel="nofollow">The Architecture of Mailinator</a></li>
<li><a href="http://mailinator.blogspot.com/2007/02/mailinators-2006-stats.html" target="_blank" rel="nofollow">Mailinator&#8217;s 2006 Stats</a></li>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/linux" rel="nofollow" target="_blank">Linux</a></li>
<li><a href="/tag/tomcat" rel="nofollow" target="_blank">Tomcat</a></li>
<li><a href="/tag/java" rel="nofollow" target="_blank">Java</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Сервис обработал:  1.29 миллиардов электронных писем за 2007 год. 450.74 миллионов за 2006. 280.68 миллионов за 2005.</li>
<li>В период пиковых нагрузок обрабатывается 6.5 миллионов электронных писем в сутки или 4513 сообщений в минуту или 75 в секунду.</li>
<li>Mailinator работает на всего одном весьма средненьком компьютере с AMD Athlon 2GHz процессором, 1 GB оперативной памяти (которая используется не целиком) и низкопроизводительным IDE жестким диском объемом 80 GB. И она в общем-то загружена далеко не полностью.</li>
<li>Mailinator работает месяцами без присмотра и теряется очень небольшое количество сообщений, даже при постоянных спам-атаках и высоких пиковых нагрузках.</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Так как система бесплатна, она не должна быть идеальной. Таким образом основные цели:
<dl>
<dd>- Создание системы, которая ценит выживание превыше всего, даже пользователей. Основным ключом является именно выживание, так как Mailinator вынужден ежедневно отражать спам-атаки.</dd>
<dd>- Предоставить пользователям 99,99% доступность и точность данных. Более высокие гарантии будут существенно менее практичными и приведут к большим затратам. И так как сервис бесплатен, этот небольшой риск для пользователей становится просто частью правил игры.</dd>
<dd>- Поддержка следующей модели сервиса: пользователь регистрируется где-то, заходит в Mailinator, жмет на пришедшую ссылку и забывает об этом. Это означает, что письма не должны храниться постоянно. Они могут размещаться в оперативной памяти, так как являются временными (живут три-четыре часа). Если Вам нужен обычный настоящий почтовый ящик &#8212; воспользуйтесь любым другим соответствующим сервисом.</dd>
</dl>
</li>
<li>Изначально письма обрабатывались следующим образом:
<dl>
<dd>- Sendmail получал письмо в общий ящик на диске.</dd>
<dd>- Java-приложение доставало сообщение используя IMAP и/или POP (с течением времени это менялось) и удаляло их.</dd>
<dd>- Система загружала все письма в память и оставляла их там.</dd>
<dd>- Наиболее старые сообщения вытеснялись как только накапливался лимит в 20000 сообщений.</dd>
</dl>
</li>
<li>Данный принцип работал вполне неплохо:
<dl>
<dd>- Он стабилен и работал месяцами без каких-либо проблем.</dd>
<dd>- Использовался практически весь гигабайт оперативной памяти.</dd>
<dd>- Проблемы начались, когда количество сообщений в сутки начало превышать 800000. Система начала давать сбои из-за использования жесткого диска между Mailinator и email подсистемой.</dd>
<dd>- Наиболее старые сообщения вытеснялись как только накапливался лимит в 20000 сообщений.</dd>
</dl>
</li>
<li>Новая архитектура:
<dl>
<dd>- Идея заключалась в отказе от временного хранения данных на жестком диске путем полного переписывания всей системы с нуля.</dd>
<dd>- Веб-приложение, почтовый сервер и все хранилище писем функционируют в рамках одной JVM.</dd>
<dd>- Sendmail был заменен на специально написанный для этого проекта SMTP сервер. Так как природа Mailinator не требовала полноценного SMTP сервера. Mailinator не отправляет писем, основная цель &#8212; принимать или отвергать входящие письма. Это является недостатком многоуровневой архитектуры. Она часто является залогом успеха в процессе масштабирования веб-приложения, но порой она может и наоборот полностью убить всю производительность благодаря неверному принятию ответственных решений. Решение о создании собственного SMTP сервера было достаточно интересным и смелым, многие другие руководители проектов вместо этого просто добавили бы дополнительное оборудование в систему. Это не было бы ошибкой, но, согласитесь, создание своего собственного решения задачи &#8212; намного более интересный подход.</dd>
<dd>- Сейчас Mailinator получает почту напрямую, обрабатывает ее и хранит в оперативной памяти. Жесткие диски полностью обходятся и практически не используются.</dd>
<dd>- Основное их применение &#8212; хранение сообщений в случае остановки сервиса для того, чтобы они могли быть восстановлены при запуске.</dd>
<dd>- Ведение логов было отключено.</dd>
<dd>- Система использует менее 300 потоков. Это оказалось вполне достаточно.</dd>
<dd>- При принятии сообщения, система пропускает его через набор фильтров и хранит его в памяти только в том случае, если все фильтры были успешно пройдены.</dd>
<dd>- Каждый почтовый адрес ограничен только 10 письмами, так что популярные адреса вроде joe@mailinator.com не могут &#171;взорвать&#187; систему.</dd>
<dd>- Письма не могут превышать 100 kb, а все приложения автоматически уничтожаются. Это позволяет существенно сэкономить в плане используемой оперативной памяти..</dd>
</dl>
</li>
<li>Электронные письма сжимаются в оперативной памяти:
<dl>
<dd>- 99% писем никто даже не открывает, компрессия позволяет сэкономить место в оперативной памяти. Письмо разжимается в исходное состояние только если кто-то решает его открыть.</dd>
<dd>- Mailinator может хранить около 80000 писем в оперативной памяти, используя лишь 300 MB памяти, по сравнению с 20000 писем, занимающих 1 GB без использования компрессии.</dd>
<dd>- С таким подходом к хранению писем, они живут в среднем 3-4 часа.</dd>
<dd>- В память поместится и 200000 писем, но на практике это и не требуется.</dd>
<dd>- Оперативная память ценна, а процессорное время &#8212; вовсе нет. Именно из-за этого используется компрессия для экономии памяти и использования излишков вычислительных мощностей.</dd>
</dl>
</li>
<li>Mailinator не гарантирует анонимность или приватность:
<dl>
<dd>- Любой пользователь может получить доступ к любому почтовому ящику.</dd>
<dd>- Отказ от ограничений доступа делает схему работы системы намного более простой.</dd>
<dd>- Со стороны пользователя такой подход очень прост, так как не требуется абсолютно никакой регистрации. Когда сайт требует ввести почтовый адрес достаточно лишь просто ввести любой адрес Mailinator. Вам не нужно создавать отдельный аккаунт. Банальный ввод адреса создает почтовый ящик. Все просто.</dd>
<dd>- На практике же, не смотря на вышесказанное, пользователи все же получают изрядную степень приватности.</dd>
</dl>
</li>
<li>Стремление к выживанию требует агрессивной борьбы со спамом:
<dl>
<dd>- Mailinator не имеет ничего против спама, но так как спама приходит нереально много, когда он подвергает риску работоспособность сервиса приходится его фильтровать.</dd>
<dd>- Этот факт привел к правилу: если Вы делаете что-то (получаете спам или что-то еще), что мешает работе системы &#8212; Ваши письма не будут приниматься и Вы можете быть временно заблокированы.</dd>
</dl>
</li>
<li>Для успешного приема письмо должно пройти следующую цепочку фильтров:
<dl>
<dd>- Все письма, которые не смогли быть доставлены, отклоняются.</dd>
<dd>- При слишком большом количестве писем с одного IP они перестают приниматься.</dd>
<dd>- Слишком много писем с одинаковой темой не принимаются.</dd>
<dd>- Письма, содержащие в заголовках запрещенные сервисом слова, также не попадают в почтовые ящики.</dd>
</dl>
</li>
<li>Выживание в условиях наплыва писем с одного IP адреса:
<dl>
<dd>- Для этого типа фильтрации используется AgingHashMap. Когда сервис получает очередное письмо, IP помещается в массив и счетчик, соответствующий этому ключу, увеличивается на единицу в момент получения каждого последующего письма с этого IP.</dd>
<dd>- Спустя определенное время без получения писем с IP, соответствующие ему счетчик обнуляется.</dd>
<dd>- Когда счетчик достигает определенного порога, IP блокируется, предотвращая поток сообщений.</dd>
<dd>- Этим простым методом пользуются многие интернет-ресурсы для защиты различных своих компонентов, например комментариев. В роли хранилища для такого массива при распределенном функционировании системы часто используют <a href="/tag/memcached" target="_blank">memcached</a>.</dd>
</dl>
</li>
<li>Защита от &#171;зомби&#187; атак:
<dl>
<dd>- Спам может приходить и с больших координированных сетей с разными IP адресами, как раз участников таких сетей и называют &#171;зомби&#187;. Одинаковые письма приходят со множества разных адресов, так что защита по IP адресам становится бессильна.</dd>
<dd>- Этот фильтр несколько более сложный, чем блокировка по IP, так как требуется достать из письма строку с заголовком, да и их сравнение &#8212; несколько ресурсоемкая задача.</dd>
<dd>- Когда около 20 писем с одинаковыми темами приходят в течении 2 минут, этот заголовок блокируется на час.</dd>
<dd>- Что интересно,  Mailinator не хранит заблокированные темы вечно, так как это значило бы, что этот список неуклонно рос и приходилось бы вечно отслеживать соответствия с ним. Это никак не приемлемо для мимолетной природы Mailinator. Более комплексные алгоритмы защиты от спама нужны лишь только если ставятся цели с более жесткой борьбой со спама, для Mailinator же данный вариант &#8212; наиболее эффективный.</dd>
<dd>- Этим фильтром блокируется около 9% писем.</dd>
<dd>- Mailinator фильтрует сообщения только по теме и IP, так что системе не приходится прочитывать и анализировать все письмо целиком. Это позволяет неплохо сэкономить на вычислительных ресурсах при достаточно эффективной итоговой фильтрации.</dd>
</dl>
</li>
<li>Для уменьшения угрозы DDoS атак:
<dl>
<dd>- Все соединения, неактивные какое-то время обрываются.</dd>
<dd>- Mailinator отвечает отправителям писем очень медленно, 10, 20 или даже 30 секунд, даже для небольших объемов данных. Это замедляет работу спаммеров, пытающихся отправлять спам как можно быстрее, и заставляет их лишний раз задуматься о целесообразности отправки снова спама на этот адрес. Период ожидания уменьшается во время повышенных нагрузок на сервис, так что письма не теряются из-за этого.</dd>
</dl>
</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li><strong>Идеальность &#8212; всего лишь ловушка.</strong> Как много систем были кардинально усложнены лишь для того, чтобы достичь 100%-го результата во всех аспектах. Если Вы участвовали в подобных совещаниях, Вы понимаете о чем идет речь. О нет, мы не можем сделать этого, так как есть 0,01% шанс, что что-то пойдет не так. Лучше спросите себя: насколько неидеальными можно позволить себе быть, чтобы все равно оставаться достаточно неплохим сервисом?</li>
<li><strong>То, что Вы отвергаете, ничуть не менее важно, чем то, что Вы оставляете в системе.</strong> Существует масса концепций по построению архитектуры системы. Нужно не только выбрать подходящие, но и отказаться от тех, которые излишни.</li>
<li><strong>Знайте предназначение своей системы и разрабатывайте ее в соответствии с этим.</strong> Быть всем для всех значит быть ничем для никого. Временное хранение электронных писем, позволяя небольшой части спама пробиться через фильтры, в совокупности с не 100% временем работы системы производят достаточно хорошее впечатление на пользователей. Построение собственного SMTP-сервера необходимо лишь в случае, если у Вас есть весомые аргументы в пользу того, что он Вам необходим. Далеко не факт, что такая идея придет в голову, возможно выбор пал бы и на более тривиальное решение, связанное просто с добавлением дополнительного оборудования.</li>
<li><strong>Постарайтесь как можно быстрее свести механизм работы системы к наиболее общему случаю.</strong> Очень большой процент писем отвергается, так что это оправданно сделать это как можно раньше, чтобы минимизировать ресурсы, требуемые для их обработки. Найдите способ сделать это как можно быстрее в отношении наиболее частых случаев. то очень часто становится важным компонентом стратегии масштабирования.</li>
<li><strong>Эффективность часто означает &#171;постройте это самостоятельно&#187;.</strong> Готовые решения обычно решают большой спектр задач, но на практике часто нужна лишь небольшая часть функционала, в таких случаях можно написать небольшой компонент с нуля самостоятельно, чтобы он мог выполнять только нужные функции, но более эффективно.</li>
<li><strong>Небольшое количество сбоев &#8212; вполне допустимо.</strong> Все заблокированные адреса не должны быть запомнены навечно. Позвольте этим спискам генерироваться на основе локальных данных, а не глобального состояния. Это очень простая и эффективная архитектура.</li>
<li><strong><a href="/tag/java" target="_blank">Java</a> совсем не обязательно должна быть медленной.</strong> На эту тему сказано уже достаточно.</li>
<li><strong>Избегайте работы с жесткими дисками.</strong> Многие приложения требуют работы с дисковой системой, но очень часто именно она оказывается узким местом в системе. Можете ли Вы обойтись без него, используя более креативные подходы к архитектуре системы?</li>
<li><strong>Ограничте использование ресурсов.</strong> Задайте рамки для размеров почтовых ящиков и других подобных элементов системы, это позволит избежать неконтролируемых скачков нагрузок. Неограниченное использование ресурсов недопустимо при ограниченности ресурсов.</li>
<li><strong>Сжимайте данные.</strong> Компрессия данных может стать неплохим достижением в попытках сэкономить оперативную память. Можно сократить использование памяти вдвое с лишь небольшой дополнительной нагрузкой, связанной с компрессией и декомпрессией информации. Если обмен данными происходит локально, достаточно лишь закодировать данные и предоставить API для доступа к данным без полной декомпрессии.</li>
<li><strong>Используйте фиксированные объемы ресурсов для обработки запросов.</strong> Многие приложения не могут контролировать используемые ресурсы, в частности &#8212; оперативную память, таким образом они могут порой давать сбой при использовании излишне больших ее объемов. Для более стабильной работы стоит ограничить используемые ресурсы и откладывать выполнение новых задач пока они используются полностью. Для управление доступом к ресурсам можно использовать определенную логику в зависимости от ситуации: по времени, по приоритету, &#171;честный&#187; доступ, но так как ресурсы ограничены, система несколько ослабнет под серьезной нагрузкой.</li>
<li>Если данные не хранятся длительное время, они не могут стать причиной возбуждения судебного дела о нарушении чьих-либо прав.</li>
<li><strong>Пользуйтесь тем, что знаете лучше всего.</strong> Этот урок не раз оправдывал себя. Paul знал Java лучше, чем что-либо еще, именно по-этому он заставил приложение на этом языке работать и выполнить все поставленные задачи.</li>
<li><strong>Найдите свои собственные Mailinator&#8217;ы.</strong> Конечно, Mailinator является очень небольшой системой. В более крупной системе этот проект был бы лшь небольшой дополнительной возможностью, но такие системы обычно состоят просто из нескольких подроектов размером с Mailinator. А что если подойти к разработке некоторых из них так же как и к Mailinator?</li>
<li><strong>KISS работает, правда довольно редко.</strong> Простота систем часто обсуждается, но практические примеры появляются достаточно редко. Чаще всего разговор остается на уровне: твоя система сложная, а моя &#8212; простая, просто так как она моя. Mailinator является хорошим примером простой архитектуры системы.</li>
<li><strong>Надежность является функцией архитектуры системы.</strong> Для построения системы, эффективно использующей память и выживающей серьезные атаки спаммеров, потребовалось серьезно подойти к каждому уровню ее архитектуры.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-mailinator/feed/</wfw:commentRss>
		<slash:comments>19</slash:comments>
		</item>
		<item>
		<title>it&#039;s a pic</title>
		<link>http://www.insight-it.ru/set/its-a-pic/</link>
		<comments>http://www.insight-it.ru/set/its-a-pic/#comments</comments>
		<pubDate>Tue, 27 May 2008 16:35:48 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Сеть]]></category>
		<category><![CDATA[it\'s a pic]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[изображение]]></category>
		<category><![CDATA[информационные технологии]]></category>
		<category><![CDATA[поиск]]></category>
		<category><![CDATA[поисковые системы]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=80</guid>
		<description><![CDATA[Не удивлюсь, если заголовок этого поста вам не сказал ровным счетом ничего &#8212; это вполне логично. Именно эту ситуацию я и хотел бы сегодня исправить: it&#8217;s a pic представляет собой&#8230; &#8230;очередной интернет-проект. Хотели увидеть что-то более грандиозное? &#8212; читайте дальше! Начать наверное стоит с обозначения основной сути: поисковая система изображений, ориентированная на глобальный рынок. Да-да, [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/itsapic-logo.png" alt="it's a pic logo" title="логотип" style="float:left; margin:16px 4px;" />Не удивлюсь, если заголовок этого поста вам не сказал ровным счетом ничего &#8212; это вполне логично. Именно эту ситуацию я и хотел бы сегодня исправить: <strong>it&#8217;s a pic</strong> представляет собой&#8230;<br />
<span id="more-80"></span><br />
&#8230;очередной интернет-проект. Хотели увидеть что-то более грандиозное? &#8212; читайте дальше!</p>
<p>Начать наверное стоит с обозначения основной сути: поисковая система изображений, ориентированная на глобальный рынок. Да-да, мы уже видели поиск картинок в исполнении Google/Yahoo!/MSN/Яндекс/Рамблер (нужное подчеркнуть) &#8212; скажете вы, так в чем же разница?</p>
<p>Сейчас объясню. Никогда не возникало мысли, что частенько поиск картинок в обычных поисковых системах по большей части выдает всякий бред, очень слабо коррелирующий с тем, что Вы на самом деле искали? Основная их проблема заключается в том, что способов провести ассоциацию между текстом и изображением не так-то много. Чаще всего в их распоряжении лишь HTML-документы, ссылающиеся на изображение. То есть на основании атрибута <strong>alt</strong> у тэга <strong>&lt;img /&gt;</strong> и изредка anchor-текста обычных ссылок, поисковая система должна составить представление о том, что же на самом деле изображено в графическом файле. Варианты ручного построения таких соответствий тоже существуют, но либо нужно платить огромнейшему количеству человек за рутинную работу (что-то на грани фантастики &#8212; количество изображений в Сети измеряется числом с слишком большим количеством нулей) или подталкивать людей заниматься этим бесплатно, оформив это, например, в виде online-игры. Обычно в таких играх двум участникам одновременно предоставляется один и тот же набор изображений, а их задачей является последовательно вводить свои ассоциации связанные с текущим изображением. Если они оба ввели одно и то же слово &#8212; оно ассоциируется с изображением, а пользователям начисляются виртуальные очки. В общем поиск изображений по ключевым словам &#8212; задача, связанная с массой проблем и неточностей.</p>
<p><strong>It&#8217;s a pic</strong> является как раз поисковой системой, призванной избавить людей, ищущих изображения от всех этих проблем с неточностью и некорректностью результатов. Чтобы не придумывать каких-то временных решений проблемы было решено искоренить основательно: основная идея заключается в использовании в качестве критерия поиска не набор ключевых слов, а просто изображение. Сказать, что два изображения похожи, компьютеру намного проще, чем сказать что на картинке нарисован, например, жираф &#8212; именно на это и делает ставку этот проект.</p>
<p>Выглядит это примерно следующим образом: допустим Вы хотите найти побольше изображений заката и выбрать наиболее приглянувшееся, для этого достаточно загрузить в систему с локального компьютера изображение заката (хотя если оно уже присутствует в Сети &#8212; можно и просто указать URL) и собственно говоря нажать кнопку &#171;Найти&#187; &#8212; вот и все! Вот ваши результаты:<br />
<a href="/wp-content/uploads/itsapic-scr-s.png" target="_blank"><img src="/wp-content/uploads/itsapic-scr-s.png" alt="пример работы it's a pic" title="пример работы" /></a></p>
<p>Наверное Вы уже заметили, что написав приличную часть поста я так до сих пор и не дал ссылки на саму поисковую систему. У этого есть достаточно простая причина &#8212; проект находится в стадии <a href="http://www.itsapic.com" target="_blank" rel="nofollow">закрытого β-тестирования</a> (что вы собственно говоря могли прочитать и на скриншоте чуть выше). Так что недостаточная точность поиска вполне объясняется скромной базой данных изображений &#8212; можно заметить на все том же скриншоте семизначную цифру количества изображений в его базе. Но даже из такого небольшого количества изображений системе удается достаточно точно выбрать похожие на образец экземпляры и отсортировать их в соответствии с их релевантностью оригиналу.</p>
<p>Наверняка у Вас снова напрашивается вопрос: а как же я собственно попал в закрытую бету проекта и узнал так много о нем еще до его запуска? Нет, мне никто так до сих пор и не дает эксклюзивной информации о проектах, но эта информация была получена и не из Сети. Не буду тянуть и раскрою все карты: я просто-напросто с недавних пор участвую в этом проекте. Собственно говоря одной из основных моих задач является вывод этой системы из закрытой бета-версии в открытую, то есть обеспечить работоспособность алгоритмов при несколько больших нагрузках, чем один-два разработчика одновременно, ищущих что-то просто для проверки и тестирования.</p>
<p><script type="text/javascript">
</script></p>
<p>А пост этот на самом деле я написал с несколько более коварными целями, чем просто поведать читателям о проекте: на данный момент <a href="http://www.mvk-it.com/hiring.html" target="_blank" rel="nofollow">активно ведется рекрутинг сотрудников на разные роли в этом проекте</a> и я надеюсь, что среди читателей найдутся люди, заинтересованные в том, чтобы тоже принять в нем участие. Если Вы считаете себя как раз таким человеком &#8212; можете попробовать связаться со <a href="/author" target="_blank">мной</a> или отправить письмо на указанный по ссылке выше почтовый ящик:<img src="/wp-content/uploads/itsapic-mail.png" alt="jobs mvk-it com"  style="display:inline; margin-top:2px;" />.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/its-a-pic/feed/</wfw:commentRss>
		<slash:comments>42</slash:comments>
		</item>
		<item>
		<title>Архитектура Google Talk</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/#comments</comments>
		<pubDate>Thu, 22 May 2008 13:39:44 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[Google Talk]]></category>
		<category><![CDATA[IM]]></category>
		<category><![CDATA[Jabber]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[sharding]]></category>
		<category><![CDATA[XMPP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Google Talk]]></category>
		<category><![CDATA[присутствие]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=79</guid>
		<description><![CDATA[Google Talk представляет собой сервис мгновенного обмена сообщениями от Google. В основе этого сервиса лежит XMPP протокол, более известный как Jabber. В России среди IM-сервисов несомненно наиболее широко распространен ICQ, но количество русских пользователей Jabber тоже неуклонно растет. Вам когда-нибудь доводилось задумываться какое количество сообщений приходится обрабатывать такого рода сервисам? Допустим есть абстрактный IM-сервис, которым [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.google.com/talk" target="_blank" rel="nofollow">Google Talk</a> представляет собой сервис мгновенного обмена сообщениями от Google. В основе этого сервиса лежит <strong><abbr title="eXtensible Messaging and Presence Protocol">XMPP</abbr></strong> протокол, более известный как <em>Jabber</em>. В России среди IM-сервисов несомненно наиболее широко распространен <em>ICQ</em>, но количество русских пользователей <em>Jabber</em> тоже неуклонно растет.</p>
<p>Вам когда-нибудь доводилось задумываться какое количество сообщений приходится обрабатывать такого рода сервисам? Допустим есть абстрактный IM-сервис, которым пользуется миллион пользователей, в среднем каждый из них отправляет сто текстовых сообщений. Сколько всего сообщений обработал и доставил сервис? Сто миллионов? Наивно!<br />
<span id="more-79"></span></p>
<h3>Введение</h3>
<p>Сервисы мгновенного обмена на самом деле подвергаются существенно большей нагрузке, чем это может показаться на первый взгляд. Давайте взглянем на расшифровку аббревиатуры XMPP: eXtensible Messaging and Presence Protocol. Обмен сообщениями &#8212; лишь одна из его функций, наиболее важная же его часть остается &#171;за сценой&#187; &#8212; отображение присутствия пользователей <em>online</em>.</p>
<p>Давайте посмотрим на наш абстрактный пример с точки зрения присутствия: пускай им пользуется все тот же миллион пользователей, когда один из них включил компьютер и появился online &#8212; он должен уведомить весь свой список контактов об этом событии, а также узнать кто из них находится online. Если этот список велик, то такое элементарное событие может обернуться для сервиса далеко не одной сотней обработанных и доставленных сообщений. Помимо простого изменения статуса online/offline подобную цепочку сообщений может генерировать и любое другое изменение статуса: связанное с отсутствием пользователя около компьютера или с изменением небольшого текстового сообщения, которое обычно отображается в контакт листе рядом с ником пользователя и призвано отображать текущее его состояние, занятие или чего там только не пишут (эта функция не всегда предоставляется IM-сервисами, но наверняка многим знакома по <em>ICQ</em>, если не по <em>Jabber</em>). Все эти сообщения как раз и стоят за &#171;presence&#187; в аббревиатуре XMPP, суммарный траффик, ими генерируемый, может в несколько раз превышать траффик от собственно самих текстовых сообщений.</p>
<p>Если учесть факты, описанные в предыдущем абзаце, не трудно догадаться, что зависимость суммарного количества presence-сообщений от количества пользователей IM-сервиса далеко не линейна. Их количество за какой-то период времени можно очень приблизительно посчитать как произведение трех параметров: количества пользователей online, средней длины списка контактов среди них и количества изменений статуса каждым пользователем. А каждый дополнительный пользователь в системе так или иначе увеличивает как минимум два из этих трех параметров.</p>
<p>Введение несколько затянулась, а проблема масштабируемости XMPP-сервисов я думаю теперь стала очевидна, так что сейчас очень подходящий момент, чтобы вернуться к основной теме разговора &#8212; сервису Google Talk и том, как команда его разработчиков решает эту проблему.</p>
<h3>Источники информации</h3>
<p>Наверное уже стало заметно, что это не очередной перевод, а лично мной написанный текстик. Так что сразу выдам <a href="http://video.google.com/videoplay?docid=6202268628085731280" rel="nofollow" target="_blank">видео</a>, являющееся основным источником информации, и продолжу.</p>
<h3>Архитектура</h3>
<p>Со стороны Google (о котором я, кстати говоря, <a href="/net/scalability/arkhitektura-google" target="_blank">уже писал</a>) было бы глупо строить сервис мгновенного обмена сообщениями в стороне от остальных коммуникационных сервисов, предоставляемых этой компанией. Еще до своего публичного старта Google Talk был интегрирован в почтовый сервис <a href="http://www.gmail.com" rel="nofollow" target="_blank">GMail</a> и социальную сеть <a href="http://www.orkut.com" rel="nofollow" target="_blank">Orkut</a>: эти сервисы просто запрашивали у Google Talk присутствие online пользователей из своего списка контактов при возникновении соответствующих событий, но при этом не отображали результаты в своих страницах. Таким образом разработчики получили возможность оценить предстоящие нагрузки и готовность сервиса к публичному запуску намного более точно, чем они могли бы это сделать средствами синтетических тестов.</p>
<p>В отношении распределения нагрузок, сразу же был выбран и реализован подход, связанный с разбиением пользователей на группы и распределением работы с каждой отдельной группой по разным серверам. Это позволило избежать всей той эволюции серверной части приложения от одного сервера до большого кластера, что впрочем вполне оправданно, так как сразу же после запуска сервису предстояло столкнуться с огромным количеством пользователей и не ничуть не меньшей нагрузкой. Разработчики не забыли и сразу же предусмотреть безболезненный перенос пользователей с одного сервера на другой без видимых для него изменений, это позволило очень гибко изменять количество серверов в системе.</p>
<p>С точки зрения интеграции сервиса с другими проектами <a href="/tag/google" target="_blank">Google</a>, очень важно было предоставить определенный уровень абстракции для взаимодействия в виде API и набора адресов, по которым необходимо обращаться к сервису. Придерживаясь одного API можно производить практически любые архитектурные или программные изменения в рамках проекта таким образом, что все его пользователи и проекты, в которые он интегрирован, просто не заметят что что-то изменилось. Адреса, к которым происходит обращение при обмене данных, так же являются своеобразной абстракцией &#8212; можно переместить сервис в новый датацентр и благодаря DNS трафик будет направляться в нужное место.</p>
<p>С другой стороны необходимо учитывать и программное обеспечение работающие ниже уровнем, чем собственно код приложения: особенно ядро операционной системы и используемые библиотеки. В данном случае большую роль играет количество открытых TCP соединений, так как IM требует большое их количество, но активность в них не велика.</p>
<p>Разработчики Google Talk постарались как можно больше внимания уделить возможным сбоям и связанным с ними ситуациям. Любое даже запланированное временное прекращение функционирования какой-то части системы может резко увеличить нагрузку на остальную часть, даже если это просто перезагрузка части системы &#8212; из-за очистившегося кэша серверы снова начнут полноценно функционировать далеко не сразу, не говоря уже о непредвиденных сбоях, когда последствия намного более глобальны. Для своевременного устранения потенциальных проблем как с общем функционированием системы, так и с недостаточной производительностью, ведутся логи для всех этапов обработки запросов, а также предусмотрена возможность профайлинга прямо на работающих в системе серверах.</p>
<p>Но не стоит забывать и о клиентской части программного обеспечения: какая-нибудь глупая ошибка в коде клиента сервиса запросто может устроить DDoS атаку на сервис, что и случилось с одной из ранних версий клиента Google Talk. Помимо этого необходимо поддерживать совместимость разных версий клиентских приложений.</p>
<h3>Заключение</h3>
<p>Благодаря описанным выше принципам Google Talk удается обрабатывать каждое из миллиардов сообщений в день менее чем за 100 миллисекунд. Тесная интеграция с другими сервисами <a href="/tag/google" target="_blank">Google</a> позволила проекту сразу же получить невероятную популярность, а продуманный подход к разработке сервиса позволил справиться с огромной нагрузкой.</p>
<p>На этот раз статья получилась скорее о специфике сервиса, чем о его реализации. Технической информации найти практически не удалось, так что очень кратко все, но надеюсь и в таком варианте было достаточно интересно почитать. Напоследок хочу порекомендовать <a href="/feed" target="_blank">подписаться на RSS</a>, если не хотите пропустить публикацию новых постов.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-googletalk/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>DMOZ.org</title>
		<link>http://www.insight-it.ru/set/seo/dmozorg/</link>
		<comments>http://www.insight-it.ru/set/seo/dmozorg/#comments</comments>
		<pubDate>Mon, 19 May 2008 14:14:39 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[SEO]]></category>
		<category><![CDATA[DMOZ.org]]></category>
		<category><![CDATA[ODP]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Open Directory Project]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[каталог]]></category>
		<category><![CDATA[редактор]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=78</guid>
		<description><![CDATA[Возможно Вы уже обратили внимание, что в начале мая данный блог был добавлен в один из крупнейших (если не самый крупнейший) каталог интернет-ресурсов &#8212; DMOZ.org, также известный как Open Directory Project. Само по себе это событие достаточно значимо для любого сайта, но я почему-то не счел нужным писать по этому поводу отдельный пост, видимо просто [...]]]></description>
			<content:encoded><![CDATA[<p>Возможно Вы уже обратили внимание, что в начале мая данный блог был добавлен в один из крупнейших (если не самый крупнейший) каталог интернет-ресурсов &#8212; <a href="http://dmoz.org" target="_blank" rel="nofollow"><strong>DMOZ.org</strong></a>, также известный как <em>Open Directory Project</em>.  Само по себе это событие достаточно значимо для любого сайта, но я почему-то не счел нужным писать по этому поводу отдельный пост, видимо просто так как других слов кроме как &#171;Ура! Мой блог попал в DMOZ!!!&#187; у меня тогда не нашлось.</p>
<p>Сегодня же произошло другое событие, связанное с этим крупным каталогом: я <a href="http://www.dmoz.org/profiles/m11.html" target="_blank" rel="nofollow">стал редактором</a> очень небольшого его раздела &#8212; <strong>World/Russian/Компьютеры/Программирование/Блоги</strong>. Раздел и правда оказался очень маленький &#8212; сегодняшним же утром за часок-другой разгреб все заявки, которые там лежали нерасмотренными. В целом впечатления от данного процесса очень положительные &#8212; нашел несколько интересных сайтов в заявках, которые потом еще достаточно долго читал просто так, уже после принятия решения о добавлении в каталог. Хотелось бы конечно раздел побольше, но я думаю всему свое время. Если у кого-нибудь из Вас есть блоги, подходящие под тематику выделенного мне раздела &#8212; <a href="http://www.dmoz.org/cgi-bin/add.cgi?where=World/Russian/%d0%9a%d0%be%d0%bc%d0%bf%d1%8c%d1%8e%d1%82%d0%b5%d1%80%d1%8b/%d0%9f%d1%80%d0%be%d0%b3%d1%80%d0%b0%d0%bc%d0%bc%d0%b8%d1%80%d0%be%d0%b2%d0%b0%d0%bd%d0%b8%d0%b5/%d0%91%d0%bb%d0%be%d0%b3%d0%b8" rel="nofollow" target="_blank">добавляйте их</a>, с удовольствием рассмотрю.<br />
<img src="/wp-content/uploads/dmoz-logo.gif" alt="DMOZ Logo" title="DMOZ" style="float: right; margin:4px;" /></p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/seo/dmozorg/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>Масштабируемые веб-архитектуры</title>
		<link>http://www.insight-it.ru/masshtabiruemost/masshtabiruemye-veb-arkhitektury/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/masshtabiruemye-veb-arkhitektury/#comments</comments>
		<pubDate>Mon, 12 May 2008 06:00:36 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[веб-приложение]]></category>
		<category><![CDATA[веб-проект]]></category>
		<category><![CDATA[веб-сервер]]></category>
		<category><![CDATA[геораспределение]]></category>
		<category><![CDATA[информационные технологии]]></category>
		<category><![CDATA[кэширование]]></category>
		<category><![CDATA[распределенные вычисления]]></category>
		<category><![CDATA[сегментирование баз данных]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/?p=72</guid>
		<description><![CDATA[Уже немало слов было сказано по этой теме как в моем блоге, так и за его пределами. Мне кажется настал подходящий момент для того, чтобы перейти от частного к общему и попытаться взглянуть на данную тему отдельно от какой-либо успешной ее реализации. Приступим? Для начала имеет смысл определиться с тем, о чем мы вообще будем [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/display.png" style="float:right; margin: 26px 8px;" alt="Масштабируемость" /><br />
Уже немало слов было сказано по этой теме как в моем блоге, так и за его пределами. Мне кажется настал подходящий момент для того, чтобы перейти от частного к общему и попытаться взглянуть на данную тему отдельно от какой-либо успешной ее реализации.</p>
<p>Приступим?<br />
<span id="more-72"></span></p>
<p>Для начала имеет смысл определиться с тем, о чем мы вообще будем говорить. В данном контексте перед веб-приложением ставятся три основные цели:</p>
<ul>
<li><strong>масштабируемость</strong> &#8212; способность своевременно реагировать на непрерывный рост нагрузки и непредвиденные наплывы пользователей;</li>
<li><strong>доступность</strong> &#8212; предоставление доступа к приложению даже в случае чрезвычайных обстоятельств;</li>
<li><strong>производительность</strong> &#8212; даже малейшая задержка в загрузке страницы может оставить негативное впечатление у пользователя.</li>
</ul>
<p>Основной темой разговора будет, как не трудно догадаться, масштабируемость, но и остальные цели не думаю, что останутся в стороне. Сразу хочется сказать пару слов про доступность, чтобы не возвращаться к этому позднее, подразумевая как &#171;само собой разумеется&#187;: любой сайт так или иначе стремится к тому, чтобы функционировать максимально стабильно, то есть быть доступным абсолютно всем своим потенциальным посетителям в абсолютно каждый момент времени, но порой случаются всякие непредвиденные ситуации, которые могут стать причиной временной недоступности. Для минимизации потенциального ущерба доступности приложения необходимо избегать наличия компонентов в системе, потенциальный сбой в которых привел бы к недоступности какой-либо функциональности или данных (или хотябы сайта в целом). Таким образом каждый сервер или любой другой компонент системы должен иметь хотябы одного дублера (не важно в каком режиме они будут работать: параллельно или один &#171;подстраховывает&#187; другой, находясь при этом в пассивном режиме), а данные должны быть реплицированы как минимум в двух экземплярах (причем желательно не на уровне RAID, а на разных физических машинах). Хранение нескольких резервных копий данных где-то отдельно от основной системы (например на специальных сервисах или на отдельном кластере) также поможет избежать многих проблем, если что-то пойдет не так. Не стоит забывать и о финансовой стороне вопроса: подстраховка на случай сбоев требует дополнительных существенных вложений в оборудование, которые имеет смысл стараться минимизировать.</p>
<p>Масштабируемость принято разделять на два направления:</p>
<dl>
<dt><strong>Вертикальная масштабируемость</strong></dt>
<dd>Увеличение производительности каждого компонента системы c целью повышения общей производительности.</dd>
<dt><strong>Горизонтальная масштабируемость</strong></dt>
<dd>Разбиение системы на более мелкие структурные компоненты и разнесение их по отдельным физическим машинам (или их группам) и/или увеличение количества серверов параллельно выполняющих одну и ту же функцию.</dd>
</dl>
<p>Так или иначе, при разработке стратегии роста системы приходится искать компромис между ценой, временем разработки, итоговой производительность, стабильностью и еще массой других критериев. С финансовой точки зрения вертикальная масштабируемость является далеко не самым привлекательным решением, ведь цены на сервера с большим количеством процессоров всегда растут практически экспоненциально относительно количества процессоров. Именно по-этому наиболее интересен горизонтальный подход, так как именно он используется в большинстве случаев. Но и вертикальная масштабируемость порой имеет право на существование, особенно в ситуациях, когда основную роль играет время и скорость решения задачи, а не финансовый вопрос: ведь купить БОЛЬШОЙ сервер существенно быстрее, чем практически заново разрабатывать приложения, адаптируя его к работе на большом количестве параллельно работающих серверов.</p>
<p>Закончив с общими словами давайте перейдем к обзору потенциальных проблем и вариантов их решений при горизонтальном масштабировании. Просьба особо не критиковать &#8212; на абсолютную правильность и достоверность не претендую, просто &#171;мысли вслух&#187;, да и даже упомянуть все моменты данной темы у меня определенно не получится.</p>
<h3>Серверы приложений</h3>
<p>В процессе масштабирования самих приложений редко возникают проблемы, если при разработке всегда иметь ввиду, что каждый экземпляр приложения должен быть непосредственно никак не связан со своими &#171;коллегами&#187; и должен иметь возможность обработать абсолютно любой запрос пользователя вне зависимости от того где обрабатывались предыдущие запросы данного пользователя и что конкретно он хочет от приложения в целом в текущий момень.</p>
<p>Далее, обеспечив независимость каждого отдельного запущенного приложения, можно обрабатывать все большее и большее количество запросов в единицу времени просто увеличивая количество параллельно функционирующих серверов приложений, участвующих в системе. Все достаточно просто (относительно).</p>
<h3>Балансировка нагрузки</h3>
<p>Следущая задача &#8212; равномерно распределить запросы между доступными серверами приложений. Существует масса подходов к решению этой задачи и еще больше продуктов, предлагающих их конкретную реализацию.</p>
<dl>
<dt><strong>Оборудование</strong></dt>
<dd>Сетевое оборудование, позволяющее распределять нагрузку между несколькими серверами, обычно стоит достаточно внушительные суммы, но среди прочих вариантов обычно именно этот подход предлагает наивысшую производительность и стабильность (в основном благодаря качеству, плюс такое оборудование иногда поставляется парами, работающими по принципу <a href="http://en.wikipedia.org/wiki/Heartbeat_%28program%29" target="_blank" rel="nofollow">HeartBeat</a>). В этой индустрии достаточно много серьезных брендов, предлагающих свои решения &#8212; есть из чего выбрать: <em>Cisco</em>, <em>Foundry</em>, <em>NetScalar</em> и многие другие.</dd>
<dt><strong>Программное обеспечение</strong></dt>
<dd>В этой области еще большее разнообразие возможных вариантов. Получить программно производительность сопоставимую с аппаратными решениями не так-то просто, да и HeartBeat придется обеспечивать программно, но зато оборудование для функционирования такого решения представляет собой обычный сервер (возможно не один). Таких программных продуктов достаточно много, обычно они представляют собой просто HTTP-серверы, перенаправляющие запросы своим коллегам на других серверах вместо отправки напрямую на обработку интерпретатору языка программирования. Для примера можно упомянуть, скажем, <a href="/tag/nginx" target="_blank">nginx</a> с <strong>mod_proxy</strong>. Помимо этого имеют место более экзотические варианты, основанные на DNS, то есть в процессе определения клиентом IP-адреса сервера с необходимым ему интернет-ресурсов адрес выдается с учетом нагрузки на доступные сервера, а также некоторых географических соображений.</dd>
</dl>
<p>Каждый вариант имеет свой ассортимент положительных и отрицательных сторон, именно по-этому однозначного решения этой задачи не существует &#8212; каждый вариант хорош в своей конкретной ситуации. Не стоит забывать, что никто не ограничивает Вас в использовании лишь одного из них, при необходимости может запросто быть реализована и практически произвольная комбинация из них.</p>
<h3>Ресурсоемкие вычисления</h3>
<p>Во многих приложениях используются какие-либо сложные механизмы, это может быть конвертирование видео, изображений, звука, или просто выполнение каких-либо ресурсоемких вычислений. Такие задачи требует отдельного внимания если мы говорим о Сети, так как пользователь интернет-ресурса врядли будет счастлив наблюдать за загружающейся несколько минут страницей в ожидании лишь для того, чтобы увидеть сообщение вроде: &#171;Операция завершена успешно!&#187;.</p>
<p>Для избежания подобных ситуаций стоит постараться минимизировать выполнение ресурсоемких операций синхронно с генерацией интернет страниц. Если какая-то конкретная операция не влияет на новую страницу, отправляемую пользователю, то можно просто организовать <em>очередь</em> заданий, которые необходимо выполнить. В таком случае в момент когда пользователь совершил все действия, необходимые для начала операции, сервер приложений просто добавляет новое задание в очередь и сразу начинает генерировать следущую страницу, не дожидаясь результатов. Если задача на самом деле очень трудоемкая, то такая очередь и обработчики заданий могут располагаться на отдельном сервере или кластере.</p>
<p>Если результат выполнения операции задействован в следующей странице, отправляемой пользователю, то при асинхронном ее выполнении придется несколько схитрить и как-либо отвлечь пользователя на время ее выполнения. Например, если речь идет о конвертировании видео в <strong>flv</strong>, то например можно быстро сгенерировать скриншот с первым кадром в процессе составления страницы и подставить его на место видео, а возможность просмотра динамически добавить на страницу уже после, когда конвертирование будет завершено.</p>
<p>Еще один неплохой метод обработки таких ситуаций заключается просто в том, чтобы попросить пользователя &#171;зайти попозже&#187;. Например, если сервис генерирует скриншоты веб-сайтов из различных браузеров с целью продемонстрировать правильность их отображения владельцам или просто интересующимся, то генерация страницы с ними может занимать даже не секунды, а минуты. Наиболее удобным для пользователя в такой ситуации будет предложение посетить страницу по указанному адресу через столько-то минут, а не ждать у моря погоды неопределенный срок.</p>
<h3>Сессии</h3>
<p>Практически все веб-приложения каким-либо образом взаимодействуют со своими посетителями и в подавляющем большинстве случаев в них присутствует необходимость отслеживать перемещения пользователей по страницам сайта. Для решения этой задачи обычно используется механизм <em>сессий</em>, который заключается в присвоении каждому посетителю уникального идентификационного номера, который ему передается для хранения в cookies или, в случае их отсутствия, для постоянного &#171;таскания&#187; за собой через GET. Получив от пользователя некий ID вместе с очередным HTTP-запросом сервер может посмотреть в список уже выданных номеров и однозначно определить кто его отправил. С каждым ID может ассоциироваться некий набор данных, который веб-приложение может использовать по своему усмотрению, эти данные обычно по-умолчанию хранятся в файле во временной директории на сервере.</p>
<p>Казалось бы все просто, но&#8230; но запросы посетителей одного и того же сайта могут обрабатывать сразу несколько серверов, как же тогда определить не был ли выдан полученный ID на другом сервере и где вообще хранятся его данные?</p>
<p>Наиболее распространенными решениями является централизация или децентрализация сессионных данных. Несколько абсурдная фраза, но, надеюсь, пара примеров сможет прояснить ситуацию:</p>
<dl>
<dt><strong>Централизованное хранение сессий</strong></dt>
<dd>Идея проста: создать для всех серверов общую &#171;копилку&#187;, куда они смогут складывать выданные ими сессии и узнавать о сессиях посетителей других серверов. В роли такой &#171;копилки&#187; теоретически может выступать и просто примонтированная по сети файловая система, но по некоторым причинам более перспективным выглядит использование какой-либо СУБД, так как это избавляет от массы проблем, связанных с хранением сессионных данных в файлах. Но в варианте с общей базой данных не стоит забывать, что нагрузка на него будет неуклонно расти с ростом количества посетителей, а также стоит заранее предусмотреть варианты выхода из проблематичных ситуаций, связанных с потенциальными сбоями в работе сервера с этой СУБД.</dd>
<dt><strong>Децентрализованное хранение сессий</strong></dt>
<dd>Наглядный пример &#8212; хранение сессий в <a href="/tag/memcached" target="_blank">memcached</a>, изначально расчитанная на распределенное хранение данных в оперативной памяти система позволит получать всем серверам быстрый доступ к любым сессионным данным, но при этом (в отличии от предыдущего способа) какой-либо единый центр их хранения будет отсутствовать. Это позволит избежать узких мест с точек зрения производительности и стабильности в периоды повышенных нагрузок.</dd>
</dl>
<p>В качестве альтернативы сессиям иногда используют похожие по предназначению механизмы, построенные на cookies, то есть все необходимые приложению данные о пользователе хранятся на клиентской стороне (вероятно в зашифрованном виде) и запрашиваются по мере необходимости. Но помимо очевидных преимуществ, связанных с отсутствием необходимости хранить лишние данные на сервере, возникает ряд проблем с безопасностью. Данные, хранимые на стороне клиента даже в зашифрованном виде, представляют собой потенциальную угрозу для функционирования многих приложений, так как любой желающий может попытаться модифицировать их в своих интересах или с целью навредить приложению. Такой подход хорош только если есть уверенность, что абсолютно любые манипуляции с хранимые у пользователей данными безопасны. Но можно ли быть уверенными на 100%?</p>
<h3>Статический контент</h3>
<p>Пока объемы статических данных невелики &#8212; никто не мешает хранить их в локальной файловой системе и предоставлять доступ к ним просто через отдельный легковесный веб-сервер вроде <a href="/tag/lighttpd" target="_blank">lighttpd</a> (я подразумеваю в основном разные формы медиа-данных), но рано или поздно лимит сервера по дисковому пространству или файловой системы по количеству файлов в одной директории будет достигнут, и придется думать о перераспределении контента. Временным решением может стать распределение данных по их типу на разные сервера, или, возможно, использование иерархической структуры каталогов.</p>
<p>Если статический контент играет одну из основных ролей в работе приложения, то стоит задуматься о применении распределенной файловой системы для его хранения. Это, пожалуй, один из немногих способов горизонтально масштабировать объем дискового пространства путем добавления дополнительных серверов без каких-либо кардинальных изменений в работе самого приложения. На какой именно кластерной файловой системе остановить свой выбор ничего сейчас советовать не хочу, я уже опубликовал далеко не один обзор конкретных реализаций &#8212; попробуйте прочитать их все и сравнить, если этого мало &#8212; вся остальная Сеть в Вашем распоряжении.</p>
<p>Возможно такой вариант по каким-либо причинам будет нереализуем, тогда придется &#171;изобретать велосипед&#187; для реализации на уровне приложения принципов схожих с сегментированием данных в отношении СУБД, о которых я еще упомяну далее. Этот вариант также вполне эффективен, но требует модификации логики приложения, а значит и выполнение дополнительной работы разработчиками.</p>
<p>Альтернативой этим подходам выступает использование так называемых <strong>Content Delievery Network</strong> &#8212; внешних сервисов, обеспечивающих доступность Вашего контента пользователям за определенное материальное вознаграждение сервису. Преимущество очевидно &#8212; нет необходимости организовывать собственную инфраструктуру для решения этой задачи, но зато появляется другая дополнительная статья расходов. Список таких сервисов приводить не буду, если кому-нибудь понадобится &#8212; найти будет не трудно.</p>
<h3>Кэширование</h3>
<p>Кэширование имеет смысл проводить на всех этапах обработки данных, но в разных типах приложений наиболее эффективными являются лишь некоторые методы кэширования.</p>
<dl>
<dt><strong>СУБД</strong></dt>
<dd>Практически все современные СУБД предоставляют встроенные механизмы для кэширования результатов определенных запросов. Этот метод достаточно эффективен, если Ваша система регулярно делает одни и те же выборки данных, но также имеет ряд недостатков, основными из которых является инвалидация кэша всей таблицы при малейшем ее изменении, а также локальное расположение кэша, что неэффективно при наличии нескольких серверов в системе хранения данных.</dd>
<dt><strong>Приложение</strong></dt>
<dd>На уровне приложений обычно производится кэширование объектов любого языка программирования. Этот метод позволяет вовсе избежать существенной части запросов к СУБД, сильно снижая нагрузку на нее. Как и сами приложения такой кэш должен быть независим от конкретного запроса и сервера, на котором он выполняется, то есть быть доступным всем серверам приложений одновременно, а еще лучше &#8212; быть распределенным по нескольким машинам для более эффективной утилизации оперативной памяти. Лидером в этом аспекте кэширования по праву можно назвать <a href="/tag/memcached" target="_blank">memcached</a>, о котором я в свое время уже успел <a href="/unix-way/obzor-memcached/" target="_blank">подробно рассказать</a>.</dd>
<dt><strong>HTTP-сервер</strong></dt>
<dd>Многие веб-серверы имеют модули для кэширования как статического контента, так и результатов работы скриптов. Если страница редко обновляется, то использование этого метода позволяет без каких-либо видимых для пользователя изменений избегать генерации страницы в ответ на достаточно большую часть запросов.</dd>
<dt><strong>Reverse proxy</strong></dt>
<dd>Поставив между пользователем и веб-сервером прозрачный прокси-сервер, можно выдавать пользователю данные из кэша прокси (который может быть как в оперативной памяти, так и дисковым), не доводя запросы даже до HTTP-серверов. В большинстве случаев этот подход актуален только для статического контента, в основном разных форм медиа-данных: изображений, видео и тому подобного. Это позволяет веб-серверам сосредоточиться только на работе с самими страницами.</dd>
</dl>
<p>Кэширование по своей сути практически не требует дополнительных затрат на оборудование, особенно если внимательно наблюдать за использованием оперативной памяти остальными компонентами серверами и утилизировать все доступные &#171;излишки&#187; под наиболее подходящие конкретному приложению формы кэша.</p>
<p>Инвалидация кэша в некоторых случаях может стать нетривиальной задачей, но так или иначе универсального решения всех возможных проблем с ней связанных написать не представляется возможным (по крайней мере лично мне), так что оставим этот вопрос до лучших времен. В общем случае решение этой задачи ложится на само веб-приложение, которое обычно реализует некий механизм инвалидации средствами удаления объекта кэша через определенный <em>период времени</em> после его создания или последнего использования, либо &#171;вручную&#187; при возникновении определенных <em>событий</em> со стороны пользователя или других компонентов системы.</p>
<h3>Базы данных</h3>
<p>На закуску я оставил самое интересное, ведь этот неотъемлемый компонент любого веб-приложения вызывает больше проблем при росте нагрузок, чем все остальные вместе взятые. Порой даже может показаться, что стоит вообще отказаться от горизонтального масштабирования системы хранения данных в пользу вертикального &#8212; просто купить тот самый БОЛЬШОЙ сервер за шести- или семизначную сумму не-рублей и не забивать себе голову лишними проблемами.</p>
<p>Но для многих проектов такое кардинальное решение (и то, по большому счету, временное) не подходит, а значит перед ними осталась лишь одна дорога &#8212; горизонтальное масштабирование. О ней и поговорим.</p>
<p>Путь практически любого веб проекта с точки зрения баз данных начинался с одного простого сервера, на котором работал весь проект целиком. Затем в один прекрасный момент наступает необходимость вынести СУБД на отдельный сервер, но и он со временем начинает не справляться с нагрузкой. Подробно останавливаться на этих двух этапах смысла особого нет &#8212; все относительно тривиально.</p>
<p>Следующим шагом обычно бывает <strong>master-slave</strong> с асинхронной репликацией данных, как работает эта схема уже неоднократно упоминалось в блоге, но, пожалуй, повторюсь: при таком подходе все операции записи выполняются лишь на одном сервере (master), а остальные сервера (slave) получают данные напрямую от &#171;мастера&#187;, обрабатывая при этом лишь запросы на чтение данных. Как известно, операции чтения и записи любого веб-проекта всегда растут пропорционально росту нагрузки, при этом сохраняется почти фиксированным соотношение между обоими типами запросов: на каждый запрос на обновление данных обычно приходится в среднем около десятка запросов на чтение. Со временем нагрузка растет, а значит растет и количество операций записи в единицу времени, а сервер-то обрабатывает их всего один, а затем он же еще и обеспечивает создание некоторого количества копий на других серверах. Рано или поздно издержки операций репликации данных станут быть настолько высоки, что этот процесс станет занимать очень большую часть процессорного времени каждого сервера, а каждый slave сможет обрабатывать лишь сравнительно небольшое количество операций чтения, и, как следствие, каждый дополнительный slave-сервер начнет увеличивать суммарную производительность лишь незначительно, тоже занимаясь по большей части лишь поддержанием своих данных в соответствии с &#171;мастером&#187;.</p>
<p>Временным решением этой проблемы, возможно, может стать замена master-сервера на более производительный, но так или иначе не выйдет бесконечно откладывать переход на следующий &#171;уровень&#187; развития системы хранения данных: <strong>&#171;sharding&#187;</strong>, которому я совсем недавно посвятил <a href="http://www.insight-it.ru/net/scalability/segmentirovanie-bazy-dannykh/" target="_blank">отдельный пост &#171;Сегментирование баз данных&#187;</a>. Так что позволю себе остановиться на нем лишь вкратце: идея заключается в том, чтобы разделить все данные на части по какому-либо признаку и хранить каждую часть на отдельном сервере или кластере, такую часть данных в совокупности с системой хранения данных, в которой она находится, и называют сегментом или <em>shard</em>’ом. Такой подход позволяет избежать издержек, связанных с реплицированием данных (или сократить их во много раз), а значит и <em>существенно</em> увеличить общую производительность системы хранения данных. Но, к сожалению, переход к этой схеме организации данных требует массу издержек другого рода. Так как готового решения для ее реализации не существует, приходится модифицировать логику приложения или добавлять дополнительную &#171;прослойку&#187; между приложением и СУБД, причем все это чаще всего реализуется силами разработчиков проекта. Готовые продукты способны лишь облегчить их работу, предоставив некий каркас для построения основной архитектуры системы хранения данных и ее взаимодействия с остальными компонентами приложения.</p>
<p>На этом этапе цепочка обычно заканчивается, так как сегментированные базы данных могут горизонтально масштабироваться для того, чтобы в полной мере удовлетворить потребности даже самых высоконагруженных интернет-ресурсов. К месту было бы сказать пару слов и о собственно самой структуре данных в рамках баз данных и организации доступа к ним, но какие-либо решения сильно зависят от конкретного приложения и реализации, так что позволю себе лишь дать пару общих рекомендаций:</p>
<dl>
<dt><strong>Денормализация</strong></dt>
<dd>Запросы, комбинирующие данные из нескольких таблиц, обычно при прочих равных требуют большего процессорного времени для выполнения, чем запрос, затрагивающий лишь одну таблицу. А производительность, как уже упоминалось в начале повествования, чрезвычайно важна на просторах Сети.</dd>
<dt><strong>Логическое разбиение данных</strong></dt>
<dd>Если какая-то часть данных всегда используется отдельно от основной массы, то иногда имеет смысл выделить ее в отдельную независимую систему хранения данных.</dd>
<dt><strong>Низкоуровневая оптимизация запросов</strong></dt>
<dd>Ведя и анализируя логи запросов, можно определить наиболее медленные из них. Замена найденных  запросов на более эффективные с той же функциональностью может помочь более рационально использовать вычислительные мощности.</dd>
</dl>
<p>В этом разделе стоит упомянуть еще один, более специфический, тип интернет-проектов. Такие проекты оперируют данными, не имеющими четко формализованную структуру, в таких ситуациях использование реляционных СУБД в качестве хранилища данных, мягко говоря, нецелесообразно. В этих случаях обычно используют менее строгие базы данных, с более примитивной функциональностью в плане обработки данных, но зато они способны обрабатывать огромные объемы информации не придираясь к его качеству и соответствию формату. В качестве основы для такого хранилища данных может служить кластерная файловая система, а для анализа же данных в таком случае используется механизм под названием <a href="/tag/mapreduce" target="_blank">MapReduce</a>, принцип его работы я расскажу лишь вкратце, так как в полном своем масштабе он несколько выходит за рамки данного повествования.</p>
<p>Итак, мы имеем на входе некие произвольные данные в не факт что правильно соблюденном формате. В результате нужно получить некое итоговое значение или информацию. Согласно данному механизму практически любой анализ данных можно провести в следующие два этапа:</p>
<dl>
<dt><strong>Map</strong></dt>
<dd>Основной целью данного этапа является представление произвольных входных данных в виде промежуточных пар ключ-значение, имеющих определенный смысл и формально оформленных. Результаты подвергаются сортировке и группированию по ключу, а после чего передаются на следующий этап.</dd>
<dt><strong>Reduce</strong></dt>
<dd>Полученные после <strong>map</strong> значения используются для финального вычисления требуемых итоговых данных.</dd>
</dl>
<p>Каждый этап каждого конкретного вычисления реализуется в виде независимого мини-приложения. Такой подход позволяет практически неограниченно распараллеливать вычисления на огромном количестве машин, что позволяет в мгновения обрабатывать объемы практически произвольных данных. Для этого достаточно лишь запустить эти приложения на каждом доступном сервере одновременно, а затем собрать воедино все результаты.</p>
<p>Примером готового каркаса для реализации работы с данными по такому принципу служит opensource проект Apache Foundation под названием <a href="/net/scalability/hadoop/" target="_blank"><em>Hadoop</em></a>, о котором я уже неоднократно рассказывал ранее, да и <a href="http://ru.wikipedia.org/wiki/Hadoop" target="_blank" rel="nofollow">статейку в Википедию</a> написал в свое время.</p>
<h3>Вместо заключения</h3>
<p>Если честно, мне с трудом верится, что я смог написать настолько всеобъемлющий пост и сил на подведение итогов уже практически не осталось. Хочется лишь сказать, что в разработке крупных проектов важна каждая деталь, а неучтенная мелочь может стать причиной провала. Именно по-этому в этом деле учиться стоит не на своих ошибках, а на чужих.</p>
<p>Хоть может быть этот текст и выглядит как некое обобщение всех постов из серии <a href="/highload" target="_blank">&#171;Архитектуры высоконагруженных систем&#187;</a>, но врядли он станет финальной точкой, надеюсь мне <a href="/feed" target="_blank">найдется что сказать</a> по этой теме и в будущем,  может быть однажды это будет основано и на личном опыте, а не просто будет результатом переработки массы полученной мной информации. Кто знает?&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/masshtabiruemye-veb-arkhitektury/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
		<item>
		<title>hCard</title>
		<link>http://www.insight-it.ru/set/mikroformaty/hcard/</link>
		<comments>http://www.insight-it.ru/set/mikroformaty/hcard/#comments</comments>
		<pubDate>Sun, 13 Apr 2008 19:51:03 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Микроформаты]]></category>
		<category><![CDATA[hcard]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[персональная информация]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/microformats/hcard/</guid>
		<description><![CDATA[hCard представляет собой реализацию спецификации RFC 2426 (более известной как vCard) в виде микроформата. Основной его целью является предоставление стандарта оформления персональных данных на просторах Сети, но помимо этого имеется возможность указания информации об компаниях, организациях или местах. Как и любой другой микроформат, hCard реализуется без нарушения стандартов XHTML с помощью атрибутов тэга class, причем [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://microformats.org/wiki/hcard" target="_blank" rel="nofollow">hCard</a> представляет собой реализацию спецификации  <a href="http://www.ietf.org/rfc/rfc2426.txt" target="_blank" rel="nofollow">RFC 2426</a> (более известной как vCard) в виде микроформата. Основной его целью является предоставление стандарта оформления персональных данных на просторах Сети, но помимо этого имеется возможность указания информации об компаниях, организациях или местах.<br />
<span id="more-65"></span><br />
Как и любой другой микроформат, hCard реализуется без нарушения стандартов XHTML с помощью атрибутов тэга <strong>class</strong>, причем какие именно тэги используются &#8212; не важно. Для оформления данных используя этот микроформат достаточно лишь объявить какой-либо тэг hCard объектом с помощью <strong>class=&#187;vcard&#187;</strong> и разместить внутри него все тэги, обозначающие какое-либо свойство объекта. Большая часть информации, предоставляемой в соответствии с этим микроформатом является опциональной,  единственным обязательным свойством является имя объекта &#8212; <strong>class=&#187;fn&#187;</strong>. Помимо этого в атрибуте <strong>profile</strong> тэга <strong>&lt;head&gt;</strong> принято указывать адрес <strong>http://www.w3.org/2006/03/hcard</strong>.</p>
<p>В целом все свойства объектов hCard можно поделить на семь групп:</p>
<dl>
<dt><strong>идентификационные</strong></dt>
<dd>&ndash; различные варианты имен объекта.</dd>
<dt><strong>адресные</strong></dt>
<dd>&ndash; указания различных адресов, каким-либо образом ассоциирующихся с объектом: место жительство, работы и тому подобные.</dd>
<dt><strong>телекоммуникационные</strong></dt>
<dd>&ndash; любые формы контактной информации: номера телефонов, факс, адреса электронной почты и так далее.</dd>
<dt><strong>географические</strong></dt>
<dd>&ndash; месторасположение объекта.</dd>
<dt><strong>организационные</strong></dt>
<dd>&ndash; информация о должности и компании или организации, в которой работает объект.</dd>
<dt><strong>уточняющие</strong></dt>
<dd>&ndash; любая дополнительная информация об объекте.</dd>
<dt><strong>безопасность</strong></dt>
<dd>&ndash; ограничение доступа к информации в hCard.</dd>
</dl>
<p>Значением каждого свойства является видимый пользователю текст, получающийся в результате обработки документа браузером (или другим парсером данных). Но стоит несколько остановиться на свойстве photo, так как для него действуют несколько другие правила размещения значения:</p>
<ul>
<li>при использовании свойства photo в тэге <strong>&lt;a&gt;</strong>, значением является адрес из атрибута <strong>href</strong>;</li>
<li>в тэге <strong>&lt;img&gt;</strong>, значением является само изображение, то есть значение атрибута <strong>src</strong></li>
<li>в <strong>&lt;object&gt;</strong>, значением является атрибут <strong>data</strong>, то есть его источник данных.</li>
</ul>
<p>Раз уж зашла речь об размещении значений свойств, то сразу хочется сказать об небольшом исключении в виде тэга <strong>&lt;abbr&gt;</strong>, где оно задается в атрибуте <strong>title</strong>, а внутри самого тэга &#8212; некое более удобное для чтения людьми его представление.</p>
<p>Если тэг, обозначенный любым свойством, содержит какую-либо информацию помимо самого значения свойства, то для отделения релевантного контента от лишней информации можно разместить внутри тэга свойства дочерние объекты, обозначив их атрибутом <strong>class=&#187;value&#187;</strong>. Это даст понять парсеру микроформата, что собрав воедино (методом конкатенации) все значения помеченных таким образом объектов он сможет получить значение исходного свойства. Описание получилось несколько запутанным, так что лучше продемонстрировать этот принцип на примере, в котором значению свойства <strong>fn</strong> будет присвоено значение &#171;Иван Блинков&#187;:</p>
<pre lang="XHTML">
<div class="vcard">
<p class="fn"><span="value">Иван </span>подпрыгнул три раза на месте,
  обернулся и увидел написанную на стене
  свою фамилию: <span class="value">Блинков</span>.
</div>
</pre>
<p>Как не трудно заметить, значение свойства разбавлено массой ненужной информации, но с помощью тэгов с атрибутом <strong>class=&#187;value&#187;</strong> мне удалось выделить лишь важную информацию, не поменяв при этом внешний вид документа. Парсер микроформатов, читая этот документ, соединит обе части и получит в итоге как раз &#171;Иван Блинков&#187;, что и будет соответствовать желаемому имени объекта.</p>
<p>Вы заметили в предыдущем примере пробел после моего имени? Он был поставлен для того, чтобы при конкатенации составные части значения не слились в одно слово &#171;ИванБлинков&#187;,  не самый удобный подход к решению проблемы, но у него есть альтернатива в виде тэга <strong>&lt;abbr;&gt;</strong> (не забываем про упомянутое чуть выше исключение):</p>
<pre lang="XHTML">
<div class="vcard">

<abbr class="fn" title="Иван Блинков">Иван</abbr>
  подпрыгнул три раза на месте,
  обернулся и увидел написанную на стене
  свою фамилию: Блинков.
</div>
</pre>
<p>Общей информации на сегодня хватит, так что перейду к деталям реализации.</p>
<table width="100%" cellspacing="0" border="1" cellpadding="2">
<tbody>
<tr align="center">
<td colspan="2">
<h4>Идентификационные свойства</h4>
</td>
</tr>
<tr>
<th width="30%" valign="top" align="left"><strong>Свойство</strong></th>
<th width="70%" valign="top" align="left"><strong>Описание</strong></th>
</tr>
<tr>
<td valign="top">fn</td>
<td valign="top">полное имя объекта <em>(formatted name)</em></td>
</tr>
<tr>
<td valign="top">n</td>
<td valign="top">имя, используется для идентификации составных частей fn <em>(name)</em></td>
</tr>
<tr>
<td valign="top">nickname</td>
<td valign="top">прозвище</td>
</tr>
<tr>
<td valign="top">bday</td>
<td valign="top">день рождения в формате <strong>YYYY-MM-DD</strong> <em>(birthday) </em></td>
</tr>
<tr>
<td valign="top">photo</td>
<td valign="top">фотография</td>
</tr>
</tbody>
</table>
<p>Свойство <strong>fn</strong> уже успели слегка обсудить, так что перейдем сразу к <strong>n</strong>. Как уже было сказано, используется он для детализации составных частей полного имени объекта, для чего оно имеет ряд подсвойств, используемых в дочерних элементах:</p>
<dl>
<dt><strong>given-name</strong></dt>
<dd>&ndash; имя.</dd>
<dt><strong>additional-name</strong></dt>
<dd>&ndash; отчество.</dd>
<dt><strong>family-name</strong></dt>
<dd>&ndash; фамилия.</dd>
<dt><strong>honorific-preffix</strong></dt>
<dd>&ndash; какой-либо префикс к имени, отображающий социальный статус человек.</dd>
<dt><strong>honorific-suffix</strong></dt>
<dd>&ndash; суффикс с тем же смыслом.</dd>
</dl>
<p>Выглядит это все примерно так, ничего сложного:</p>
<pre lang="XHTML">
<div class="vcard">
<p class="fn n">
    <span="given-name">Иван</span>
    <span="additiona-name">Иванович</span>
    <span="family-name">Блинков</span>
  
</div>
</pre>
<h4>Адресные свойства</h4>
<p>Адрес может быть указан в двух формах:</p>
<ul>
<li><strong>adr</strong> &#8212; структурированной (с указанием составных частей);</li>
<li><strong>label</strong> &#8212; не структурированной.</li>
</ul>
<p>Для структурированного адреса используются подсвойства по аналогии с <strong>n</strong>:</p>
<table width="100%" cellspacing="0" border="1" cellpadding="2">
<tbody>
<tr>
<th width="30%" valign="top" align="left"><strong>Свойство</strong></th>
<th width="70%" valign="top" align="left"><strong>Описание</strong></th>
</tr>
<tr>
<td valign="top">post-office-box</td>
<td valign="top">почтовый адрес</td>
</tr>
<tr>
<td valign="top">extended-address</td>
<td valign="top">полный адрес (с номером подъезда, квартиры и т.д.)</td>
</tr>
<tr>
<td valign="top">street-address</td>
<td valign="top">улица</td>
</tr>
<tr>
<td valign="top">locality</td>
<td valign="top">город</td>
</tr>
<tr>
<td valign="top">region</td>
<td valign="top">регион, штат или провинция</td>
</tr>
<tr>
<td valign="top">postal-code</td>
<td valign="top">индекс</td>
</tr>
<tr>
<td valign="top">region</td>
<td valign="top">регион, штат или провинция</td>
</tr>
<tr>
<td valign="top">type</td>
<td valign="top">тип адреса, то есть то, как он связан с исходным идивидом, должен принимать одно из значений: dom, parcel, home, work, pref</td>
</tr>
</tbody>
</table>
<p><strong>label</strong> же используется просто для написания адреса по тому же принципу, как если бы Вы писали его, например, на конверте традиционного письма. Возможно использование подсвойства <strong>type</strong> как и в <strong>adr</strong>.</p>
<p>С телекоммуникационными свойствами все проще:</p>
<ul>
<li>телефон &#8212; <strong>tel</strong>;</li>
<li>адрес электронной почты &#8212; <strong>email</strong>;</li>
<li>почтовый клиент &#8212; <strong>mailer</strong> (не понятно &#8212; и зачем он тут сдался?).</li>
</ul>
<p>Телефонный номер может иметь тип (<strong>type</strong>):</p>
<ul>
<li><strong>home</strong> &#8212; домашний</li>
<li><strong>msg</strong> &#8212; имеется автоответчик</li>
<li><strong>work</strong> &#8212; рабочий</li>
<li><strong>pref</strong> &#8212; предпочтительный</li>
<li><strong>voice</strong> &#8212; голосовой</li>
<li><strong>fax</strong> &#8212; факс</li>
<li><strong>cell</strong> &#8212; мобильный aka сотовый</li>
<li><strong>video</strong> &#8212; для видеоконференций</li>
<li><strong>pager</strong> &#8212; пэйджер</li>
<li><strong>bbs</strong> &#8212; bulletin board system</li>
<li><strong>modem</strong> &#8212; возможно использование модема</li>
<li><strong>isdn</strong> &#8212; integrated services digital network</li>
<li><strong>pcs</strong> &#8212; personal communication service</li>
</ul>
<p>Географические свойства также не отличаются особой сложностью:</p>
<ul>
<li><strong>tz</strong> &#8212; временная зона</li>
<li><strong>long</strong> &#8212; широта</li>
<li><strong>lat</strong> &#8212; долгота</li>
</ul>
<p>С ручным заполнением этих свойств могут возникнуть некоторые проблемы, но при интеграции веб-приложения с сервисом вроде Google Earth &#8212; должно быть вполне удобно.</p>
<p>Свойства, описывающие индивида с точки зрения работы, немногочисленны:</p>
<ul>
<li><strong>title</strong> &#8212; должность</li>
<li><strong>role</strong> &#8212; роль</li>
<li><strong>logo</strong> &#8212; ссылка на логотип компании</li>
<li><strong>agent</strong> &#8212; указание представителя индивида, например секретаря, например в виде ссылки на его hCard</li>
<li><strong>org</strong> &#8212; название компании</li>
</ul>
<p>Дополнительные свойства:</p>
<ul>
<li><strong>category</strong> &#8212; категория, то есть чем по сути является данный hCard, например &#8212; визитка</li>
<li><strong>note</strong> &#8212; какие-либо замечания к остальным свойствам</li>
<li><strong>rev</strong> &#8212; время последнего редактирования hCard, то есть время на которое данная информация является актуальной</li>
<li><strong>sort-string</strong> &#8212; отмечает какая часть hCard (обычно часть имени), которая будет использована при сортировке списка из нескольких hCard</li>
<li><strong>sound</strong> &#8212; адрес, указывающий на звуковой файл с правильным произношением имени индивида</li>
<li><strong>url</strong> &#8212; адрес персонального или корпоративного сайта</li>
<li><strong>uid</strong> &#8212; уникальный идентификационный номер в каком-либо специфицированном IANA формате (подсвойство <strong>type</strong> указывает в каком именно)</li>
</ul>
<p>Для обеспечения ограничения доступа к данным из <a href="/tag/hcard" target="_blank">hCard</a> используется два свойства &#8212; <strong>class</strong> и <strong>key</strong>. <strong>class</strong> определяет уровень доступа по примерно тому же принципу, что и в <a href="/tag/oop" target="_blank">ООП</a>: <em>public</em> или <em>confidentional</em>. А свойство <strong>key</strong> предоставляет публичный ключ, для расшифровки данных с закрытым доступом.</p>
<p>Хочется добавить, что благодаря своей структурированной архитектуре данный микроформат может использоваться в более широком спектре случаев, чем просто предоставление персональных данных, например, можно описывать и просто организацию или какое-либо место. Те же самые принципы могут быть использованы и при оформление персональных данных в формате <a href="/tag/xml" target="_blank">XML</a> &#8212; достаточно лишь использовать те же самые атрибуты hCard для произвольных тэгов <a href="/tag/xml" target="_blank">XML</a>.</p>
<p>В заключение хочу сказать, что в качестве источников информации для данной статьи были использованы <a href="http://microformats.org/wiki/hcard" target="_blank" rel="nofollow">официальная вики</a> и <a href="http://www.xfront.com/microformats/hCard.html" target="_blank" rel="nofollow">презентация от Robert Costello</a>, а подписаться на <a href="/feed" target="_blank"><strong>RSS</strong></a> можно вот <a href="/feed" target="_blank"><strong>ТУТ</strong></a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/mikroformaty/hcard/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Архитектура Digg</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/#comments</comments>
		<pubDate>Tue, 01 Apr 2008 17:49:21 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[APC]]></category>
		<category><![CDATA[Digg]]></category>
		<category><![CDATA[LAMP]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Lucene]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Digg]]></category>
		<category><![CDATA[интернет]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-digg/</guid>
		<description><![CDATA[Трафик, генерируемый более чем 1.2 миллионами пользователей Digg, знаменитых своей жаждой информации, способен загнать любой невинный сайт за рамки его вычислительных ресурсов и пропускной способности канала. Как же сам Digg справляется с такой нагрузкой? Источники информации Этот текст &#8212; перевод статьи, автор &#8212; Todd Hoff. Как Digg.com использует LAMP для масштабирования Масштабируемость и производительность PHP [...]]]></description>
			<content:encoded><![CDATA[<p>Трафик,  генерируемый более чем 1.2 миллионами пользователей <a href="http://www.digg.com" rel="nofollow" target="_blank">Digg</a>, знаменитых своей жаждой информации, способен загнать любой невинный сайт за рамки его вычислительных ресурсов и пропускной способности канала. Как же сам Digg справляется с такой нагрузкой?<br />
<span id="more-61"></span></p>
<h3>Источники информации</h3>
<p><em>Этот текст &#8212; перевод <a href="http://highscalability.com/digg-architecture" target="_blank" rel="nofollow">статьи</a>, автор &#8212; <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd Hoff</a>.</em></p>
<ul>
<li><a href="http://www.computerworld.com/action/article.do?command=viewArticleBasic&#038;articleId=9017778" target="_blank" rel="nofollow">Как Digg.com использует LAMP для масштабирования</a></li>
<li><a href="http://www.oreillynet.com/onlamp/blog/2006/04/digg_phps_scalability_and_perf.html" target="_blank" rel="nofollow">Масштабируемость и производительность PHP в Digg</a></li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li><a href="/tag/php" target="_blank">PHP</a></li>
<li><a href="/tag/lucene" target="_blank">Lucene</a></li>
<li><a href="/tag/apc" target="_blank">APC PHP Accelerator</a></li>
<li><a href="/tag/memcached" target="_blank">Memcached</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Проект стартовал в конце 2004 года на одном сервере под управлением <a href="/tag/linux" target="_blank">Linux</a> с использованием <a href="/tag/apache" target="_blank">Apache 1.3</a>, <a href="/tag/php" target="_blank">PHP 4</a> и <a href="/tag/mysql" target="_blank">MySQL 4.0</a> (со стандартной системой хранения данных &#8212; MyISAM).</li>
<li>Более 1.2 миллиона пользователей.</li>
<li>Более 200 миллионов просмотров страниц в месяц.</li>
<li>100 серверов расположены в нескольких датацентрах, из них:
<dl>
<dd>&ndash; 20 серверов баз данных;</dd>
<dd>&ndash; 30 веб-серверов;</dd>
<dd>&ndash; несколько поисковых серверов, использующих Lucene;</dd>
<dd>&ndash; остальные используются для обеспечения избыточности.</dd>
</dl>
</li>
<li>30 GB данных.</li>
<li>Ни одна из проблем, с которыми пришлось столкнуться проекту не была связана с <a href="/tag/php" target="_blank">PHP</a>, в основном они касались базы данных.</li>
<li>Легковесная природа <a href="/tag/php" target="_blank">PHP</a> позволила переместить вычислительные работы из базы данных в приложение для улучшения производительности.</li>
</ul>
<h3>Что внутри?</h3>
<ul>
<li>Балансировщик нагрузки равномерно распределяет запросы между <a href="/tag/php" target="_blank">PHP</a> серверами.</li>
<li>MySQL используется по принципу master-slave:
<dl>
<dd>&nbsp; Сервера, обрабатывающие большое количество транзакций, используют движок InnoDB.</dd>
<dd>&nbsp; Сервера, выполняющие аналитическую обработку данных в реальном времени, используют MyISAM.</dd>
<dd>&nbsp; Снижения производительности при переходе с <a href="/tag/mysql" target="_blank">MySQL</a> 4.1 на версию 5 замечено не было.</dd>
</dl>
</li>
<li>Для кэширования используется <a href="/tag/memcached" target="_blank">Memcached</a>.</li>
<li>Используется сегментирование баз данных.</li>
<li>Особенности использования Digg существенно облегчают процесс масштабирования. Большинство посетителей просто просматривают главную страницу и уходят. Это приводит к тому, что 98% запросов к базе данных являются операциями чтения. Такое соотношение операций чтения и записи позволяет не беспокоиться о комплексной работе по проектированию операций записи, что позволяет намного проще масштабировать проект.</li>
<li>Возникали проблемы, связанные с системой хранения данных, которые сообщали, что данные уже записаны на диск, когда на самом деле это было не так. Контроллеры делали это для создания впечатления более высокой производительности. Но на практике это приводило лишь к проблемам с целостностью данных. Это достаточно распространенная проблема, которую порой не так уж просто решить, правда все зависит от используемого оборудования.</li>
<li>Для облегчения нагрузки на базы данных используется кэшрование и <a href="/tag/apc" target="_blank">APC PHP Accelerator</a>.</li>
<li>С использованием рабочих потоков <a href="/tag/apache" target="_blank">Apache2</a>, FastCGI и <a href="/tag/php" target="_blank">PHP</a> акселератора возможно избежать необходимости каждый раз заново интерпретировать и компилировать PHP скрипты: скрипт компилируется только при первом обращении, что существенно ускоряет скорость его выполнения при последующих обращениях.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Используйте возможность выбора движка для <a href="/tag/mysql" target="_blank">MySQL</a>. Если Вам нужны транзакции &#8212; используйте InnoDB, если нет &#8212; MyISAM. Например, если на master сервере расположены транзакционные таблицы, то для slave серверов можно использовать и MyISAM.</li>
<li>В определенный момент рост стал невозможен путем добавления дополнительной оперативной памяти, пришлось продолжать рост путем изменения архитектуры.</li>
<li>Люди часто жалуются, что Digg медлителен. Скорее это вызвано их огромными <a href="/tag/javascript" target="_blank">JavaScript</a> библиотеками, чем работой их серверной системы.</li>
<li>Стоит тщательно выбирать какие именно приложения развертывать. Они приложили все усилия, чтобы не использовать приложения, требующие больших вычислительных мощностей. Очевидно, что Digg работает на совершенно стандартной <a href="/tag/lamp" target="_blank">LAMP</a> архитектуре, но тем не менее реализована она достаточно интересно. У инженеров часто возникает желание реализовать какой-либо дополнительный функционал, но всегда стоит иметь ввиду, что они могут разрушить инфраструктуру, если она не сможет расти теми же темпами. Так что с этим стоит повременить до тех пор пока система сможет выдерживать все необходимые нагрузки. Это приводит к планированию ресурсов, особенно большое внимание этому аспекту уделяет <a href="/tag/flickr" target="_blank">Flickr</a>.</li>
<li>Вам остается лишь догадываться, сможет ли <a href="/tag/digg" target="_blank">Digg</a> удержать свои позиции, если и дальше будет ограничивать добавление новых возможностей, или уступит более активно развивающимся сервисам социальных закладок? Возможно если бы была возможность увеличивать масштабы более простыми методами, более быстрое добавление новых функций и возможностей позволило бы более эффективно конкурировать на этом рынке? С другой стороны, просто добавление новых возможностей может и не поменять ситуацию кардинальным образом.</li>
<li>Основные проблемы с масштабируемостью и производительностью связаны с обработкой данных и в большинстве случаев они не зависят от используемого языка программирования. Вы столкнетесь с ними при работе с <a href="/tag/java" target="_blank">Java</a>, <a href="/tag/php" target="_blank">PHP</a>, <a href="/tag/ruby" target="_blank">Ruby</a>, или подставьте сюда Ваш любимый язык программирования.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-digg/feed/</wfw:commentRss>
		<slash:comments>14</slash:comments>
		</item>
		<item>
		<title>Архитектура Friends for Sale</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-friends-for-sale/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-friends-for-sale/#comments</comments>
		<pubDate>Mon, 17 Mar 2008 18:44:12 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Capistrano]]></category>
		<category><![CDATA[CentOS]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[Friends for Sale]]></category>
		<category><![CDATA[LVM]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[mongrel]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Pingdom]]></category>
		<category><![CDATA[Rails]]></category>
		<category><![CDATA[RoR]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[Starling]]></category>
		<category><![CDATA[SVN]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[социальные сети]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-friends-for-sale/</guid>
		<description><![CDATA[За три коротких месяца Friend for Sale (рейтинговая система в условиях рыночной экономики) попала в десятку лучших приложений Facebook, непринужденно обрабатывая 200 запросов в секунду и демонстрируя шокирующее количество просмотров страниц, за месяц достигающее 300 миллионов просмотров. Все это дело рук двух разработчиков, работающих не полный рабочий день, которые смогли создать успешное веб-приложение, имея в [...]]]></description>
			<content:encoded><![CDATA[<p><img src="/wp-content/uploads/friends-for-sale.gif" alt="Friends for Sale Logo" title="Friends for Sale" style="float:right; margin: 80px 16px;" /><br />
За три коротких месяца <em><a href="http://www.facebook.com/apps/application.php?id=7019261521" target="_blank" rel="nofollow">Friend for Sale</a></em> (рейтинговая система в условиях рыночной экономики) попала в десятку лучших приложений <em>Facebook</em>, непринужденно обрабатывая 200 запросов в секунду и демонстрируя шокирующее количество просмотров страниц, за месяц достигающее 300 миллионов просмотров. Все это дело рук двух разработчиков, работающих не полный рабочий день, которые смогли создать успешное веб-приложение, имея в своем распоряжении лишь кластер из дюжины серверов и <a href="/tag/ruby-on-rails" target="_blank">Ruby on Rails</a>.</p>
<p>Как Friends for Sale масштабируется для того, чтобы обеспечить торговлю всеми этими красивыми людьми? Как Вы думаете, сколько стоят Ваши друзья на открытом рынке?<br />
<span id="more-53"></span></p>
<h3>Источники информации</h3>
<p><em>Традиционная пара фраз, чтобы отдать должное <a href="http://highscalability.com/friends-sale-architecture-300-million-page-view-month-facebook-ror-app" target="_blank" rel="nofollow">оригиналу</a> и его <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">автору</a>. Продолжаем:</em></p>
<ul>
<li>Ответы на стандартный набор вопросов от Siqi Chen и Alexander Le, создателей Friends for Sale;</li>
<li><a href="http://highscalability.com/docs/EmergingTechSIGPresentation.pdf" target="_blank" rel="nofollow">Virality on Facebook</a>.</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/ruby-on-rails" target="_blank">Ruby on Rails</a></li>
<li><a href="/tag/centos" target="_blank">CentOS</a> (64 bit)</li>
<li><a href="/tag/capistrano" target="_blank">Capistrano</a> &#8212; для обновлений и перезапусков серверов</li>
<li><a href="/tag/memcached" target="_blank">Memcached</a></li>
<li><a href="/tag/mysql" target="_blank">MySQL</a></li>
<li><a href="/tag/nginx" target="_blank">nginx</a></li>
<li><a href="/tag/starling" target="_blank">Starling</a> &#8212; распределенный сервер очередей</li>
<li>Softlayer &#8212; хостинг</li>
<li><a href="/tag/pingdom" target="_blank">Pingdom</a> &#8212; мониторинг</li>
<li><a href="/tag/lvm" target="_blank">LVM</a></li>
<li><a href="http://magicmodels.rubyforge.org/magic_multi_connections/" target="_blank" rel="nofollow">Magic Multi-Connections Gem</a> &#8212; разделение операций чтения и записи между серверами</li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Это Facebook приложение находится в десятке наиболее популярных;</li>
<li>Около 600 тысяч активных пользователей;</li>
<li>Полмиллиона уникальных посетителей ежедневно, и эта цифра неуклонно растет;</li>
<li>Темпы роста проекта достигают 300% в месяц;</li>
<li>200 запросов в секунду;</li>
<li>5 TB трафика в месяц;</li>
<li>Над проектом работают 2 разработчика и 1 админимтратор баз данных.</li>
<li>4 сервера баз данных, 6 серверов приложений, 1 тестовый сервер и 1 сервер для балансировки нагрузки:
<dl>
<dd>&ndash; Каждый из серверов приложений содержит 4 ядра и 8 GB оперативной памяти.</dd>
<dd>&ndash; На каждом из них работает 16 сервисов <a href="/tag/mongrel" target="_blank">mongrel</a> (в сумме &#8212; 96).</dd>
<dd>&ndash; 4 GB оперативной памяти на каждом из них отведено под <a href="/tag/memcached" target="_blank">memcached</a>.</dd>
<dd>&ndash; Сервера баз данных имеют более серьезное оборудование: при тех же 4-х ядрах, они имеют 32 GB оперативной памяти и RAID 10 массив из четырех 15000rpm SCSI дисков, работающих в режиме &#171;master/slave&#187;.</dd>
</dl>
</li>
</ul>
<h3>Давайте знакомиться</h3>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Для чего нужна ваша система?</p>
<p>Наша система разработана в качестве платформы для нашего Facebook приложения, Friends for Sale.<br />
В целом оно представляет собой аналог рейтинговой системы <a href="http://www.hotornot.com/" target="_blank" rel="nofollow">Hot-or-Not</a> с некоторым добавлением рыночной экономики. В момент проведения интервью это приложение было на 10-м месте по популярности среди приложений Facebook.</p>
<p>Описание этого приложения на самом Facebook гласит:</p>
<div style="background: #bbff00; padding: 8px; margin-top: 5px; margin-bottom:35px;">Покупайте и продавайте своих друзей как питомцев! Вы можете научить их толкаться, отправлять подарки или просто представлять Вас в выгодном свете.<br />
Зарабатывайте как практичный инвестор в питомцев или как популярный товар!
</div>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Почему вы решили построить эту систему?</p>
<p>Мы разработали ее скорее как эксперимент для того, чтобы проверить удалось ли нам понять концепции и измерения вирусного эффекта в рамках Facebook. Мне кажется нам это удалось. <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> С какими конкретными сложными задачами, связанными с дизайном, архитектурой или реализацией системы, вам пришлось столкнуться при построении системы?</p>
<p>Как и в любом Facebook приложении, каждый запрос является динамическим, так что кэширование страниц невозможно. Так как приложение является интерактивным, со множеством операций записи, определенные трудности вызвало масштабирование базы данных.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы были ваши действия, направленные для решения этих задач?</p>
<p>С самого начала мы активно использовали <a href="/tag/memcached" target="_blank">memcached</a> &#8212; для перезагрузки страницы совсем не требуется выполнение SQL запросов. В основном мы использовали кэширование фрагментов Rails с индивидуальной логикой актуальности.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы оцениваете размеры вашей системы?</p>
<p>Вчера статистика показала более полумиллиона уникальных посетителей, и эта цифра неуклонно растет.<br />
За этот месяц было зарегистрировано более 300 миллионов просмотров страниц.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы показатели использования пропускной способности интернет-канала?</p>
<p>В прошлом месяце было потрачено 3 терабайта трафика, но в этом месяце ожидается цифра не меньше 5 терабайт. Эти цифры состоят по большей части из XHTML / CSS и нескольких небольших иконок.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как много документов используется в системе? Сколько изображений? Какой объем данных?</p>
<p>По большому счету у нас нет уникальных документов&#8230; но зато у нас есть около 10 миллионов профилей пользователей.<br />
Единственными используемыми изображениями являются несколько статических иконок.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы оцениваете темпы роста вашей системы?</p>
<p>Месяц назад за сутки просматривалось около трех миллионов страниц, на данный момент эта цифра достигла 10 миллионов в сутки. Из чего можно сделать вывод, что ориентировочные темпы роста проекта составляют 300% в месяц. Если говорить о ежесекундной нагрузке, то на данный момент она составляет около 200 запросов в секунду.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какая часть посетителей платит вам за участие в вашем проекте?</p>
<p>Он абсолютно бесплатен для пользователей.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы показатели &#171;текучести&#187; пользователей?</p>
<p>В среднем около 1% в сутки, с ежедневным ростом в 3% от этой цифры, если говорить в терминах новых установок .</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как много учетных записей активно принимали участие в проекте за последний месяц?</p>
<p>По данным <a href="/tag/google" target="_blank">Google</a> за последний месяц проект посетил 2.1 миллион уникальных пользоывтелей.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какова архитектура вашей системы?</p>
<p>Она представляет собой относительно стандартный Rails кластер. В качестве интерфейса между запросами пользователей и серверами приложений используется proxy балансировщик нагрузки, который перенаправляет запросы напрямую шести четырехядерным серверам приложений. На каждом сервере приложений запущено 16 <a href="/tag/mongrel" target="_blank">mongrel</a>&#8216;ов, что в сумме дает 96. Балансировщик нагрузки перенаправляет запросы напрямую на порты серверов <a href="/tag/mongrel" target="_blank">mongrel</a>. В дополнение к этому на каждом сервере приложений выделено 4 GB оперативной памяти под <a href="/tag/memcached" target="_blank">memcached</a>, а также работает локальный сервер распределенного менеджера очередей <a href="/tag/starling" target="_blank">Starling</a> и несколько менее важных фоновых процессов.</p>
<p><a href="/tag/subd" target="_blank">СУБД</a> работает на двух серверах (четыре ядра, 32 GB оперативной памяти, четыре 15000rpm SCSI диска в RAID 10) в режиме &#171;master/slave&#187;. Для организации распределения операций чтения и записи между серверами используется <a href="http://magicmodels.rubyforge.org/magic_multi_connections/" target="_blank" rel="nofollow">Magic Multi-Connections Gem</a> от Dr Nic.</p>
<p>На данный момент ведется работа над добавлением дополнительных серверов, работающих в роли &#171;slave&#187;, для обеспечения более эффективного распределения нагрузки, избыточности и политик хранения запасных копий данных. Помимо этого нам помогают Percona (ребята из mysqlperformanceblog) с удаленной работой над архитектурой базы данных.</p>
<p>Нашим хостинг-провайдером является Softlayer &#8212; он просто фантастический. Основной проблемой был тот факт, что их балансировщик нагрузки не справлялся со своей задачей &#8230; поначалу у нас возникала масса проблем, связанных с задержками и повисшими соединениями. Переход на отдельный сервер с запущенным только nginx в режиме proxy балансировщика нагрузки позволила решить все проблемы.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каким образом планируется масштабировать архитектуру вашего проекта?</p>
<p>Каких-то конкретных планов нет. На уровне приложения система не использует какие-либо общие ресурсы, так что все достаточно тривиально. На уровне баз данных на данный момент все еще используется один сервер в роли &#171;master&#187;, но мы стараемся отложить неизбежный переход к сегментированной базе данных на как можно более длительный срок. На данный момент базы данных масштабируются вертикально, но со временем, надеюсь, мы сможем от этого избавиться.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Назовите самые интересные уникальные факты о вашем проекте?</p>
<p>Я могу назвать:</p>
<ol>
<li>Ни один из двух разработчиков ранее не имел опыта в крупномасштабных разработках на основе <a href="/tag/rails" target="_blank">Rails</a>.</li>
<li>Наша траектория роста проекта достаточно редка в истории разработок с использованием <a href="/tag/rails" target="_blank">Rails</a>.</li>
<li>У нас практически не было возможностей для кэширования статических страниц &#8212; каждый запрос страницы приходилось обрабатывать <a href="/tag/rails" target="_blank">Rails</a>.</li>
</ol>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Чему вам удалось научиться? Каков залог вашего успеха? Чего бы вам хотелось сделать по-другому в прошлом, если бы была такая возможность? Что бы вы оставили как есть?</p>
<p>Отличные хостинг, оборудование и архитектура БД являются очень важными факторами. Мы привыкли пользоваться услугами хостинга Railsmachine, который честно говоря является отличным провайдером shared хостинга, но со временем они потеряли возможность выдерживать необходимую нагрузку. В итоге почти месяц мы были едва способны отвечать на запросы браузеров из-за проблем с оборудованием, хотя последующий переход на Softlayer занял всего два часа. Стоит заранее выбирать качественный хостинг, если планируется масштабирование проекта, смена хостинг-провайдера &#8212; не очень веселое занятие.</p>
<p>Основным выводом, который нам удалось сделать, является тот факт, что причиной проблемы с масштабированием практически всегда является база данных. Все без исключений проблемы с производительностью в итоге сводились к серверу баз данных, конфигурации СУБД, эффективности запросов или решению вопроса насчет необходимости использования индексов.</p>
<p>Определенно нам нужен был более качественный хостинг намного раньше.</p>
<p>Мы определенно не сменим наш framework &#8212; <a href="/tag/rails" target="_blank">Rails</a> был незаменим при быстрой разработке приложения, нам удалось доказать, что для масштабирования проекта на <a href="/tag/ror" target="_blank">RoR</a> достаточно двух парней, абсолютно не имеющих опыта в этом.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Кто входит в состав вашей команды?</p>
<p>У нас есть два разработчика, включая меня. Помимо этого недавно мы начали пользоваться услугами помощи с DBA, о которой уже упоминалось.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Сколько всего людей участвует в проекте?</p>
<p>В технической части &#8212; два разработчика и один администратор баз данных, работающий на контрактной основе.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Где они расположены с географической точки зрения?</p>
<p>Все участники проекта живут в районе SOMA, San Francisco.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы обчзанности каждого из участников проекта?</p>
<p>Оба разработчика проекта по совместительству являются и его создателями. Поначалу я (Siqi) был ответственным за дизайн и разработку пользовательского интерфейса, но так как у меня был некоторый опыт с развертыванием систем я взял на себя и разработку управления сетевыми операциями и развертывания. Мой коллега Alex был ответственным за большую часть <a href="/tag/rails" target="_blank">Rails</a> кода, вся логика приложения &#8212; его рук дело.</p>
<p>На данный момент я по большей части занимаюсь более техническими моментами, такими как оптимизация сетевых операций и работы и репликации <a href="/tag/mysql" target="_blank">MySQL</a>. С трудом получается вернуться к работе над пользовательским интерфейсом &#8212; к тому, что мне по-настоящему нравится. Но это был опыт, который явно стоило получить, так что я стараюсь извлекать максимум выгоды из этого занятия.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> У вас есть какая-то определенная философия менеджмента?</p>
<p>Да &#8212; найти самых умелых и сообразительных людей, сделать им наилучшее возможное предложение и убраться с их пути. Самые лучшие менеджеры должны уметь НЕ МЕШАТЬ работникам, так что я стараюсь максимально этому следовать при работе с другими участниками проекта. Но, к сожалению, мне удается это далеко не всегда.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Если ваша команда работает раздельно, как вам удается координировать свою работу?</p>
<p>Нам стоило бы задуматься об использования каких-либо эффективных средств общения. Мне кажется, что использование удаленной работа / outsourcing&#8217;а является по-настоящему сложной задачей &#8212; я предпочитаю обходиться без этого в разработке основы системы. Для системного администрирования или разработки архитектуры БД это было бы более оправданно.</p>
<h3>Что вы используете для разработки?</h3>
<p>Мы используем <a href="/tag/rails" target="_blank">Rails</a> с несколькими plug-in&#8217;ами, самыми важными являются cache-fu от Cris Wanstrath и magic multi connections от Dr Nic. В качестве текстового редактора я предпочитаю vim с плагином rails.vim.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какие языки программирования используются?</p>
<p><a href="/tag/ruby-on-rails">Ruby on Rails</a></p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Сколько используется серверов?</p>
<p>На данный момент используется кластер из 12 серверов.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как они используются?</p>
<p>4 сервера баз данных, 6 серверов приложений, 1 тестовый сервер и 1 сервер для балансировки нагрузки.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Кто их предоставляет?</p>
<p>Мы заказываем их у Softlayer &#8212; до подключения их к системе проходит порой менее четырех часов, что очень неплохо.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какая операционная система используется?</p>
<p>CentOS 5 (64 бит)</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какой http сервер используется?</p>
<p>nginx</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какая СУБД используется?</p>
<p>MySQL 5.1</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Вы используете обратную proxy?</p>
<p>Мы просто используем встроенный в nginx proxy балансировщик нагрузки.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы развертываете вышу систему в датацентре?</p>
<p>Мы используем хостинг выделенных серверов, Softlayer.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какова ваша стратегия хранения данных?</p>
<p>Мы используем резервное копирование NAS помимо внутренних SCSI RAID массивов.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какой объем дискового пространства вам доступен?</p>
<p>На всех серверах в сумме около 5 TB.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы наращиваете объем дисково пространства?</p>
<p>Спонтанно. Мы еще не выполнили каких-либо исследований в планировании дискового пространство, но это было явно зря не сделано.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Вы используйте какой-либо сервис хранения информации?</p>
<p>Нет.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Вы используете виртуализацию хранимых данных?</p>
<p>Нет.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как организована работа с сессиями?</p>
<p>На данный момент она поручена СУБД, но передача их обслуживания напрямую memcached &#8212; достаточно несложная задача.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как организована архитектура вашей БД?</p>
<p>На данный момент &#8212; &#171;master/slave&#187;. Мы осуществляем переход к нескольким &#171;slave&#187; с proxy балансировщиком нагрузке для режима &#171;только для чтения&#187;.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как организована балансировка нагрузки?</p>
<p>На программном уровне средствами nginx.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какой framework / AJAX библоиотеку вы используете?</p>
<p>Rails.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какие средства распределенного управления задачами вы используете?</p>
<p><a href="/tag/starling">Starling</a></p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы управляете рекламой в проекте?</p>
<p>Мы участвуем в нескольких рекламных сетях. Мы оцениваем эффективность каждой рекламной сети с помощью eCPM на уровне приложения.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Имеете ли вы стандартную API на вашем сайте?</p>
<p>Нет.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Сколько человек в вашей команде?</p>
<p>2 разработчика.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какими наборами способностей обладают участники вашей команды?</p>
<p>Я: дизайн пользовательского интерфейса, разработка, ограниченные знания в Rails, оптимизация MySQL, развертывание Rails.</p>
<p>Alex: разработка логики приложения, дизайн пользовательского интерфейса, программная инженерия в целом.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какие средства разработки вы используете?</p>
<p>Alex работает в OS X, а я предпочитаю Ubuntu. Для контроля за версиями используется <a href="/tag/svn" target="_blank">SVN</a>. В качестве текстового редактора я использую VIM, а Alex &#8212; TextMate.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как проходит процесс разработки?</p>
<p>На логическом уровне все упирается в тесты, мы проводим их достаточно экстенсивно. На уровне приложения все ограничивается быстрыми итерациями и не менее быстры тестированием.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Какова ваша стратегия кэширования объектов и контента?</p>
<p>Мы используем <a href="/tag/memcached" target="_blank">memcached</a> без TTL и просто вручную очищаем кэш при необходимости.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как происходит кэширование на клиентской стороне?</p>
<p>Никак.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы управляете вашей системой?<br />
<img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы проверяете глобальную доступность и моделируете производительность для конечных пользователей?</p>
<p>Мы используем <a href="/tag/pingdom" target="_blank">Pingdom</a> для внешнего мониторинга за сайтом &#8212; они отлично справляются.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы проверяете работоспособность ваших серверов и сетей?</p>
<p>На данный момент мы полагаемся на внешний мониторинг и ping мониторинг от Softlayer. В перспективе мы рассматриваем FiveRuns как возможное решение для мониторинга серверов.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы строите на графиках или диаграммах сетевую и серверную статистику, а также тенденции?</p>
<p>Мы не занимаемся этим.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы тестируете систему?</p>
<p>Сначала мы разворачиваем ее на тестовом сервере и проводим несколько тестов, после чего разворачиваем систему уже на серверах приложений.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы анализируете производительность?</p>
<p>Мы отслеживаем каждый SQL-запрос в процессе разработки, это позволяет нам убедиться, что не выполняются никакие ненужные запросы или создание экземпляра модели. Помимо этого мы не выполняем каких-либо тестов на производительность.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы обеспечиваете безопасность?</p>
<p>Тщательно.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы решаете какие возможности добавить или оставить?</p>
<p>Решения основываются на отзывах пользователей и критическом взгляде на них. Мы верим в простоту, так что нам приходится как следует все взвесить перед добавлением каких-либо существенных возможностей.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы реализуете веб-аналитику?</p>
<p>Мы используем собственную систему оценок для оптимизации вирусного эффекта, но помимо этого пользуемся и услугами <a href="http://www.google.com/analytics" target="_blank" rel="nofollow">Google Analytics</a>.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Используете ли вы A/B тестирование?</p>
<p>Да, время от времени мы используем их для тонкой настройки аспектов дизайна для того, чтобы оптимизировать его под вирусный эффект.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы выполняете резервное копирование и восстановление?</p>
<p>Мы используем LVM для создания ежедневных и еженедельных инкрементальных резервных копий.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как выполняются обновления оборудования и программного обеспечения?</p>
<p>На данный момент мы делаем это вручную, за исключением развертывания <a href="/tag/rails" target="_blank">Rails</a> приложения. Для обновления и перезапуска серверов приложений мы используем <a href="/tag/capistrano" target="_blank">Capistrano</a>.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы выполняете глобальные изменения в структуре базы данных при обновлениях?</p>
<p>Обычно мы начинаем переход с второстепенных серверах баз данных, а затем просто переключаем основные.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы ваши планы насчет защиты от сбоев и развития бизнеса?</p>
<p>Не самым лучшим образом&#8230;</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Есть ли у вас отдельная операционная команда, работающая над сайтом?</p>
<p>Было бы неплохо, но нет <img src='http://www.insight-it.ru/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Используете ли вы <abbr title="Content Delievery Network">CDN</abbr>? Если да, то какую и для каких целей?</p>
<p>Нет.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как выглядит модель ваших доходов?</p>
<p><abbr title="Costs per thousand impressions">CPM</abbr>: больше просмотров страниц &#8212; больше денег. Помимо этого у нас бывают прямые поощрительные предложения через нашу виртуальную валюту.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как вы продвигаете ваш продукт?</p>
<p>Это же социальная сеть. Мы просто используем вирусный эффект для поддержания роста проекта.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Используете ли вы какие-либо особенно интересные технологии или алгоритмы?</p>
<p>Я думаю Ruby запросто мог бы подойти под это определение, но на самом деле нет &#8212; мы не проводим научных исследований, мы просто стараемся быть полезными для посетителей.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Храните ли вы изображения в юазе данных?</p>
<p>Нет, это бы была не самая лучшая идея.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как много работы над организацией взаимодействия с пользователями приходится выполнять?</p>
<p>Я бы сказал, что никакой, если вам не приходилось раньше масштабировать что-либо, и достаточно много, если приходилось. Достаточно сложно сказать что именно станет проблемой до тех пор, пока на самом деле с ними не столкнешься. Как только ты пройдешь через это, у тебя будет достаточно знаний, чтобы осознанно проводить какую-либо работу в этом направлении.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Приходилось ли вам сталкиваться с какими-либо сюрпризами, положительными или отрицательными?</p>
<p>Было удивительно, насколько ненадежным может оказаться поставщик оборудования, и как может отличаться уровень технической поддержки одного хостинг-провайдера по сравнению с другим. Одной из основных вещей, которая вам понадобится при масштабировании системы &#8212; хостинг, способный поддерживать ваши потребности.</p>
<p>С другой стороны, было удивительно насколько далеко смогла наз завести архитектура с одним &#171;master&#187; и несколькими &#171;slave&#187; на самом обыкновенном оборудовании. Я думаю, что даже миллиард просмотров страниц в месяц достижим при таком подходе к базе данных.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Как ваша система эволюционирует для соответствия новым требованиям к масштабируемости?</p>
<p>По большому счету она этого не делает, мы просто исправляем узкие места в системе и смотрим что же будет дальше.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Кем вы восхищаетесь?</p>
<p>Brad Fitzpatrick за изобретение memcache, а также каждым, кому успешно удалось горизонтально масштабировать свой проект.</p>
<p><img src="/wp-content/themes/copyblogger/images/bullet.gif" alt="#" title="" /> Каковы ваши планы по изменению архитектуры в будущем?</p>
<p>Скоро предется переходить к сегментированной по пользователям базе данных, так как скоро мы достигнем пределов базы данных по операциям записи и размерам.</p>
<h3>Их мысли о вирусном эффекте Facebook</h3>
<ul>
<li>Facebook моделирует социальную сеть в цифровой форме максимально точно и полно, по крайней мере насколько это возможно.</li>
<li>Построение социальной сети более важно, чем возможности, предоставляемые пользователям.</li>
<li>Facebook позволяет быстро распространять новые приложения через социальную сеть.</li>
<li>Идея вашего приложения должна быть социальной, затягивающей и универсальной.</li>
<li>Социальный аспект является основой вирусного эффекта.</li>
<li>&#171;Затягивание&#187; пользователей позволяет зарабатывать на нем.</li>
<li>Универсальность дает необходимый потенциал.</li>
<li>Friends for Sale &#8212; социальный проект, так как предоставляет возможность торговать своей частью социального графа.</li>
<li>Он затягивает, так как в основе лежит в какой-то степени сумасшедшая идея, ненавязчивая, слегка флиртующая, и немного циничная.</li>
<li>Он универсальный, так как все люди в какой-то степени самовлюбленны, знают себе цену, и хотят флиртовать с &#171;горячими&#187; людьми.</li>
<li>Каждая часть приложения является потенциальной для вовлечения новых пользователей.</li>
<li>Каждый пользователь в среднем приводит 1.4 новых, что является залогом экспонентациального роста.</li>
<li>Для каждого нового пользователя отслеживается количество приглашений, нотификаций, записей на &#171;стене&#187;, кликов в профиле и других факторов.</li>
<li>Для каждого канала поступления новых пользователей вычисляются проценты нажавших, успешно вовлеченных и выходов из проекта.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>На Facebook требуется масштабирование с самого начала. Дорога до миллиона просмотров страниц в сутки заняла 4 недели.</li>
<li><a href="/tag/ruby-on-rails" target="_blank">Ruby on Rails</a> может масштабироваться.</li>
<li>При правильном подходе к архитектуре может масштабироваться практически все что угодно, сосредоточтесь на этом.</li>
<li>Вам определенно нужна продуманная архитектура базы данных, качественный хостинг, а также правильно настроенное оборудование.</li>
<li>С использованием кэширования и современных серверов, может пройти достаточно длитекльный период времени до тех пор, пока понадобится использование баз данных с более сложной структурой, такой как сегменгирование.</li>
<li>Социальная сеть &#8212; это реальность. Количество новых пользователей в хорошо реализованном Facebook приложении на самом деле ошеломляет.</li>
<li>Большая часть проблем с производительностью в итоге сводится к базе данных. Дишний раз обратите внимание на конфигурацию СУБД, запросы и использование индексов.</li>
<li><strong>Люди до сих пор пользуются Vi!</strong></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-friends-for-sale/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Приношу свои извинения</title>
		<link>http://www.insight-it.ru/life/prinoshu-svoi-izvineniya/</link>
		<comments>http://www.insight-it.ru/life/prinoshu-svoi-izvineniya/#comments</comments>
		<pubDate>Fri, 14 Mar 2008 11:14:01 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[иван блинков]]></category>
		<category><![CDATA[провайдер]]></category>
		<category><![CDATA[хостинг]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/life/prinoshu-svoi-izvineniya/</guid>
		<description><![CDATA[За достаточно долгосрочную недоступность сайта в связи с тем, что техподдержка благополучно заблокировала хостинг с формулировкой &#171;за превышение нагрузки на сервер&#187;, следствием чего было сообщение об отсутствии доступа 403 Forbidden. Сегодня удалось успешно решить этот вопрос, убрал плагин к WP, который по их мнению был виновен в чрезмерной нагрузке (WP-UserOnline), хостинг разблокирован, надеюсь теперь хостинг-провайдера [...]]]></description>
			<content:encoded><![CDATA[<p>За достаточно долгосрочную недоступность сайта в связи с тем, что техподдержка благополучно заблокировала хостинг с формулировкой &#171;за превышение нагрузки на сервер&#187;, следствием чего было сообщение об отсутствии доступа <em>403 Forbidden</em>.</p>
<p>Сегодня удалось успешно решить этот вопрос, убрал плагин к WP, который по их мнению был виновен в чрезмерной нагрузке (WP-UserOnline), хостинг разблокирован, надеюсь теперь хостинг-провайдера все устроит.</p>
<p>С уважением,<br />
Блинков Иван</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/life/prinoshu-svoi-izvineniya/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Архитектура Amazon</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/#comments</comments>
		<pubDate>Sun, 17 Feb 2008 18:47:49 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Amazon]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Jboss]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Mason]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Oracle]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[REST]]></category>
		<category><![CDATA[Servlet]]></category>
		<category><![CDATA[SOAP]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Amazon]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[информационные технологии]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-amazon/</guid>
		<description><![CDATA[Amazon вырос из крошечной книжной лавки в один из крупнейших магазинов вселенной. Они добились этого благодаря их инновационному подходу к обзорам, рекомендациям и оценке продукции. Источники информации Как и остальные статьи об архитектурах высоконагруженных систем на этом блоге, эта запись представляет собой перевод статьи, автором которой является Todd Hoff. Источниками информации для оригинала послужили: Ранний [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://amazon.com" rel="nofollow" target="_blank">Amazon</a> вырос из крошечной книжной лавки в один из крупнейших магазинов вселенной. Они добились этого благодаря их инновационному подходу к обзорам, рекомендациям и оценке продукции.<br />
<span id="more-45"></span></p>
<h3>Источники информации</h3>
<p><em>Как и <a href="/highload" target="_blank">остальные статьи</a> об архитектурах высоконагруженных систем на <a href="/about" target="_blank">этом блоге</a>, эта запись представляет собой перевод <a href="http://highscalability.com/amazon-architecture" rel="nofollow" target="_blank">статьи</a>, автором которой является <a href="http://highscalability.com/user/todd-hoff" rel="nofollow" target="_blank">Todd Hoff</a>. Источниками информации для оригинала послужили:</em></p>
<ul>
<li><a href="http://glinden.blogspot.com/2006/05/early-amazon-end.html" target="_blank" rel="nofollow">Ранний Amazon</a> от Greg Linden</li>
<li><a href="http://news.com.com/2100-1001-275155.html" target="_blank" rel="nofollow">Как Linux позволил Amazon сэкономить миллионы</a></li>
<li><a href="http://www.se-radio.net/index.php?post_id=157593" target="_blank" rel="nofollow">Интервью с Werner Vogels&#8217;ом</a> &#8212; техническим директором Amazon</li>
<li><a href="http://www.webperformancematters.com/journal/2007/8/21/asynchronous-architectures-4.html" target="_blank" rel="nofollow">Асинхронные архитектуры</a> &#8212; краткий пересказ речи Werner Vogels&#8217;а от Cris Loosley</li>
<li><a href="http://www.acmqueue.com/modules.php?name=Content&#038;pa=showpage&#038;pid=388" target="_blank" rel="nofollow">Познание технологической платформы Amazon</a> &#8212; диалог с Werner Vogels</li>
<li><a href="http://www.allthingsdistributed.com/" target="_blank" rel="nofollow">Блог Werner Vogels&#8217;а</a> &#8212; построение масштабируемых распределенных систем</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/linux" target="_blank">Linux</a></li>
<li><a href="/tag/oracle" target="_blank">Oracle</a></li>
<li><a href="/tag/c" target="_blank">C++</a></li>
<li><a href="/tag/perl" target="_blank">Perl</a></li>
<li><a href="/tag/mason" target="_blank">Mason</a></li>
<li><a href="/tag/java" target="_blank">Java</a></li>
<li><a href="/tag/jboss" target="_blank">Jboss</a></li>
<li><a href="/tag/servlet" target="_blank">Сервлеты</a></li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Более чем 55 миллионов учетных записей активных покупателей.</li>
<li>Более миллиона активных розничных партнеров по всему Миру.</li>
<li>Для построения страницы осуществляется доступ к 100-150 сервисам.</li>
</ul>
<h3>Архитектура</h3>
<ul>
<li>Что мы на самом деле подразумеваем под словом <a href="/tag/masshtabiruemost/" target="_blank">&#171;масштабируемость&#187;</a>? Обычно говорят, что сервис является масштабируемым, если в случае расширения ресурсов системы производительность растет пропорционально. Рост производительности обычно означает увеличение количества выполняемых в единицу времени работ, но с другой стороны он может означать и рост объемов выполняемых работ, например размер обрабатываемых наборов данных.</li>
<li><a href="/tag/amazon" target="_blank">Amazon</a> пришлось претерпеть большое архитектурное преобразование в процессе перехода от двух-уровневой монолитной системы к полностью распределенной децентрализованной платформе для сервисов и приложений.</li>
<li>Все началось с одного приложения, обменивающегося данными с внутренним интерфейсом, написанного на <a href="/tag/c" target="_blank">C++</a>.</li>
<li>Оно росло. За годы усилий, направленных на масштабирование, <a href="/tag/amazon" target="_blank">Amazon</a> сфокусировался на масштабировании <a href="/tag/bd" target="_blank">баз данных</a> для хранения постоянно растущего объема информации о предметах, покупателях, заказах, для поддержки нескольких интернациональных сайтов. В 2001 году стало ясно, что исходное веб-приложение больше не в состоянии <a href="/tag/masshtabiruemost" target="_blank">масштабироваться</a> такими темпами. Базы данных были разбиты на маленькие части и для каждой их них был построен отдельный <a href="/tag/interfejs" target="_blank">интерфейс</a>, выполненный в виде сервиса, который являлся единственным способом получить доступ к данным.</li>
<li><a href="/tag/bd" target="_blank">Базы данных</a> стали общим ресурсом, что затрудняло рост бизнеса в целом. Интерфейсы, связанные с пользователями и базами данных, были сильно ограничены в своей эволюции, так как они одновременно использовались множеством разных команд разработчиков и процессов.</li>
<li>Их <a href="/tag/arkhitektura" target="_blank">архитектура</a> тесно связана и построена вокруг сервисов. Ориентированная на сервисы архитектура дала им необходимый уровень изоляции для построения множества программных компонентов быстро и независимо.</li>
<li>Система выросла до сотен сервисов и не меньшего количества серверов приложений, аггрегирующих информацию, полученную от сервисов. Приложение, генерирующее страницы для <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a>, является одним из таких серверов. То же самое можно сказать и про приложения, служащие в роли интерфейса для Веб-сервисов, сервиса, обслуживающего покупателя, интерфейса для продавцов.</li>
<li>Многие другие <a href="/tag/tekhnologiya" target="_blank">технологии</a> очень трудно масштабировать до размеров <a href="/tag/amazon" target="_blank">Amazon</a>, особенно технологии коммуникационной инфраструктуры. Они отлично работают до какого-то предела в размерах системы, а после перестают справляться с выполнения своих обязанностей. Именно это подтолкнуло <a href="/tag/amazon" target="_blank">Amazon</a> на создание своих <a href="/tag/tekhnologiya" target="_blank">технологий</a> в  этой области.</li>
<li>Не ограничиваясь одним конкретным подходом, некоторые части системы используют <a href="/tag/java" target="_blank">Java</a>/<a href="/tag/jboss" target="_blank">Jboss</a>, но они являются всего лишь <a href="/tag/servlet">сервлетами</a>.</li>
<li><a href="/tag/c" target="_blank">C++</a> используется для обработки запросов, в то время как <a href="/tag/perl" target="_blank">Perl</a> и <a href="/tag/mason" target="_blank">Mason</a> &#8212; для составления контента.</li>
<li><a href="/tag/amazon" target="_blank">Amazon</a> предпочитает не пользоваться промежуточным <a href="/tag/po" target="_blank">программным обеспечением</a>, так как оно в большинстве случаев является каркасом, а не средством разработки. Если используется промежуточное <a href="/tag/po" target="_blank">программное обеспечение</a>, то разработчик становится <em>заперт</em> в использование тех принципов разработки, которые выбрал разработчик промежуточного <a href="/tag/po" target="_blank">ПО</a>. Если появится необходимость использовать какие-либо другие решения, ничего не выйдет &#8212; вы заперты. Один и тот же цикл используется для обработки всех типов событий: сообщений, задержек в передаче данных, <em>AJAX</em>, и так далее. Слишком громоздко. Если бы промежуточное <a href="/tag/po" target="_blank">программное обеспечение</a> было бы доступно в виде более мелких компонентов, скорее на правах средства разработки, чем каркаса для системы, тогда <a href="/tag/amazon" target="_blank">Amazon</a> был бы более заинтересован в нем.</li>
<li>Кажется, что <a href="/tag/soap" target="_blank">SOAP</a> веб стек собирается заново решать все те же проблемы распределенных систем.</li>
<li>Если предложить разработчиком на выбор работу над <a href="/tag/soap" target="_blank">SOAP</a> и <a href="/tag/rest" target="_blank">REST</a> веб-сервисами, то только 30% выберут <a href="/tag/soap" target="_blank">SOAP</a>, это скорее всего будут разработчики на .NET и <a href="/tag/java" target="_blank">Java</a>, привыкшие использовать WSDL файлы для генерации интерфейсов удаленных объектов. Оставшиеся 70% выберут <a href="/tag/rest" target="_blank">REST</a> &#8212; это будут пользователи <a href="/tag/php" target="_blank">PHP</a> и <a href="/tag/perl" target="_blank">Perl</a>.</li>
<li>Обе категории разработчиков имеют возможность получить интерфейс к объектам <a href="/tag/amazon" target="_blank">Amazon</a>. Разработчики заинтересованы просто выполнить свою работу, не заботясь о том, что происходит на другом конце провода.</li>
<li>Идея <a href="/tag/amazon" target="_blank">Amazon</a> заключалась в построении открытого сообщества вокруг своих сервисов. Веб-сервисы были выбраны благодаря своей простоте. Но так это выглядит только снаружи. Внутри же находится архитектура, ориентированная на сервисы. Доступ к данным может быть получен только через соответстыующий <a href="/tag/interfejs" target="_blank">интерфейс</a>. Этот процесс описан в WSDL, но они используют свои собственные механизмы транспортировки и инкапсуляции данных.</li>
<li>Команды разработчиков очень небольшие и организуются вокруг сервисов
<dl>
<dd>&ndash; Сервисы являются независимыми единицами предоставления функционала в рамках <a href="/tag/amazon" target="_blank">Amazon</a></dd>
<dd>&ndash; Если у разработчика возникает новая бизнес-идея или проблема, которую ему хотелось бы решить, он собирает команду для ее решения или реализации. Количество участников ограничено 8-10 людьми. Комманды из такого количества человек обычно называют <em>пиццерийными</em>, так как для того, чтобы ее накормить достаточно двух пицц.</dd>
<dd>&ndash; Команды очень небольшие, но они уполномочены решать поставленную задачу любыми доступными способами, именно так, как они считают нужным.</dd>
<dd>&ndash; В качестве примера задачи, поставленной перед такой командой, может служить поиск фраз в рамках книги, уникальных для конкретного текста.</dd>
<dd>&ndash; Экстенсивное A/B тестирование используется для интеграции новых сервисов. Они смотрят на произведенное влияние на систему и выполняют экстенсивные измерения.</dd>
</dl>
</li>
<li><strong>Развертывание</strong>
<dl>
<dd>&ndash; Они создают специальную инфраструктуру для управления зависимостями и развертывания</dd>
<dd>&ndash; Цель состоит в том, чтобы иметь все необходимые сервисы развернутыми на новом оборудовании, в том числе код приложений, системы мониторинга и лицензирования и так далее.</dd>
<dd>&ndash; Результатом развертывания является виртуальная машина, которая запускается с помощью <strong>EC2</strong>.</dd>
</dl>
</li>
<li>Работа с покупателями для того, чтобы убедиться, что внедрение нового сервиса того стоит
<dl>
<dd>&ndash; Фокусировка на конкретно на тех возможностях, которые планируется предоставить покупателям</dd>
<dd>&ndash; Разработчики принуждаются работать в первую очередь с упором на предоставление пользователям новых возможностей, а не на внедрение новых технологий и уже после этого осознавание того, зачем это делалось</dd>
<dd>&ndash; Все начинается с пресс-релиза о новых возможностях, предоставляемых пользователям, а после чего ведется работа по определению того факта, планировалось ли все же что-то значимое для пользователей или нет?</dd>
<dd>&ndash; Дизайн должен быть минимален. Простота &#8212; залог успеха, когда речь идет о больших распределенных системах</dd>
</dl>
</li>
<li><strong>Управление состояниями, как основная проблема крупномасштабных систем</strong>
<dl>
<dd>&ndash; Изнутри они теоретически могут предоставить практически бесконечный оъем дискового пространства.</dd>
<dd>&ndash; Не все, но многие операции имеют состояния. Например, оформление покупки продукта.</dd>
<dd>&ndash; Сервис отслеживания последних открытых страниц использует рекоммендации, базирующиеся на идентификационных номерах сессий.</dd>
<dd>&ndash; Они следят за всем, так что в любом случае цель вовсе не в поддержании состояний. Достаточно небольшой набор состояний требует поддержания с помощью сессий. Сервисы уже хранят всю необходимую информацию, остается лишь ими воспользоваться.</dd>
</dl>
</li>
<li><strong>Три свойства системы или теорема Eric Brewer&#8217;а:</strong>
<dl>
<dd>&ndash; Три свойства системы: <em>стабильность, доступность, переносимость возможномых распадений сети</em></dd>
<dd>&ndash; В большинстве случаев для любой системы с общими данными выполняются два свойства из трех</dd>
<dd>&ndash; <em>Возможность разделения:</em> распределение узлов по небольшим группам, которые могут иметь доступ к другим группам, но не могут получить доступ к конкретному произвольному узлу системы</dd>
<dd>&ndash; <em>Стабильность:</em> запишите какие-либо данные, а затем прочитайте их же &#8212; получите те же самые данные обратно. Для распределенных систем это далеко не всегда так.</em></dd>
<dd>&ndash; <em>Доступность:</em> не всегда имеется возможность произвести чтение или запись каких-либо данных. Система иногда сообщает, что она не может произвести запись, так как она хочет остаться целостностной.</dd>
<dd>&ndash; Для масштабирования системы необходимо разбиение ее на части, что приводит к выбору между стабильностью и доступностью. Необходимо найти некий баланс между ними.</dd>
<dd>&ndash; Выберите определенный подход в соответствии с нуждами сервиса.</dd>
<dd>&ndash; В процессе выбора продуктов приоритет предоставляется доступности: все запросы на добавление товаров в корзину учитываются, так как именно они приносят прибыль. Даже если возникают какие-либо ошибки, они скрываются от покупателя, и разработчики разбираются с ним позже.</dd>
<dd>&ndash; В процессе подтверждения заказа покупателем важна надежность, так как сразу несколько сервисов одновременно используют одни и те же данные: работа с кредитными картами, доставка, составление отчетов.</dd>
</dl>
</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Для того, чтобы строить реально масштабируемые системы, Вам необходимо изменить свой склад ума. Вероятностный подход к хаосу может принести неплохие результаты. В традиционных системах мы представляем себе идеальный мир, где не происходит никаких чрезвычайных ситуаций, а затем мы в этом же мире пытаемся построить реализацию по-настоящему сложных алгоритмов. При первом же удобном случае вся система гарантированно рушится, это реальность, пора бы уже к этому привыкнуть. Например, неплохим решением мог бы стать подход, использующий быструю перезагрузку и тем самым быстрое восстановление работоспособности. При достаточной избыточности данных и сервисов этот подход может дать практически 100% отказоустойчивость. Необходимо создание самовосстанавливающихся и самоорганизовывающихся операций.</li>
<li>Создание инфраструктуры, в которой компоненты ничего друг с другом не разделяют. Сама инфраструктура может стать общим ресурсом для разработки и развертывания с теми же недостатками, что и совместные ресурсы в логике и на уровне данных. Это может вызвать запирание и блокировку данных. <a href="/tag/arkhitektura" target="_blank">Архитектура</a>, ориентированная на сервисы, позволяет создание параллельных изолированных процессов разработки, позволяющих масштабировать будущие разработки для соответствия темпам роста.
<li>
<li>Откройте систему с помощью собственной API для создания экосистемы вокруг Ваших приложений.</li>
<li>Единственный способ управлять большой распределенной системой &#8212; разрабатывать ее как можно более простой. Это достигается благодаря отсутствию скрытых требований и зависимостей в ее структуре. Минимизируйте использование технологий до того уровня, который Вам необходим для решения конкретно Ваших проблем и задач. Создание дополнительных искуственных и ненужных уровней в системе никогда не пойдет ей на пользу.</li>
<li>Организация вокруг сервисов дает гибкость. Параллельная работа возможна, так как на выходе получается сервис. Этот факт резко сокращает время, необходимое для выхода на рынок. Построение инфраструктуры позволяет сервисам реализовываться очень быстро.</li>
<li>Определенно будут возникать проблемы со всем, что пускает пыль в глаза еще до реальной реализации.</li>
<li>Для внутреннего управления сервисами стоит использовать SLA.</li>
<li>Кто угодно может быстро добавлять веб-сервисы к их продукту. Достаточно лишь реализовать часть продукта в виде сервиса и начать его использовать.</li>
<li>Построение инфраструктуры производится для обеспечения производительности, надежности и контролирования издержек. После ее построения Вы никогда не сможете сказать после очередной неудачи, что в этом виновата компания <em>Х</em>. Ваше <a href="/tag/po" target="_blank">программное обеспечение</a> не всегда является более надежным, чем любой другой, но зато у Вас появляется возможность быстро устранять неполадки и развертывать ее, в отличии от продуктов других компаний.</li>
<li>Используйте систему оценивания и целенаправленные обсуждения для отделения &#171;хорошего&#187; от &#171;плохого&#187;. Бывшие сотрудники <a href="/tag/amazon" target="_blank">Amazon</a> в своих презентациях неоднократно демонстрировали свою глубоко засевшую привычку ставить покупателей перед выбором и смотреть какой из вариантов сработает лучшим образом, и уже на результатах такого рода тестов строить свои решения.
<li><a href="http://www.kaushik.net/avinash/" rel="nofollow" target="_blank">Avinash Kaushik</a> называет это избавлением от &#171;гиппопотамов&#187;, наиболее высоко оплачиваемых людей. Осуществляется оно с помощью A/B тестирований и веб-аналитиков. Если у вас есть выбор пути развития, реализуйте оба, позвольте людям ими пользоваться, и посмотрите какой из альтернативных результатов приведет в лучшим результатам.
<li>
<li>Создайте экономичную культуру. <a href="/tag/amazon" target="_blank">Amazon</a> использовал двери в роли столов, например.</li>
<li>Знайте, что Вам необходимо. <a href="/tag/amazon" target="_blank">Amazon</a> имеет печальный опыт с ранней системой рекомендаций, которая не сработала: &#171;Это было не то, что требовалось <a href="/tag/amazon" target="_blank">Amazon</a>. Рекомендации книг в <a href="/tag/amazon" target="_blank">Amazon</a> требовали работы с разбросанными данными, всего лишь несколько рейтингов или покупок. Она должна работать быстро. Система должна иметь необходимый <a href="/tag/masshtabiruemost" target="_blank">масштаб</a> для работы с массивным количеством клиентов и огромным каталогом. Все, что было необходимо: лишь усовершенствовать обнаружение книг из глубин каталога, откуда читатели не могли достать из самостоятельно.&#187;</li>
<li>Работа в сторонних проектах, просто так как Вы в них заинтересованы, часто является намного более продуктивной и инновационной, чем просто работа за деньги. Никогда не недооценивайте мощь блуждания в той сфере, которая Вам интересна.</li>
<li>Вовлеките всех в производство еды для собак. Пойдите на склад и упаковывайте книги во время рожденственской суеты. Это называется командной работой.</li>
<li>Создайте специальный сайт для тестирования нововведений перед выпуском их в вольное плавание.</li>
<li>Непоколебимая, кластеризованная, реплицирующая, распределенная файловая система является идеальным решением для хранения данных, доступных только для чтения, используемых веб-серверами.</li>
<li>Предусмотрите способы отменить изменения, если обновление не удалось. Если нужно, напишите соответствующие программные средства.</li>
<li>Переключитесь на глубоко <a rel="nofollow target="_blank" "href="http://webservices.sys-con.com/read/262024.htm">сервис-ориентированную архитектуру</a>.</li>
<li>Во время интервью обращайте внимание на три критерия: энтузиазм, креативность, компетентность. Самым крупным залогом успеха <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a> был энтузиазм.</li>
<li>Наймите Боба, кого-то кто знает свое дело, обладает невероятными способностями и знанием системы, и что самое важное, умеет решать даже самые невообразимые проблемы просто нырнув в них с головой.</li>
<li>Инновация может прийти только снизу. Те, кто находится ближе всего к проблеме, являются наиболее вероятными людьми, кто смог бы ее решить. Любая организация, зависящая от инноваций, должна уметь пользоваться хаосом. Лояльность и подчинение &#8212; не наш метод.</li>
<li>Креативность должна лезть из всех щелей.</li>
<li>У всех должна быть возможность эксперементировать и учиться. Позиции, подчинение и традиции не должны играть какой-либо роли. Для процветания инновации балом должен править точный расчет.</li>
<li>Выберите путь инноваций. Перед лицом всей компании, Jeff Bezos может дать старый кроссовок Nike в роли награды &#171;Просто сделай это&#187; тому, кто привнес инновацию.</li>
<li>Не платите за производительность. Предоставьте хороший повод задрать нос и высокую оплату труда, но оставляйте это простым. Распознать выдающуюся работу можно и другими методами. Оплата по заслугам звучит неплохо, но в условиях большой организации это практически невозможно. Используйте не-денежные награды, такие как тот старый кроссовок. Если преподнести это как способ сказать спасибо, кто-то оценит.</li>
<li>Вырастайте быстро. Большие парни вроде Barnes и Nobel у Вас на хвосте. <a href="/tag/amazon" target="_blank">Amazon</a> не был ни первым, ни вторым, ни даже третим книжным магазинам в <a href="/tag/internet" target="_blank">Сети</a>, но их взгляд на работу и драйв в итоге позволили им вырваться вперед.</li>
<li>В дата-центрах персонал проводит только 30% времени в работе над вопросами создания инфраструктуры, остальные 70% они проводят за размещения поставок тяжелого оборудования, управлением программным обеспечением, балансировкой нагрузок, техническими работами, изменениями в масштабе и так далее.</li>
<li>Запретите клиентам прямой доступ к базе данных. Это значит появление возможность масштабировать сервис и делать его более надежным не вовлекая при этом клиентов. Это очень похоже на возможность Google независимо вносить улучшения в части системы, что приводит к улучшениям в работе всех остальных ее компонентов.</li>
<li>Создайте единый универсальный механизм получения доступа к сервисам. Это позволяет более легко аггрегировать информацию, полученную от сервисов, децентрализованно прокладывать маршруты передачи запросов, распределенно следить за ними, а также получать доступ к другим инфраструктурным механизмам.</li>
<li>Предоставление свободного доступа ко всем сервисам <a href="http://amazon.com" target="_blank" rel="nofollow">Amazon.com</a> разработчикам со всех уголков Мира также было достаточно значимым компонентом успеха, так как это привлекло на порядок больше инноваций, чем они могли надеяться построить самостоятельно.</li>
<li>Разработчики сами знают какими инструментами они владеют лучше всего, какие из них делают их наиболее продуктивными.</li>
<li>Не накладывайте слишком много ограничений на инженеров. Предоставляйте стимулы для использования некоторых вещей, например интеграцию с системами мониторинга и другими инструментами инфраструктуры. Для всего остального старайтесь предоставлять возможность командам функционировать максимально независимо.</li>
<li>Разработчики, они как художники; они делают свою работу лучше всего только тогда, когда им предоставляют свободу это делать, но в любом случае им требуются качественные инструменты. Имейте много вспомогательных инструментов, имеющих само-помогающую природу. Поддерживайте окружение вокруг разработки сервисов, которое никогда не будет вмешиваться в сам процесс разработки.</li>
<li>Вы построили это, вы и поддерживаете. Это позволяет разработчикам почувствовать повседневную работу их приложения, а также предоставляет им постоянный контакт с покупателями.</li>
<li>Раз в пару лет разработчики должны проводить некоторое время в отделе по работе с клиентами. Это позволит им выслушать покупателей, ответить на электронные письма, и реально осознать влияние тех вещей, которые они реализовали с помощью как технологи.</li>
<li>Пользуйтесь &#171;голосом покупателя&#187;, который являлся бы реалистичной историей от покупателя о какой-то конкретной части сайта. Это поможет менеджерам и инженерам осознать тот факт, что все эти технологии построены для реальных людей. Статистика отдела по работе с клиентами является ранним индикатором того, что вы делаете что-то не так, а также указывает на то, что реально является болевыми точками для ваших покупателей.</li>
<li>Инфраструктура <a href="/tag/amazon" target="_blank">Amazon</a>, подобно <a href="/tag/google" target="_blank">Google</a>, является огромным конкурентным преимуществом. Они могут строить комплексные приложения на основе примитивных сервисов, которые сами по себе просты до безобразия. Они могут независимо масштабировать свою работу, поддерживать доступность не распараллеленной системы, быстро реализовывать новые сервисы без необходимости массивных изменений в конфигурации.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-amazon/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Отношения online</title>
		<link>http://www.insight-it.ru/set/mikroformaty/otnosheniya-online/</link>
		<comments>http://www.insight-it.ru/set/mikroformaty/otnosheniya-online/#comments</comments>
		<pubDate>Sat, 16 Feb 2008 10:07:27 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Микроформаты]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[xfn]]></category>
		<category><![CDATA[XHTML]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[семантика]]></category>
		<category><![CDATA[Сеть]]></category>
		<category><![CDATA[технология]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/microformats/otnosheniya-online/</guid>
		<description><![CDATA[Допустим, у Вас появилось желание оставить на своем интернет-ресурсе ссылку на сайт своего старого друга. Объяснить этот факт простому читателю достаточно просто: &#60;a&#160;href=&#34;www.site.ru&#34;&#62;Сайт&#160;моего&#160;друга&#60;/a&#62;, но поймет ли такую надпись очередной раз инспектирующий Ваш сайт crawler какой-нибудь поисковой системы? Может быть Вы просто злостно торгуете ссылками со своего сайта? Как Вы могли уже догадаться, для решения этой [...]]]></description>
			<content:encoded><![CDATA[<p>Допустим, у Вас появилось желание оставить на своем интернет-ресурсе ссылку на сайт своего старого друга. Объяснить этот факт простому читателю достаточно просто: <strong>&lt;a&nbsp;href=&quot;www.site.ru&quot;&gt;Сайт&nbsp;моего&nbsp;друга&lt;/a&gt;</strong>, но поймет ли такую надпись очередной раз инспектирующий Ваш сайт <a href="/tag/crawler" taret="_blank">crawler</a> какой-нибудь поисковой системы? Может быть Вы просто злостно торгуете ссылками со своего сайта?<br />
<span id="more-43"></span><br />
Как Вы могли уже догадаться, для решения этой достаточно узкоспециализированной задачи &#8212; выражение отношений с владельцем сайта, на который указывает ссылка &#8212; существует специальный <a href="/net/xhtml/mikroformaty/" target="_blank">микроформат</a> под названием <a href="/tag/xfn" target="_blank"><strong>XFN</strong></a>, что расшифровывается как <em>XHTML Friends Network</em>. С его помощью любой человек, у которого есть сайт может продемонстрировать всем желающим в каких отношениях он находится с владельцем сайта, на который он ссылается.</p>
<p>Реализуется этот микроформат с помощью атрибута <strong>rel</strong> тэга <strong>&lt;a&gt;</strong>, возможные варианты значения (имеется возможность их комбинировать):</p>
<table summary="Значения атрибута rel, используемые в микроформате XFN." border="1" cellspacing="0" style="padding: 1px; width: 100%;">
<thead>
<tr>
<th>Категории значений</th>
<td><strong><em>Значения XFN</em></strong></td>
</tr>
</thead>
<tbody>
<tr>
<th>дружба:</th>
<td>
 <code title="кто-либо, кого Вы считаете другом."><strong>friend</strong></code> <code title="знакомый, просто пару раз здоровались или недолго общались."><strong>acquaintance</strong></code> <code title="кто-либо, с кем Вы знаете как связаться в случае необходимости."><strong>contact</strong></code></td>
</tr>
<tr>
<th>физические:</th>
<td><code title="кто-либо, с кем вы когда-то лично встречались."><strong>met</strong></code></td>
</tr>
<tr>
<th>профессиональные:</th>
<td><code title="коллега по работе."><strong>co-worker</strong></code>&nbsp;<code title="коллега по учебе или иной форме активности."><strong>colleague</strong></code>
</td>
</tr>
<tr>
<th>географические:</th>
<td><code title="живете на одной улице."><strong>co-resident</strong></code>&nbsp;<code title="сосед."><strong>neighbor</strong></code></td>
</tr>
<tr>
<th>семейные:</th>
<td><code title="ребенок (в том числе и приемные)."><strong>child</strong></code>&nbsp;<code title="родители (в том числе и приемные)."><strong>parent</strong></code>&nbsp;<code title="все братья и сетры."><strong>sibling</strong></code>&nbsp;<code title="муж/жена."><strong>spouse</strong></code><br />
 <code title="дальний родственник."><strong>kin</strong></code></td>
</tr>
<tr>
<th>романтические:</th>
<td><code title="муза, источник вдохновения."><strong>muse</strong></code>&nbsp;<code title="Кто-либо, к кому у Вас страстное увлечение."><strong>crush</strong></code>&nbsp;<code title="Кто-либо, с кем Вы встречаетесь."><strong>date</strong></code>&nbsp;<code title="Кто-либо, в кого Вы влюбились"><strong>sweetheart</strong></code></td>
</tr>
<tr>
<th>личность:</th>
<td><code title="Ссылка на самого себя на другом сайте. Обязательно должна быть симметрична. Отношение 'me' неявно подразумевается между поддиректорией и всем ее содержимым."><strong>me</strong></code></td>
</tr>
</tbody>
</table>
<p>Как не трудно заметить, практически все возможные варианты отношений могут быть описаны одним из значений или их комбинацией. Наш пример из начала этого поста с использованием XFN выглядел бы: <strong>&lt;a&nbsp;href=&quot;www.site.ru&quot;&nbsp;rel=&quot;friend&nbsp;met&quot;&gt;Сайт&nbsp;моего&nbsp;друга&lt;/a&gt;</strong></p>
<p>Помимо этого есть еще один маленький нюанс, необходимый для того, чтобы browser&#8217;ы и поисковые системы знали, что данная страница оффциально поддерживает этот микроформат, для этого необходимо указать следующий атрибут тэгу <strong>&lt;head&gt;</strong>:</p>
<p><code>&lt;head profile=&quot;http://gmpg.org/xfn/11&quot;&gt;</code></p>
<p>Этот пост был написан по мотивам <a href="http://www.gmpg.org/xfn/" target="_blank" rel="nofollow">оффициального сайта XFN</a>, если Вас заинтересовал этот микроформат, возможно имеет смысл посетить и его: там можно найти FAQ, утилиты для автоматической генерации кода, а также всю остальную информацию по данному микроформату (на английском естественно).</p>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/set/mikroformaty/otnosheniya-online/feed/</wfw:commentRss>
		<slash:comments>15</slash:comments>
		</item>
		<item>
		<title>Архитектура Flickr</title>
		<link>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/</link>
		<comments>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/#comments</comments>
		<pubDate>Fri, 08 Feb 2008 19:41:28 +0000</pubDate>
		<dc:creator>Иван Блинков</dc:creator>
				<category><![CDATA[Масштабируемость]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Cvsup]]></category>
		<category><![CDATA[flickr]]></category>
		<category><![CDATA[Ganglia]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[online]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[RedHat]]></category>
		<category><![CDATA[shard]]></category>
		<category><![CDATA[Smarty]]></category>
		<category><![CDATA[Squid]]></category>
		<category><![CDATA[Subcon]]></category>
		<category><![CDATA[SystemImager]]></category>
		<category><![CDATA[архитектура]]></category>
		<category><![CDATA[архитектура Flickr]]></category>
		<category><![CDATA[интернет]]></category>
		<category><![CDATA[кластер]]></category>
		<category><![CDATA[сервер]]></category>

		<guid isPermaLink="false">http://www.insight-it.ru/net/scalability/arkhitektura-flickr/</guid>
		<description><![CDATA[Flickr является мировым лидером среди сайтов размещения фотографий. Перед Flickr стоит впечатляющая задача, они должны контролировать обширное море ежесекундно обновляющегося контента, непрерывно пополняющиеся легионы пользователей, постоянный поток новых предоставляемых пользователям возможностей, а делается все это при постоянной поддержке отличной производительности. Как же они это делают? Источники информации Как и предыдущий пост &#171;Архитектура Google&#187;, этот тоже [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com" rel="nofollow" target="_blank">Flickr</a> является мировым лидером среди сайтов размещения фотографий. Перед Flickr стоит впечатляющая задача, они должны контролировать обширное море ежесекундно обновляющегося контента, непрерывно пополняющиеся легионы пользователей, постоянный поток новых предоставляемых пользователям возможностей, а делается все это при постоянной поддержке  отличной производительности. Как же они это делают?<br />
<span id="more-37"></span></p>
<h3>Источники информации</h3>
<p><em>Как и предыдущий пост <a href="/net/scalability/arkhitektura-google" target="_blank">&#171;Архитектура Google&#187;</a>, этот тоже является переводом <a href="http://highscalability.com/flickr-architecture" target="_blank" rel="nofollow">статьи</a> от <a href="http://highscalability.com/user/todd-hoff" target="_blank" rel="nofollow">Todd&#8217;а Hoff&#8217;а</a>. Возможно читателям <a href="/tag/google" target="_blank">Google</a> был более интересен, но подход Flickr к масштабируемости тоже более чем заслуживает внимания. Далее привожу источники информации из оригинальной статьи:</em></p>
<ul>
<li><a href="http://www.niallkennedy.com/blog/uploads/flickr_php.pdf" rel="nofollow" target="_blank">Flickr и PHP</a> (ранний документ)</li>
<li>Планирование нагрузок на LAMP</li>
<li><a href="http://www.bytebot.net/blog/archives/2007/04/25/federation-at-flickr-a-tour-of-the-flickr-architecture" rel="nofollow" target="_blank">Федерация Flickr: Тур по архитектуре Flickr</a></li>
<li><a href="http://highscalability.com/book-building-scalable-web-sites" rel="nofollow" target="_blank">Построение масштабируемых веб-сайтов</a> от Call Handerson&#8217;а из Flickr</li>
<li>История войн баз данных #3: Tim O&#8217;Reilly о Flickr</li>
<li><a href="http://www.iamcal.com/talks/" rel="nofollow" target="_blank">Cal Henderson&#8217;s Talks</a> &#8212; много полезных презентаций</li>
</ul>
<h3>Платформа</h3>
<ul>
<li><a href="/tag/php" target="_blank">PHP</a></li>
<li><a href="/tag/sql" target="_blank">MySQL</a></li>
<li>Сегментирование <em>(прим.: разбиение системы на части, обслуживающие каждая свою группу пользователей; называть можно было по-разному, но давайте остановимся на этом варианте перевода слова &#171;Shards&#187;)</em></li>
<li><a href="/tag/memcached" target="_blank">Memcached</a> для кэширования</li>
<li><a href="/tag/squid" target="_blank">Squid</a> в качестве обратной-прокси для html и изображений</li>
<li><a href="/linux" target="_blank">Linux</a> (<a href="/tag/redhat" target="_blank">RedHat</a>)</li>
<li><a href="/tag/smarty" target="_blank">Smarty</a> в роли шаблонизатора</li>
<li><a href="/tag/perl" target="_blank">Perl</a></li>
<li>PEAR для парсинга e-mail и XML</li>
<li>ImageMagick для обработки изображений</li>
<li><a href="/tag/java" target="_blank">Java</a> для узлового сервиса</li>
<li><a href="/tag/apache">Apache</a></li>
<li><a href="/tag/systemimager" target="_blank">SystemImager</a> для развертывания систем</li>
<li><a href="/tag/ganglia" target="_blank">Ganglia</a> для мониторинга распределенных систем</li>
<li><a href="/tag/subcon" target="_blank">Subcon</a> хранит важные системные конфигурационные файлы в SVN-репозитории для легкого развертывания на машины в кластере.</li>
<li><a href="/tag/cvsup" target="_blank">Cvsup</a> для распространения и обновления коллекций файлов по сети</li>
</ul>
<h3>Статистика</h3>
<ul>
<li>Более четырех миллиардов запросов в день</li>
<li>Примерно 35 миллионов фотографий в кэше <a href="/tag/squid" target="_blank">Squid</a></li>
<li>Около двух миллионов фотографий в оперативной памяти <a href="/tag/squid" target="_blank">Squid</a></li>
<li>Всего приблизительно 470 миллионов изображений, каждое представлено в 4 или 5 размерах</li>
<li>38 тысяч запросов к <a href="/tag/memcached" target="_blank">memcached</a> (12 миллионов объектов)</li>
<li>2 петабайта дискового пространства</li>
<li>Более 400000 фотографий добавляются ежедневно</li>
</ul>
<h3>Архитектура</h3>
<p>Симпатичное изображение архитектуры Flickr можно увидеть на <a href="http://www.slideshare.net/techdude/scalable-web-architectures-common-patterns-and-approaches/138" target="_blank" rel="nofollow">этом слайде</a>. Краткое ее описание выглядит следующим образом:<br />
–– Два ServerIron<br />
–––– <a href="/tag/squid" target="_blank">Squid</a> кэши<br />
–––––– Системы хранения NetApp<br />
–––– Серверы <a href="/tag/php" target="_blank">PHP</a>-приложений<br />
–––––– Менеджер хранения данных<br />
–––––– Master-master сегменты<br />
–––––– Центральная база данных, структурированная по принципу Dual Tree<br />
–––––– <a href="/tag/memcached" target="_blank">Memcached</a> кластер<br />
–––––– Поисковая система</p>
<dl> </dl>
<dl>
<dd>– Структура Dual Tree является индивидуальным набором модификаций для <a href="/tag/sql" target="_blank">MySQL</a>, позволяющим масштабировать систему путем добавления новых мастер-серверов без использования кольцевой архитектуры. Эта система позволяет экономить на масштабировании, так как варианты мастер-мастер требовали бы удвоенных вложений в оборудование.</dd>
</dl>
<dl>
<dd>– Центральная база данных включает в себя таблицу пользователей, состоящую из основных ключей пользователей (несколько уникальных идентификационных номеров) и указатель на сегмент, на котором может быть найдена остальная информация о конкретном пользователе.</dd>
</dl>
<ul>
<li>Использование выделенных серверов для статического контента</li>
<li>Все, за исключением фотографий, хранится в базе данных</li>
<li>Отсутствие состояний заключается в том, что в случае необходимости они имеют возможность передать пользователей от сервера к серверу, что стало намного проще для них после создания своего API</li>
<li>В основе масштабируемости лежит репликация, но этот факт помогает лишь при обработке операций чтения</li>
<li>Для поиска по определенной части базы данных создается отдельная копия этого фрагмента</li>
<li>Использования горизонтального масштабирования для того чтобы можно было проще добавлять новые машины в систему</li>
<li>Обработка изображений, полученных от пользователей по электронной почте, происходит с помощью <a href="/tag/php" target="_blank">PHP</a></li>
<li>Раньше система страдала от задержек связанных с организацией по принципу мастер-слуга. При слишком большой нагрузке они имели одну точку, которая теоретически могла дать сбой.</li>
<li>Им было необходимо иметь возможность проводить технические работы во время непрерывной работы сайта, не прекращая его функционирование.</li>
<li>Были проведены отличные работы по планированию распределения дискового пространства, более подробную информацию можно найти по ссылкам в разделе &#171;Источники информации&#187;.</li>
<li>Для обеспечения возможности масштабирования в будущем, они пошли по федеративному пути развития:
<dl>
<dd>– <em>Сегменты системы:</em> Мои данные хранятся на моем сегменте, но запись о Вашем комментарии хранится на Вашем сегменте.</dd>
<dd>– <em>Глобальное кольцо:</em> Принцип работы схож с DNS, Вам необходимо знать куда Вы хотите пойти и кто контролирует то место, куда Вы собираетесь пойти.</dd>
<dd>– Логика на <a href="/tag/php" target="_blank">PHP</a> устанавливает соединение с сегментом и поддерживает целостность данных (10 строк кода с комментариями!)</dd>
</dl>
</li>
<li><strong>Сегменты:</strong>
<dl>
<dd>– Срез основной базы данных</dd>
<dd>– Активная репликация по принципу мастер-мастер: имеет несколько недостатков в <a href="/tag/sql" target="_blank">MySQL</a> 4.1. Автоматическое инкрементирование идентификационных номеров используется для поддержания системы в режиме одновременной активности обоих серверов в паре</dd>
<dd>– Привязывание новых учетных записей к сегментам системы происходит случайным образом</dd>
<dd>– Миграция пользователей проводится время от времени для того, чтобы избавиться от проблем, связанных с излишне активными пользователями. Необходима сбалансированность в этом процессе, особенно в случаях с большим количеством фотографий… 192 тысячи фотографий, 700 тысяч тэгов, может занять несколько минут. Миграция выполняется вручную.</dd>
</dl>
</li>
<li>Нажатие на <strong>Favorite</strong>:
<dl>
<dd>– Получается информация об учетной записи владельца из кэша для того, чтобы узнать к какому сегменту он привязан (допустим на shard-5)</dd>
<dd>– Получается информация о моей учетной записи из кэша, более конкретно &#8212;  мой сегмент (например shard-13) </dd>
<dd>– Начинается &#171;распределенная трансакция&#187; для определения ответов на вопросы: Кто добавил эту фотографию в избранное? Как изменился список избранных фотографий?</dd>
</dl>
</li>
<li>Подобные вопросы могут задаваться любому сегменту, информация на них абсолютно избыточна.</li>
<li>Для избавления от задержек, связанных с репликацией&#8230;
<dl>
<dd>– при каждой загрузке страницы, пользователю предоставляется список серверов</dd>
<dd>– если сервер не в состоянии ответить на запрос, запрос переходит к следующему серверу в списке; если список кончился &#8212; выводится сообщение об ошибке. При этом не используются постоянные соединения, каждый раз создаются и разрываются новые соединения.</dd>
</dl>
</li>
<li>Запросы на чтение и запись от каждого пользователя ограничиваются рамками одного сегмента. Задержки репликации исчезают из поля зрения пользователей.</li>
<li>Каждый сервер в рамках одного сегмента в обычном состоянии нагружен ровно на половину. Выключите половину серверов в каждом сегменте и система продолжит функционировать без изменений. Это значит, что один сервер внутри сегмента может взять на себя всю нагрузку второго, в то время как второй сервер может по каким либо причинам быть отключен от системы, например для проведения технических работ. Обновление оборудования производится очень просто: отключается половина сегмента, она же обновляется, подключается обратно, процесс повторяется для оставшейся половины.</li>
<li>Периоды пиковой нагрузки также нарушают правило 50% нагрузки. В такие моменты система получает 6-7 тысяч запросов в секунду, в то время как на данный момент система может работать на пятидесятипроцентном уровне нагрузки только при четырех тысячах запросов в секунду.</li>
<li>В среднем при загрузке одной страницы выполняется 27-35 SQL-запросов. Списки избранных фотографий обрабатываются в реальном времени, ровно как и доступ через API к базе данных. Все требования к нагрузке в реальном времени выполняются без каких-либо недостатков.</li>
<li>Более 36 тысяч запросов в секунду может выполняться не выходя за рамки возможностей системы, даже при резком росте трафика.</li>
<li>Каждый сегмент содержит данные о более чем 400 тысячах пользователей.
<dl>
<dd>– Многие данные хранятся в двух местах одновременно. Например, комментарий является частью между комментатором и автором комментируемого контента. Где его хранить? Как насчет обоих мест? Трансакции используются для предотвращения рассинхронизации данных: открывается первая трансакция, выполняется запись, открывается вторая трансакция, выполняется запись, подтверждается первая трансакция если все нормально, после чего вторая подтверждается только в случае  если первая прошла успешно.</dd>
</dl>
</li>
<li><strong>Поиск:</strong>
<dl>
<dd>- Используется два варианта поиска: поиск в рамках сегмента, поддерживающий до 35 тысяч запросов в секунду, а также проприетарный веб-поиск от Yahoo!</dd>
<dd>- В 90% случаев используется система от Yahoo!, за исключением поиска по тэгу фотографий одного пользователя и массовых изменений тэгов.</dd>
<dd>- Эту систему стоит рассматривать как аналог Lucene.</dd>
</dl>
</li>
<li><strong>Оборудование:</strong>
<dl>
<dd>- EMT64 под управлением RHEL 4 с 16 Gb оперативной памяти.</dd>
<dd>- 6 жестких дисков с 15000rpm, объединены в RAID-10.</dd>
<dd>- Размер для пользовательских метаданных достигает 12 терабайт (это не включает фотографии, для них цифры существенно больше).</dd>
<dd>- Используются 2U корпуса.</dd>
</dl>
</li>
<li><strong>Процедура резервного копирования данных:</strong>
<dl>
<dd>- ibbackup выполняется регулярно посредством cron daemon&#8217;а, на каждом сегменте настроен на разное время.</dd>
<dd>- Каждую ночь делается снимок со всего кластера баз данных.</dd>
<dd>- Запись или удаление нескольких больших файлов с резервными копиями одновременно на реплицирующую систему хранения может сильно сократить производительность системы вцелом на последующие несколько часов из-за процесса репликации. Выполнение этого на активно работающей системе хранения фотографий было бы не самой лучшей идеей.</dd>
<dd>- Содержание нескольких резервных копий всех Ваших данных требует существенных материальных затрат, но оно того стоит. Особенно это актуально для тех ситуаций, когда Вы понимаете, что что-то пошло не так только спустя несколько  дней после того как это случилось, в таких случаях неплохо иметь, например, резервные копии 1, 3, 10 и 30-дневной давности.</dd>
</dl>
</li>
<li>Фотографии хранятся в системе хранения данных. После загрузки изображения система выдает различные его размеры, на чем ее работа заканчивается. Метаданные и ссылки на файловые системы, где расположены фотографии, хранятся в базе данных.</li>
<li>Аггрегация данных проходит очень быстро, так как она ограничена пределами сегмента.</li>
<li>max_connections = 400 соединений на каждый сегмент, неплохой запас. Значение для кэша потоков установлено равным 45, так как не бывает ситуаций когда более 45 пользователей одновременно выполняют какие-либо действия с одним конкретным сегментом.</li>
<li><strong>Тэги:</strong>
<dl>
<dd>- Тэги плохо вписываются в традиционную нормализованную схему реляционной базы данных. Денормализация или активное кэширование &#8212; единственные способы сгенерировать облако меток для сотен миллионов тэгов в течении миллисекунд.</dd>
<dd>Некоторые данные обрабатываются отдельными вычислительными кластерами, которые сохраняют результаты своей работы в MySQL, так как иначе вычисление сложных отношений заняло бы все процессорное время основных серверов баз данных.</dd>
</dl>
</li>
<li>Направления для развития: ускорение работы с помощью создания организационного плана для непрерывной работы всей системы на уровне нескольких датацентров, таким образом чтобы все датацентры имели возможность получать запросы на общий уровень данных (как сами БД, так и memcache и прочее) все вместе одновременно. Если все части системы постоянно активны &#8212; время простоя оборудования будет сведено к минимуму.</li>
</ul>
<h3>Подводим итоги</h3>
<ul>
<li>Старайтесь думть о своем приложении как о чем-то большем, чем просто веб-приложении, тогда у Вас возможно появятся поддержка различных API, RSS и Atom ленты и многие другие возможности.</li>
<li>Отсутствие состояний системы позволяет более  легко выполнять модернизации не моргнув и глазом.</li>
<li>Реструктуризация базы данных &#8212; не самое лучшее занятие.</li>
<li>Планирование нагрузок должно проводиться уже на ранних этапах развития проекта</li>
<li>Начинайте медленно. Не покупайте сразу много оборудования просто из-за того, что Вы рады/боитесь, что ваш сайт взорвется.</li>
<li>Измеряйте реально, планирование нагрузок должно базироваться на реальных вещах, а не абстрактных.</li>
<li>Внедряйте ведение логов и индивидуальные измерения для оценки реальных показателей на основе серверной статистики, статистика использования не менее важна чем серверная.</li>
<li>Кэширование и оперативная память может стать ответом на все вопросы.</li>
<li>Создавайте четкие уровни абстракции между работой базы данных, бизнес-логикой, логикой страниц, разметкой страниц и презентационным уровнем. Это позволяет ускорить циклы итеративной разработки.</li>
<li>Разделение приложения на уровни позволяет каждому заниматься своим делом: разработчики могут строить логику страниц, в то время как дизайнеры работают с удобством работы для пользователей.</li>
<li>Делайте релизы как можно чаще, пускай даже это будет происходить каждые полчаса.</li>
<li>Забудьте о всех небольших эффективных вещах, предварительная оптимизация является корнем всего зла в примерно 97% всех случаев.</li>
<li>Тестируйте в работе. Постройте архитектурные механизмы (флаги конфигурации, балансировку нагрузки, и так далее), которые позволят Вам разворачивать новое оборудование в (и из) работу.</li>
<li>Забудьте об искусственных тестах, они годятся только для получения общего представления о нагрузках, но не для планирования. Искуственные тесты дают искусственные результаты, для настоящих тестов все же стоит пользоваться реальным временем выполнения задач.</li>
<li>Найдите максимальное значения для всех показателей:
<dl>
<dd>- Какой максимум чего-то, что может выполнять каждый сервер?</dd>
<dd>- Как близко параметр находится к максимуму и каковы тенденции?</dd>
<dd>- <a href="/tag/sql" target="_blank">MySQL</a> (дисковый ввод/вывод?)</dd>
<dd>- <a href="/tag/squid" target="_blank">Squid</a> (дисковый ввод/вывод? или процессорное время?)</dd>
<dd>- <a href="/tag/memcached" target="_blank">Memcached</a> (процессорное время? или пропускная способность сети?)</dd>
</dl>
</li>
<li>Старайтесь учесть особенности использования Вашего приложения.
<dl>
<dd>- Возможен ли резкий рост нагрузки, связанный с каким-либо событием? Например: какое-либо бедствие, или может быть новость?</dd>
<dd>- Flickr получает на 20-40% больше новых фотографий в первый рабочий день нового года, чем в любой пик в предыдущем году.</dd>
<dd>- По воскресеньям нагрузка в среднем на 40-50% выше, чем в любой другой день недели.</dd>
</dl>
</li>
<li>Учтите возможность экспонентациального роста. Больше пользователей означает больше контента, больше контента означает больше соединений, больше соединений означает более активное использование.</li>
<li>Планируйте возможные варианты управления работой системы в периоды пиковых нагрузок.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.insight-it.ru/masshtabiruemost/arkhitektura-flickr/feed/</wfw:commentRss>
		<slash:comments>41</slash:comments>
		</item>
	</channel>
</rss>

