Category Archives: Web

Обо всём, что связано с WEB технологиями и мной

Особенности Литовского Load Balancing

Так как тема Load Balancing мне сейчас очень актуальна, я иногда посматриваю на большие Литовские проекты со стороны пользователя и задумываюсь, что они делают. Хотя, может это и не особенности местного Load Balancing, но я уже второй раз встречаю такое решение на довольно популярном проекте. Если кто знает в других местах подобные модели, или причины – пишите в коммнетарии, мне очень интересно.

Сейчас в ЛитНете очень популярен один проект, клон YouTube.com – маленький Литовский videogaga.lt. О нём сейчас пишут в Литовский блогах, писают кипятком, так как он очень вовремя появился в Литве и позволил незнающим английского легко загружать своё видео в интернет и делиться с друзьями. Ах, как хорошо.

Я совсем не знаю что у них на “в заде”, но вот с переди кажется, что они пошли не тем путём. Придя на www.videogaga.lt вас перенаправят на www1.videogaga.lt, ещё есть www2.videogaga.lt, www3.videogaga.lt, www4.videogaga.lt (у всех разные внешние IP). Если я правильно понял, они при помощи 4 субдоменов и редиректов распределяют нагрузку.

Похожим путём пошли и всем в прибалтике известные one.lt, причём задолго до videogaga.lt. Куча серверов,внешние редиректы и всё зависит от удачи – повезёт, попадёш на незагруженный сервер, не повезёт – будешь ждать ответов (по крайней мере так говорят пользователи). Я не в курсе конечно отношений и производителей, но у меня есть ощущение, что всё делала одна и таже контора.

Хотя я могу быть и не прав в своих домыслах и все эти субдомены предназначены для других целей?

Вот такие особенности я заметил…
Я вот не понимаю, почему суб-домены, почему дублируется содержание? Почему в переди не поставлен распределящий нагрузку proxy, как это сделано у Google (хотя хер знает как там, но главное что все мы ходим через www.google.com а не через www1.google.com, www2.google.com, … www1024.google.com) или на том-же flickr.com или YouTube.com? Нет, я согласен – статическое содержание может отдавать ферма под другим субдоменом (как у flickr.com), но основное и динамическое содержимое всегда как-бы должно с одного домена идти. Но всё-же зачем субдомены и редиректы? Почему?

А вот и ссылочка, кстати. Оба проекта стоят на сервере Resin/2.1.6. В Google по запросу Resin на первом месте сайт caucho.com. Оказывается какой-то хитрый HTTP сервер, который high-performance с load balancing. Нужно будет расковырять его, посмотреть что он, как он и зачем он.

Исследования Load Balancing и Performance для сайтов

Если кого-то волнует, куда я пропал и почему так затих – всё очень просто – я ушёл в работу.

На этой и прошлой неделе моей любимой темой был Load Balancing.

За это время я успел познакомиться с возможностями Lighttpd и его mod_cache, mod_proxy, mod_proxy_core, поставить FreeBSD, на нём закрутить Lighttpd + PHP под FastCGI. Кроме того пересмотрел nginx и его ngx_http_upstream и взглянул на Apache 2.2 с его mod_proxy и mod_proxy_balancer.

Больше всего мне понравились Lighttpd и Apache 2.2. Жаль, вот только, что Apache – это жирноватая корова по сравнения с Lighttpd, а с Lighttpd пугает его свойство зависать на огромной загрузке, и не ясно, избавились ли от него; и очень огорчил mod_cache у Lighttpd – я думал это полноценный модуль, а это ужасных хак. Этот хак не входит ни в одну стандартную постановку моего любимого FreeBSD, а ведь та простота, с которой можно организовать кеширование манит. mod_proxy_balancer доступен только от версии 1.5, а она ещё не признана стабильной, а возможностей у него куда больше, чем у mod_proxy.

Вообще, чти я скажу – ситуация в выборе ПО для Load Balancing на уровне HTTP отличная – выбор есть, нет ничего сложного в реализации, главное выбрать определённую платформу. В ближайшие месяцы я уже наверное смогу сказать, что выбрано и как себя ведёт.

Ещё, что касается Load Balancing – так пересмотрел в MySQL как работает Replication и даже дома собрал небольшую модель из одного мастера и 3 слейвов, посмотрел как всё запускается, как реплицируются данные, как ведёт себя сервер после падения на короткий срок и восстановления работоспособности.

Кстати, MySQL выпустил интересное начинание: MySQL Proxy. Если к версии 1.0.0 она была-бы стабильная, отлично поддерживала балансирование и кешинг, плюс возможность задать read-only и write-only сервера, да и документации сопровождающей много с примерами – получилась бы отличное решение для загруженных систем.

Ещё в исследование входило общее поднятие Performance у сайта.

За всё время ещё не мало перечитал дополнительной литературы (блоги, статьи, касты разные) по MySQL, оптимизации запросов, планировании индексов, их использовании, оптимизации запросов со стороны MySQL. В Google Reader было добавлено не мало ресурсов связанных как с оптимизацией MySQL, так и на темы Load Balancing. Так-же в этой теме очень сильно помогают разные тесты на средних и больших кол-вах данных. Не раз запускался ab – Apache HTTP server benchmarking tool, который позволял сравнить время работы разных запросов к тем-же данным с/без индексов и прочих мелких условиях.

Continue reading →

Почему мне начинает нравится Zend Framework и PHP

  1. Мне нравиться PHP
  2. Мне очень нравиться PHP
  3. Мне нравиться то, как сделан Zend Development Environment и то, что Zend Development Environment прекрасно поддерживает Zend Framework с подсказками кода
  4. Мне нравиться то, что я всегда без проблем могу посмотреть в исходники Zend Framework и разобраться что к чему
  5. Мне нравиться Zend Framework потому что я могу продуктам с его использованием спокойно делать стандартный debug с Zend Development Environment, поставить Break point там где хочу и посмотреть как оно там всё происходит
  6. Мне нравиться, что я его могу тупо скачать как ZIP или TGZ, закинуть на сервер куда угодно, прописать в include_path и радостно пользоваться им как хочу
  7. Мне нравиться, про я могу использовать разные шаблоны запуска/создания проекта, именно такие, какие мне нравятся или кажутся нужными для проекта
  8. Мне нравиться, что PHP можно без проблем за несколько минут поставить почти на любую платформу, а значит там можно запустить Zend Framework

Zend Framework 1.0.0 – как бы я строил начальный каркас

Не знаю, на сколько я прав в этом вопросе, но я не думаю, что совершил много грубых ошибок в проектировании. Тех, кто далёк от архитектуры Model-View-Controller попрошу остановиться и ознакомиться где-либо с этой идеологией.

Итак, для установки Zend Framework 1.0.0 на сервер не нужно никаких особых шаманств с бубном. Всё что вам нужно, это соответствовать требованиям Zend Framework. Там нет ничего сложного – PHP 5.1.4 (рекомендуется 5.2.2), SPL и, возможно, некоторые extensions, если вы будете использовать определённые компоненты Zend Framework.

Структура каталогов для быстрого старта с Zend Framework о которой пойдёт речь далее.

Continue reading →

Google расширяет возможности REP

Почему никто не догадался это сделать до Google? Ведь почти гениально! Они начали расширять REP.

Первое, что ввёл Google, это новый META: <META NAME=”GOOGLEBOT” CONTENT=”unavailable_after: 25-Aug-2007 15:00:00 EST”> который позволяет указать, после какой даты страница будет неактуальна, убрана и или архивирована и не будет актуальна для посетителей. Теперь можно прекрасно управлять промо-страницами и всем, что имеет ограниченные временные рамки на актуальность.

Хочу заметить, что unavailable_after не убирает саму страницу из системы Google а удаляет её только из результатов поиска.

Позаботились и не о HTML документах. У нас появился новый HTTP заголовок: X-Robots-Tag:, который позволит задать параметры индексации для других документов.
Примеры:
X-Robots-Tag: noarchive, nosnippet – не архивировать и не не показывать ссылку кеш рядом с результатом.
X-Robots-Tag: noindex – не индексировать.
X-Robots-Tag: unavailable_after: 7 Jul 2007 16:30:00 GMT – время, после которой нужно убрать страницу из результатов поиска.

Для того, что-бы воспользоваться новыми HTTP заголовками на Apache, должен быть включен Apache Module mod_headers. Воспользовавшись директивой <FilesMatch> можно задать эти заголовки. К примеру, в каталоге с нужным файлом положить .htaccess с таким содержанием:

<FilesMatch "avatar.jpg$">
	 Header add X-Robots-Tag "noindex"
</FilesMatch>

Вот и всё.

Первые 8 часов с Zend Framework 1.0.0

Провёл с Zend Framework 1.0.0 около 8 часов. Результат: всё-таки я это дело запустил, подключился к базе, сделал 404 страницу, сделал форму регистрации. Подводных камней куча. Мануал по Zend Framework и примеры желают лучшего. По сравнения с Ruby on Rails стартовать реально сложно – примеры все написаны под разные версии до 1.0.0 и очень часто отличаются структурой.

Первое и самое лёгкое в процессе, это установка: всё просто – скопировал в папку, в include_path закинул и всё, можно пользоваться. Подробности – Introduction to Zend Framework, Installation.

Далее – контроллеры. С ними Quick Start прошёл тоже быстро. Фактически всё из Quick Start прошло без проблем, кроме 404 страницы. Всё сделал как они описали, но не заработало. Код я видимо взял из примера и у меня пробрался throwExceptions в режиме true, как только я понял что к чему, всё заработало. То, как устроена обработка 404ой ошибки с Zend_Controller_Plugin_ErrorHandler мне понравилось. Пока не разобрался с возможностью самому задавать правила роутинга, но это наверняка мелочь уже.

Что меня на данном этапе удивило – это то, что нет единой принятой структуры каталогов, как у Ruby on Rails. Конечно, в Quick Start есть пример, но всё это сделано руками и где-то в мануале, а на это статью не сразу натыкаешься. Я бы сказал не хватает Creating a weblog in 15 minutes – с Ruby on Rails я как-то проще начинал.

Итак, так как я уже разобрался с контроллерами и акшинами, я перешёл к конфигам. WOW! и никаких конфигов тоже небыло. Если надо – пожайлуста, делай сам, из массива, из .ini или из .xml. Где и как будет лежать – наши/ваши проблемы.

Конфиг есть, пора бы и за базой поработать. Обилие возможностей для работы казалось бы не может не радовать. Zend_Db_Select, Zend_Db_Table, Zend_Db_Table_Row. Осилил я Zend_Db_Table и Zend_Db_Table_Row. Часа 3 потратил на то, чтобы загрузить модели, ну или то, что в Zend Framework называется моделью. Оказывается, не смотря на то что в структуре примера есть папка application/models у меня их автоматом не грузит. Как их грузить я вообще не нашёл, поэтому тупо сделал им require_once и всё вроде заработало.
Пока не нашёл способа, куда вводить их моделям валидацию, как в Ruby on Rails, видимо, в Zend Framework всё реализовано по другому. Особо хакать исходники времени небыло, я оставил всё как есть. Потом меня приятно удивил метод save – в случае ошибки, он падает с Exception. Я ожидал что он элементарно будет возвращать true/false и всё. Ладно – обошли это проблему пока, и особых решений этой проблемы я пока не видел, зато видел где-то в их wiki много try { […] } catch { […] } при работе с их моделями.

Скажу честно – впечатления пока никакие. Я ожидал намного больше и со стороны документации и со стороны примеров. да и со стороны самого Zend Framework 1.0.0 я ожидал куда более простую систему, чем увидел. Может это и не верное первое впечатление, но именно оно отталкивает меня от использование Zend Framework в работе и заставляет меня использовать личные разработки.

SimpleActiveRecord 0.0.2

Сегодня я запустил в свет SimpleActiveRecord 0.0.2.

Что нового?

  • Ввёл тесты для магических методов, которые естественно, он завалил, и их я тут-же поправил.
  • Плюс ко всему добавилась проверка на то, NULL или не NULL значение поля по умолчанию если оно пустое должно быть. Теперь, если сделать unset(); для поля и у него NULL = YES в структуре базы – оно после сохранения станет NULL а не пустой строкой. Присвоение значения по умолчанию при unset();
  • Разделил тесты между простыми методами и методами создания записей в базе.
  • Заложил возможность на проверку типов данных. Уже сейчас он проверяет значение поля типа SET на соответсвие сета.

Что для меня важного в этом классе?

  • Он сам узнаёт название таблицы в конструкторе.
  • Сам подгружает имена полей, их типы и значения по умолчанию.
  • Я приучаю себя всегда документировать код.

Маленький кусочек OpenSource

Так как каждый из нас, программистов, постоянно экспериментирует и старается развивать себя и свои возможности и знания, я регулярно пересматриваю разные чужие OpenSource решения, пишу какие-то свои маленькие скрипты, библиотечки, классы, которые иногда даже не выходят за пределы localhost или превращаются в коммерческие продукты dip.:studio – их выкладывать на обзор всей публики не целесообразно, но чем-то поделиться хочется.

Так вот, в свободное время, дома, я начал писать маленький простенький ActiveRecord. Пока могу показать только версию SimpleActiveRecord 0.0.1. В пакет входит сам класс, быстро сгенерированная документация на phpDoc (там есть примеры использования), маленький набор тестов Unit Тестов на phpUnit. Всё это чудо рассчитано на PHP 5.2.3.

Я не буду утверждать, что это супер-оригинальное или гениальное решение, просто это мой взгляд на быстрою и простую реализацию ActiveRecord в версии 0.0.1. Если у кого либо есть конструктивные комментарии – пишите (модерация включена, пересматриваю регулярно раза 2 в день).