Перейти к содержанию
Посмотреть в приложении

A better way to browse. Learn more.

Форум Академгородка, Новосибирск

A full-screen app on your home screen with push notifications, badges and more.

Чтобы установить это приложение на iOS и iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
Чтобы установить это приложение на Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Высокая нагрузка

Опубликовано

Приветствую.

Столкнулся с задачей построения веб-сервиса с очень высокой нагрузкой. (порядка 2-4 тысяч запросов в секунду).

Сервис - баннерная система.

 

Посоветуйте что почитать по архитектуре таких систем или поделитесь практическим советом.

Сам чуть позже изложу свои идеи и нарисую предполагаемую архитектуру...

 

Рекомендуемые сообщения

Опубликовано

Что конкретно подразумевается под веб-сервисом?

Что подразумевается под запросом? В частности, интересует протокол.

Что примерно должны эти запросы делать?

Опубликовано
  • Автор

D-Light, спасибо... Почитаю.

 

Esil, веб-сервис - баннерная система.

Запросы (от клиента) - HTTP GET

Внутри может быть иначе.

 

Запрос происходит следующим образом:

1)Отыграл JS в броузере клиента - запрос полетел к нам.

-определение местоположения по IP (геотаргетинг)

-определение списка объявлений на эту территорию, которые могут быть оплачены либо у авансовых клиентов

-выбор N произвольных объявлений из этого списка

-создание сессии показа

-отдача скрипта (или статики), которая покажет объявлени (-е, -я) броузеру клиента

 

2)Запрос на получение картинки от клиента

-проверка сессии показа

-списание денег у владельцев объявления, начисление на счёт вебмастеру

-удаление сессии показа

-отдача картинки

 

---

В качестве технических решений скорее всего будут...

 

База данных: MySQL

Фронтенд-сервера: nginx

Кеш-сервер (ключи): memcached

Файловое хранилище: железяка+NFS

Бэкенд-сервера: apache (версия ?) + PHP5

 

Рассматривается вариант бэкендов: fastcgi (perl) + lighttpd

 

Останавливает отсутствие опыта работы с фастцги и отсутствие же документации по ней :(

И есть, как кажется, разумные опасения, что бэкенды будут ложиться достаточно часто.

 

Чуть подробнее ещё позже напишу

Опубликовано

http://softwaremaniacs.org/blog/2006/04/18...olled-download/

http://softwaremaniacs.org/blog/2007/01/08...led-download-2/

И вообще блог посмотри если не испытываешь отвращение к python + django. :)

Опубликовано
  • Автор

Спасибо, посмотрю.

От питона отворачивает отсутствие опыта работы со змейкой...

Опубликовано

Как я понял на каждый показ картинки требуется изменение данных в базе.

На каком примерно оборудовании планируется запускать MySQL?

Опубликовано
  • Автор

Esil, хороший вопрос.

Увы, он пока не решался.

 

Запустить это всё надо в рамках одной слабой VPS-машины, а дальше растить и масштабировать...

 

Сессии или в MySQL-MEMORY или в memcached думаю ложить. Первый вариант корректнее, а второй быстрее =\

Биллинг - InnoDB

 

Опубликовано
Где-то я слышал, что змеи там не при чём. А всё дело в летающем цирке Монти Пайтон.

Всё так, но пара стилизованных змей в текущем логотипе таки есть. :)

 

Опубликовано

ИМХО, основной затык в этом:

-списание денег у владельцев объявления, начисление на счёт вебмастеру

 

Думаю тут есть два варианта:

 

1. Возложить всё на базу. При этом надо готовиться к тому, что возможно придётся вложить много денег в базу и оборудование, на котором она будет работать. Возможно придётся отказаться от MySQL.

 

2. Подумать в сторону того, чтобы избавиться от запросов к основной базе при показе одного баннера. Например считывать деньги кусками из главной базы, зачислять их туда тоже кусками, более точный учёт вести на второстепенных серверах. При этом возможны ситуации, когда осталось ещё немного денег, но использовать их можно не всегда (оин "переехали" на один из второстепенных серверов и могут использоваться только там).

 

Тут ещё зависит от того, сколько времени хочется тратить на разработку. Судя по всему apache-сервера будут заниматься в основном тем, что будут впустую крутить Apache + PHP между запросами к базе, при этом не выполняя почти никакой логики. Думаю, что если заменить nginx на собственный сервер (обрабатывать то надо простые GET-запросы, которые перенаправлять к базе), то получится тот же результат (особенно если база всё-таки будет одна). Только от этого может сильно увеличиться время разработки.

 

Опубликовано
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 и обработки медленных коннектов.

 

Насчет файлового хранилища не понял - что именно в нем собирается храниться ? :)

Если скрипт и картинки клиентов, то самое простое - сложить это в БД.

 

Код соотвественно сразу должен поддерживать работу со всеми этими пулами.

 

  • 4 недели спустя...
Опубликовано
  • Автор

1. Геотаргетинг даётся средствами lighttpd, соответствущим модулем. База в 40-с-копейками мегабайт всасывается в кеш и всё хорошо

2. С определением списка придумал вариант такой.... Раз в минуту вызывается по скрипт-генератор конфигов для каждой страны, при наличии города - для каждого города. Он генерит файлы, которые инклюдятся как php-code. При достижении некоего порогового баланса, новые объявления не будут ложиться в конфиг. Собственно, единственный вопрос - как php отреагирует на попытку инклюда файла, на котором стоит lock (который перезаписывается в данный момент).

3. Сессия нужна для проверки факта показа баннера.

4. Не очень понял :(

5. Да. Возомжно. Подумаю над этим вопросом.

6. Картинки сам nginx может отдавать - голимая статика.

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

Аккаунт

Навигация

Поиск

Поиск

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.