2012-04-07 4 views
3

В настоящее время я реализую свое первое веб-приложение, использующее инфраструктуру AWS и изучаю основы. Я столкнулся с проблемой дизайна, поэтому придумал следующий сценарий, чтобы проиллюстрировать мою проблему:AWS Scalable Architecture Design

Предположим, я делаю веб-приложение, которое сохраняет/печатает веб-сайт в формате pdf и сохраняет его на S3. Передняя часть имеет одну форму. Пользователь набирает URL-адрес для сайта, который они хотят сохранить в формате pdf, и нажмите «Отправить». Приложение должно распечатать страницу с заданным URL-адресом в pdf и представить файл пользователю.

Чтобы сделать приложение масштабируемым, я предположил, что нажатие кнопки отправки отправит сообщение SQS в очередь с URL-адресом для обработки. Затем из этой очереди может быть задействован флот рабочих, создайте pdfs &, сохраните их в S3, затем сохраните ключ/путь S3 в SimpleDB. Проблема, с которой я столкнулся, заключается в том, как рабочий уведомляет веб-приложение о завершении обработки?

Пример дизайн: Example Design

Я представляю Web App может постоянно опрос SimpleDB, пока не появится запись для ключа S3, однако это решение кажется немного неуклюжим. Я чувствую, что это шаблон/проблема, с которой обычно приходится сталкиваться. Может ли кто-нибудь предоставить общий способ решения этой проблемы?

Кроме того, любые рекомендуемые ресурсы для общих шаблонов проектирования в облаке были бы очень полезными.

+2

+1 для [AWS Simple Icons] (http://aws.amazon.com/architecture/icons/) на основе архитектуры диаграммы уже, приятно :) –

+0

Спасибо. Нашел ссылку на них в одном из блогов AWS. Определенно полезно! –

ответ

1

Если вы не используете что-то вроде WebSockets, я не вижу в этом проблемы. Когда пользователь делает запрос, веб-приложение будет опросить SimpleDB (как вы упомянули), чтобы проверить, завершена ли обработка (или произошла ошибка). Что-то вроде WebSockets, тогда у вас может быть другая очередь, на которую подписывается веб-приложение, чтобы получать уведомление, когда обработка завершена, и затем уведомить обозреватель, что он был завершен.

+0

Спасибо за идею Грега. Я не уверен, что интерфейс, подписавшийся на очередь, имеет смысл, поскольку для ELB может быть несколько экземпляров веб-приложений. Однако наличие у них всех подписчиков на тему SNS может иметь смысл.Тем не менее, у меня очень мало опыта программирования на передней панели, и я не знал, как сделать обновление страницы после получения уведомления SNS. Каждое веб-приложение должно будет проверить какой-то идентификатор сеанса при получении сообщения SNS и проверить, связано ли это с сеансом, действующим в данный момент на этом компьютере. Кроме того, я немного застрял: P –

+0

Я полагаю, что опрос SimpleDB неоднократно не является _that_ плохим, однако я думал, что может быть более элегантное решение. –

+0

После того, как браузер пользователя заставляет запрос начать обработку, вы сразу же возвращаете ответ. Если вы не открываете соединение с браузером, пользователь должен будет опросить веб-сервер, чтобы проверить, завершена ли обработка. Запрос на SimpleDB довольно дешевый (по сравнению с тем, что вам нужно было бы сделать, чтобы поддерживать мгновенное обновление страницы с помощью WebSockets или что-то подобное). Вы можете использовать запрос AJAX в фоновом режиме для опроса результата, а затем обновить страницу после завершения обработки. –

1

Как вы уже заявили, вы в основном решили все свои проблемы, кроме front-end, которые должны были бы опросить наш API-интерфейс, чтобы узнать, готов ли носитель. В моей компании мы делаем то, что вы сказали выше, предоставляя скриншоты веб-страниц, а также снимки JPG для PDF-файлов, офисных документов и обработки кодирования видео и аудио.

Мы используем ajax для обновлений и устанавливаем их так, чтобы они выполняли ping несколько раз в секунду, а затем постепенно отбрасывали один раз в секунду и каждые несколько секунд, чтобы не накладывать слишком много нагрузки на наши серверы. Другой вариант, как упоминалось в другом упоминании, будет использовать websockets, который является постоянным соединением с сервером, с которого вы можете «вытолкнуть» и «вытащить» данные. Тем не менее, большинство из них использует подход опроса ajax. Благодаря старым технологиям, таким как Apache, это может быть большой проблемой для тысяч подключений, но с такими вещами, как Nginx, Node и промежуточное кэширование, это не имеет большого значения.

0

Вы можете сохранить объект (как маркер) в S3, а затем опросить S3 вместо простой БД. Таким образом, вы можете избежать стресса на вашем SimpleDB, и ваши результаты голосования будут более стабильными.

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