Моя команда и я находимся в середине разработки приложения, которое должно быть в состоянии справиться с довольно интенсивным трафиком. Не уровень facebook, но в будущем я хотел бы иметь возможность масштабироваться до этого без массивной перезаписи кода.
Моя мысль заключалась в том, чтобы модульно разобрать все в отдельные сервисы с их собственными интерфейсами. Так, например, для обмена сообщениями был бы интерфейс обмена сообщениями, который мог бы отправлять и getMessages () как методы, а затем веб-приложение PHP просто запрашивало бы этот интерфейс через мыло или завиток или что-то в этом роде. Приложением для обмена сообщениями может быть любое приложение, поэтому приложение Java или Python или что-то другое подходит для этой конкретной функциональности с помощью собственного отдельного осколка базы данных.
Это хороший подход?
Моя мысль заключалась в том, чтобы модульно разобрать все в отдельные сервисы с их собственными интерфейсами. Так, например, для обмена сообщениями был бы интерфейс обмена сообщениями, который мог бы отправлять и getMessages () как методы, а затем веб-приложение PHP просто запрашивало бы этот интерфейс через мыло или завиток или что-то в этом роде
Мне нравится идея разделения каждого в сервисных модулях (хороший принцип кодирования). Мне не нравится роль SOAP 🙁 Я думаю, что это сложный способ. Я бы пошел на что-то вроде JSON-RPC или что-то в этом роде.
Моя команда и я находимся в середине разработки приложения, которое должно быть в состоянии справиться с довольно интенсивным трафиком. Не уровень facebook, но в будущем я хотел бы иметь возможность масштабироваться до этого без массивной перезаписи кода.
80% времени отклика конечного пользователя тратится на интерфейс. Большая часть этого времени связана с загрузкой всех компонентов на странице: изображения, таблицы стилей, скрипты, Flash и т. Д. Сокращение количества компонентов, в свою очередь, уменьшает количество HTTP-запросов, необходимых для отображения страницы. Это ключ к более быстрым страницам.
В HipHop мы сократили использование ЦП на наших веб-серверах в среднем примерно на пятьдесят процентов, в зависимости от страницы. Меньший процессор означает меньшее количество серверов, что означает меньшие накладные расходы
Если вы хотите, чтобы ваши веб-сайты масштабировались, вам нужно пройти мантру:
ОЗУ – это новый диск
Кеш, кеш, кеш! например, APC, memcached , redis .
Это звучит разумно как первый шаг, просто имейте в виду, что трафик между уровнем PHP и уровнем обмена сообщениями добавит немного задержки. Вы также можете подумать:
Кэширование данных на уровне PHP, используя (например) memcached . Вы также можете рассмотреть использование кэша веб-прокси, например, кальмара
Масштабирование вашего веб-сервера на нескольких машинах, например, хранение данных сеанса в базе данных. После того, как вы сможете поддерживать 2 веб-сервера, добавление третьего (четвертого, пятого и т. Д.) Должно быть простым. Имейте в виду, что в конечном итоге вам может понадобиться масштабировать уровень обмена сообщениями на нескольких машинах.
Использование таких инструментов, как PHP e-Accelerator для кэширования скомпилированных скриптов; должно помочь повысить производительность на веб-уровне
Есть также отличные статьи о высокой масштабируемости , которые могут оказаться полезными.
Наконец, имейте в виду, что легко переопределить решение. Лучше всего постоянно измерять нагрузку, производительность, использование ресурсов и т. Д., А затем использовать эти данные для внесения необходимых изменений.
Кэш, кеш и больше кеша. Кэширование SQL-запросов, кэширование кода операции, избегайте многократного запроса на одно и то же. Затем используйте профайлер, когда вы запускаете, чтобы отслеживать, где ваши медленные точки.
Основываясь на разработке высокого уровня вокруг набора модулей, это хороший способ управления сложностью и развитием структуры (тем более, что на микроуровне)
веб-приложение PHP просто запросит этот интерфейс через мыло или завиток
Это вводит много латентности в приложение. Я бы предложил определить API, но для любого синхронно обработанного запроса запустите как можно больше кода в одном потоке.
Конечно, если вам приходится иметь дело с несколькими языками разработки, использование интерфейса, работающего по протоколу HTTP, является очень прагматичным решением, но если вы разрабатываете интерфейс в PHP, то, программируя абстрактному PHP API (который может вызывать Soap, Corba , или другие вещи), у вас все еще есть возможность повторно реализовать бэкэнд по-другому.
Я не уверен, что вы подразумеваете под сообщениями. Если вы говорите об асинхронной обработке запросов, вам нужно подумать о том, как реализовать подписчика в PHP. Это полная червь червей – я не видел хорошей системы обработки сообщений, написанной на PHP, но я не видел хорошо масштабируемого решения, написанного на Java, и это включает в себя продукты, увенчанные некоторыми крупными игроками в высоком конце системы. Возможно, однажды я напишу один;) Тем временем вы действительно хотите, чтобы ваша сложная (и, возможно, менее надежная) бизнес-логика работала в отдельном потоке от любого типа подписчика-подписчика, поэтому очевидный способ сделать это выставить цель как веб-страницу и запустить подписчика в качестве демона, который просто собирает сообщения и вызывает веб-интерфейсы API.
Вы действительно не хотите создавать синхронную систему обмена сообщениями, если вы вообще обеспокоены производительностью / надежностью / масштабируемостью.
НТН
C.