Опубликовано 4 июня, 200818 г. comment_5477418 Приветствую. Столкнулся с задачей построения веб-сервиса с очень высокой нагрузкой. (порядка 2-4 тысяч запросов в секунду). Сервис - баннерная система. Посоветуйте что почитать по архитектуре таких систем или поделитесь практическим советом. Сам чуть позже изложу свои идеи и нарисую предполагаемую архитектуру... Жалоба
Опубликовано 4 июня, 200818 г. comment_5478327 Что конкретно подразумевается под веб-сервисом? Что подразумевается под запросом? В частности, интересует протокол. Что примерно должны эти запросы делать? Жалоба
Опубликовано 5 июня, 200818 г. Автор comment_5480178 D-Light, спасибо... Почитаю. Esil, веб-сервис - баннерная система. Запросы (от клиента) - HTTP GET Внутри может быть иначе. Запрос происходит следующим образом: 1)Отыграл JS в броузере клиента - запрос полетел к нам. -определение местоположения по IP (геотаргетинг) -определение списка объявлений на эту территорию, которые могут быть оплачены либо у авансовых клиентов -выбор N произвольных объявлений из этого списка -создание сессии показа -отдача скрипта (или статики), которая покажет объявлени (-е, -я) броузеру клиента 2)Запрос на получение картинки от клиента -проверка сессии показа -списание денег у владельцев объявления, начисление на счёт вебмастеру -удаление сессии показа -отдача картинки --- В качестве технических решений скорее всего будут... База данных: MySQL Фронтенд-сервера: nginx Кеш-сервер (ключи): memcached Файловое хранилище: железяка+NFS Бэкенд-сервера: apache (версия ?) + PHP5 Рассматривается вариант бэкендов: fastcgi (perl) + lighttpd Останавливает отсутствие опыта работы с фастцги и отсутствие же документации по ней :( И есть, как кажется, разумные опасения, что бэкенды будут ложиться достаточно часто. Чуть подробнее ещё позже напишу Жалоба
Опубликовано 5 июня, 200818 г. comment_5480461 http://softwaremaniacs.org/blog/2006/04/18...olled-download/ http://softwaremaniacs.org/blog/2007/01/08...led-download-2/ И вообще блог посмотри если не испытываешь отвращение к python + django. :) Жалоба
Опубликовано 5 июня, 200818 г. Автор comment_5480973 Спасибо, посмотрю. От питона отворачивает отсутствие опыта работы со змейкой... Жалоба
Опубликовано 6 июня, 200818 г. comment_5483055 Как я понял на каждый показ картинки требуется изменение данных в базе. На каком примерно оборудовании планируется запускать MySQL? Жалоба
Опубликовано 6 июня, 200818 г. Автор comment_5483128 Esil, хороший вопрос. Увы, он пока не решался. Запустить это всё надо в рамках одной слабой VPS-машины, а дальше растить и масштабировать... Сессии или в MySQL-MEMORY или в memcached думаю ложить. Первый вариант корректнее, а второй быстрее =\ Биллинг - InnoDB Жалоба
Опубликовано 6 июня, 200818 г. comment_5483360 Где-то я слышал, что змеи там не при чём. А всё дело в летающем цирке Монти Пайтон. Всё так, но пара стилизованных змей в текущем логотипе таки есть. :) Жалоба
Опубликовано 11 июня, 200818 г. comment_5494984 ИМХО, основной затык в этом: -списание денег у владельцев объявления, начисление на счёт вебмастеру Думаю тут есть два варианта: 1. Возложить всё на базу. При этом надо готовиться к тому, что возможно придётся вложить много денег в базу и оборудование, на котором она будет работать. Возможно придётся отказаться от MySQL. 2. Подумать в сторону того, чтобы избавиться от запросов к основной базе при показе одного баннера. Например считывать деньги кусками из главной базы, зачислять их туда тоже кусками, более точный учёт вести на второстепенных серверах. При этом возможны ситуации, когда осталось ещё немного денег, но использовать их можно не всегда (оин "переехали" на один из второстепенных серверов и могут использоваться только там). Тут ещё зависит от того, сколько времени хочется тратить на разработку. Судя по всему apache-сервера будут заниматься в основном тем, что будут впустую крутить Apache + PHP между запросами к базе, при этом не выполняя почти никакой логики. Думаю, что если заменить nginx на собственный сервер (обрабатывать то надо простые GET-запросы, которые перенаправлять к базе), то получится тот же результат (особенно если база всё-таки будет одна). Только от этого может сильно увеличиться время разработки. Жалоба
Опубликовано 11 июня, 200818 г. comment_5497185 1)Отыграл JS в броузере клиента - запрос полетел к нам. -определение местоположения по IP (геотаргетинг) -определение списка объявлений на эту территорию, которые могут быть оплачены либо у авансовых клиентов -выбор N произвольных объявлений из этого списка -создание сессии показа -отдача скрипта (или статики), которая покажет объявлени (-е, -я) броузеру клиента 2)Запрос на получение картинки от клиента -проверка сессии показа -списание денег у владельцев объявления, начисление на счёт вебмастеру -удаление сессии показа -отдача картинки 1. геотаргетинг может сильно увеличить нагрузку на диск (в случае хранения базы IP-location в ФС) либо на остальные подсистемы. Возможно, это можно сделать в виде модуля к веб серверу, так чтобы вся база была в памяти, но я о таком не слышал. Самое плохое, что, если на уровне вебсервера это не реализуемо, это потребует вызова скрипта на каждый хит. Это, в свою очередь, потребует большого пула вебсерверов. 2. определение списка - запрос к БД + memcache кеширование данных с expiration time ~ N минут 3. логику создания сессии на каждый показ не понял. Зачем это нужно? При "2-4 килосессиях в секунду" при хранении в memcache/Mysql влет могут кончиться коннекции + может (?) начать влиять сеть. Решение, если сессии действительно нужны, - пул серверов, т.е. на уровне кода должно быть распределение по пулу. 4. отдача скрипта - очень желательно статикой. Если код скрипта динамический, то самое простое - на 404 хэндлер повесить скрипт, генерирующий данный код и сохраняющий его на диск так, чтобы все последующие запросы получали статику. При изменении данных либо по таймауту чистить эти файлы. 5. "-списание денег у владельцев объявления, начисление на счёт вебмастеру" -- желательно делать статистику не "в реальном времени". Тогда возможна реализация например через обработку логов серверов - крутится (в общем случае несколько) скрипт, парсящий логи и производящий апдейты базы с использованием суммированной информации. Это, с учетом нормального кода :), очень сильно снижает нагрузку на БД. 6. отдача картинки - то же самое, что и с 4 пунктом. временное кеширование на диске может серьезно помочь. По самой архитектуре - пул вебсерверов (lighttpd 1.5.x, FastCGI perl/php ), пул memcache серверов, пул mysql серверов. Можно еще впереди nginx воткнуть для разгрузки lighttpd и обработки медленных коннектов. Насчет файлового хранилища не понял - что именно в нем собирается храниться ? :) Если скрипт и картинки клиентов, то самое простое - сложить это в БД. Код соотвественно сразу должен поддерживать работу со всеми этими пулами. Жалоба
Опубликовано 10 июля, 200817 г. Автор comment_5560174 1. Геотаргетинг даётся средствами lighttpd, соответствущим модулем. База в 40-с-копейками мегабайт всасывается в кеш и всё хорошо 2. С определением списка придумал вариант такой.... Раз в минуту вызывается по скрипт-генератор конфигов для каждой страны, при наличии города - для каждого города. Он генерит файлы, которые инклюдятся как php-code. При достижении некоего порогового баланса, новые объявления не будут ложиться в конфиг. Собственно, единственный вопрос - как php отреагирует на попытку инклюда файла, на котором стоит lock (который перезаписывается в данный момент). 3. Сессия нужна для проверки факта показа баннера. 4. Не очень понял :( 5. Да. Возомжно. Подумаю над этим вопросом. 6. Картинки сам nginx может отдавать - голимая статика. Жалоба
Приветствую.
Столкнулся с задачей построения веб-сервиса с очень высокой нагрузкой. (порядка 2-4 тысяч запросов в секунду).
Сервис - баннерная система.
Посоветуйте что почитать по архитектуре таких систем или поделитесь практическим советом.
Сам чуть позже изложу свои идеи и нарисую предполагаемую архитектуру...