Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

Modularise

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

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

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

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

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

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

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

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

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

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

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

Ответ 2

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

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

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

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

В High Scalability есть полезные статьи, которые могут оказаться полезными.

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

Ответ 3

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

Ответ 4

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

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

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

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

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

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

НТН

С.