Создание высоко масштабируемых веб-сервисов

Моя команда и я находимся в середине разработки приложения, которое должно быть в состоянии справиться с довольно интенсивным трафиком. Не уровень facebook, но в будущем я хотел бы иметь возможность масштабироваться до этого без массивной перезаписи кода.

Моя мысль заключалась в том, чтобы модульно разобрать все в отдельные сервисы с их собственными интерфейсами. Так, например, для обмена сообщениями был бы интерфейс обмена сообщениями, который мог бы отправлять и getMessages () как методы, а затем веб-приложение PHP просто запрашивало бы этот интерфейс через мыло или завиток или что-то в этом роде. Приложением для обмена сообщениями может быть любое приложение, поэтому приложение Java или Python или что-то другое подходит для этой конкретной функциональности с помощью собственного отдельного осколка базы данных.

Это хороший подход?

Modularise

Моя мысль заключалась в том, чтобы модульно разобрать все в отдельные сервисы с их собственными интерфейсами. Так, например, для обмена сообщениями был бы интерфейс обмена сообщениями, который мог бы отправлять и getMessages () как методы, а затем веб-приложение PHP просто запрашивало бы этот интерфейс через мыло или завиток или что-то в этом роде

Мне нравится идея разделения каждого в сервисных модулях (хороший принцип кодирования). Мне не нравится роль SOAP 🙁 Я думаю, что это сложный способ. Я бы пошел на что-то вроде JSON-RPC или что-то в этом роде.

Некоторые быстрые подсказки:

Моя команда и я находимся в середине разработки приложения, которое должно быть в состоянии справиться с довольно интенсивным трафиком. Не уровень facebook, но в будущем я хотел бы иметь возможность масштабироваться до этого без массивной перезаписи кода.

  • Как и другие, я также посоветовал вам взглянуть на блог с высокой степенью масштабируемости .
  • Сначала сосредоточьтесь на интерфейсе, используя скорость YSlow / google. Эта оптимизация проста в реализации и может дать вам значительное повышение. Цитата с веб-страницы Yslow:

80% времени отклика конечного пользователя тратится на интерфейс. Большая часть этого времени связана с загрузкой всех компонентов на странице: изображения, таблицы стилей, скрипты, Flash и т. Д. Сокращение количества компонентов, в свою очередь, уменьшает количество HTTP-запросов, необходимых для отображения страницы. Это ключ к более быстрым страницам.

  • Я бы также посоветовал вам взглянуть на HipHop для php, который преобразует ваш PHP-код в код C, который был огромным стимулом для facebook. Цитата из статьи:

В HipHop мы сократили использование ЦП на наших веб-серверах в среднем примерно на пятьдесят процентов, в зависимости от страницы. Меньший процессор означает меньшее количество серверов, что означает меньшие накладные расходы

  • Я предполагаю, что другое большое / простое улучшение, если оно еще не настроено, – использовать APC (кеш-код операции) для кэширования скомпилированного кода. Это даст вам огромный импульс (не обязательно для деталей, преобразованных в HipHop).
  • Если вы хотите, чтобы ваши веб-сайты масштабировались, вам нужно пройти мантру:

    ОЗУ – это новый диск

    Кеш, кеш, кеш! например, APC, memcached , redis .

  • Сначала создайте свой PHP-код, а затем оптимизируйте низко висящие фрукты. Я нашел этот аудиофайл от Rasmus Lerdorf действительно полезным. При чтении сообщения в блоге вы найдете много хороших советов по повышению производительности.
  • Также я бы подумал о том, чтобы отойти от базы данных отношений в пользу, например, Кассандры . Это шаг, который я вижу в последнее время в большом количестве крупных игроков (например, твиттер, digg, facebook, reddit). Таким образом, вам придется идти в совершенно разных настроениях, но моя ставка заключается в том, что это будет стоить усилий.
  • Очередь все и восторг каждого из них, например, beanstalkd , gearman или google app engine.

Это звучит разумно как первый шаг, просто имейте в виду, что трафик между уровнем PHP и уровнем обмена сообщениями добавит немного задержки. Вы также можете подумать:

  • Кэширование данных на уровне PHP, используя (например) memcached . Вы также можете рассмотреть использование кэша веб-прокси, например, кальмара

  • Масштабирование вашего веб-сервера на нескольких машинах, например, хранение данных сеанса в базе данных. После того, как вы сможете поддерживать 2 веб-сервера, добавление третьего (четвертого, пятого и т. Д.) Должно быть простым. Имейте в виду, что в конечном итоге вам может понадобиться масштабировать уровень обмена сообщениями на нескольких машинах.

  • Использование таких инструментов, как PHP e-Accelerator для кэширования скомпилированных скриптов; должно помочь повысить производительность на веб-уровне

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

Наконец, имейте в виду, что легко переопределить решение. Лучше всего постоянно измерять нагрузку, производительность, использование ресурсов и т. Д., А затем использовать эти данные для внесения необходимых изменений.

Кэш, кеш и больше кеша. Кэширование SQL-запросов, кэширование кода операции, избегайте многократного запроса на одно и то же. Затем используйте профайлер, когда вы запускаете, чтобы отслеживать, где ваши медленные точки.

Основываясь на разработке высокого уровня вокруг набора модулей, это хороший способ управления сложностью и развитием структуры (тем более, что на микроуровне)

веб-приложение PHP просто запросит этот интерфейс через мыло или завиток

Это вводит много латентности в приложение. Я бы предложил определить API, но для любого синхронно обработанного запроса запустите как можно больше кода в одном потоке.

Конечно, если вам приходится иметь дело с несколькими языками разработки, использование интерфейса, работающего по протоколу HTTP, является очень прагматичным решением, но если вы разрабатываете интерфейс в PHP, то, программируя абстрактному PHP API (который может вызывать Soap, Corba , или другие вещи), у вас все еще есть возможность повторно реализовать бэкэнд по-другому.

Я не уверен, что вы подразумеваете под сообщениями. Если вы говорите об асинхронной обработке запросов, вам нужно подумать о том, как реализовать подписчика в PHP. Это полная червь червей – я не видел хорошей системы обработки сообщений, написанной на PHP, но я не видел хорошо масштабируемого решения, написанного на Java, и это включает в себя продукты, увенчанные некоторыми крупными игроками в высоком конце системы. Возможно, однажды я напишу один;) Тем временем вы действительно хотите, чтобы ваша сложная (и, возможно, менее надежная) бизнес-логика работала в отдельном потоке от любого типа подписчика-подписчика, поэтому очевидный способ сделать это выставить цель как веб-страницу и запустить подписчика в качестве демона, который просто собирает сообщения и вызывает веб-интерфейсы API.

Вы действительно не хотите создавать синхронную систему обмена сообщениями, если вы вообще обеспокоены производительностью / надежностью / масштабируемостью.

НТН

C.