Архитектура веб-приложений: будущее

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

Я пытаюсь сделать свое приложение «перспективным» - поэтому, когда есть большое количество пользователей, я не хочу, чтобы сервер был перегружен, поэтому я подумал, что помещаю электронные письма, которые необходимо отправить, и файлы, которые необходимо заархивировать в очереди. Поместите их в таблицу, а затем используйте задание cron для проверки каждую секунду и выполнения их (x строк за раз).

Это хорошая идея? Или есть подход получше? Мне действительно нужна помощь, чтобы сделать это правильно, чтобы потом избавиться от головной боли :)

Спасибо всем


person Abs    schedule 22.01.2009    source источник


Ответы (7)


Это хороший подход, но самое важное, что вы можете сделать прямо сейчас, - иметь понятный интерфейс для постановки сообщений в очередь и один для использования очереди. Не делайте использование на обоих концах жестко привязанным к базе данных.

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

person orip    schedule 22.01.2009
comment
Я понимаю, очень важно сохранить свободный интерфейс, что, кроме БД, я мог бы использовать, когда вы говорите о другом сервере, доставляющем мою почту? - person Abs; 22.01.2009
comment
Вы можете использовать систему очередей сообщений, вы можете добавить к другой БД, оптимизированной для такого типа поведения вставки / удаления, не обременяя вашу другую БД, вы можете буферизовать ее в памяти и сбрасывать в файлы, которые затем потребляется - на самом деле, вы просто оставляете свои варианты открытыми. - person orip; 22.01.2009

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

Еще лучше, если вы сделаете архивирование интеллектуальным и не используете сжатие при архивировании больших уже сжатых файлов (MP3, ZIP, DOCX, XLSX, JPG, GIF и т. Д.) И с использованием высокого сжатия, когда у вас есть простые текстовые файлы (TXT, XML , DOC, XLS и т. Д.), Поскольку они архивируются очень быстро даже при сильном сжатии.

person TravisO    schedule 22.01.2009

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

Одна из причин заключается в том, как вы сами это описываете, если множество пользователей запрашивают отправку писем и очередь растет, одно задание cron не успеет завершить работу до статистики ext one, и вы рискуете получить переполнение системы. с процессами.

person eliego    schedule 22.01.2009
comment
Хороший момент - спасибо за это. Также вы бы порекомендовали мне обработать все, что находится в очереди, или что-то еще? Помните, что все это время критично, чем быстрее, тем лучше :) - person Abs; 22.01.2009
comment
В зависимости от ваших настроек наиболее эффективным может быть одновременное получение нескольких заданий электронной почты с последующей их параллельной обработкой с помощью нескольких поддерживающих подключений к запущенному серверу smtp. Но все зависит от того, как вы реализуете свою очередь и как вы на самом деле отправляете свои электронные письма. - person eliego; 22.01.2009

Это хорошая идея? да

может ли быть лучшее решение для обслуживания миллионов пользователей в будущем? возможно .. но не это главное. важно то, что у вас есть уровень абстракции. Если когда-нибудь в будущем у вас будет сумасшедший трафик, а ваша очередь cron не работает, вы можете заменить функциональность этого уровня, не изменяя какой-либо код, который его использует.

person Mike Paterson    schedule 22.01.2009

Хм. Мне не очень нравится идея, что cron запускает что-то каждую секунду. Это кажется слишком частым. Если ваше приложение действительно должно быть настолько отзывчивым, я думаю, вам следует поддерживать его синхронность. То есть продолжайте обработку в своем веб-приложении и ищите другие способы снизить уровень нагрузки на сервер.

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

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

-
bmb

person bmb    schedule 27.01.2009

Постройте что-то, что выполняет распределенную организацию очередей. Когда вы масштабируете объем, вы можете масштабировать различные слои своего уровня, где может возникнуть узкое место.

Есть ли смысл запускать cron каждую секунду? Громкость такая высокая? Я бы посоветовал сделать все возможное, чтобы реализовать многоуровневую реализацию, потому что вы будете менять местами элементы и выполнять рефакторинг, пока они борются за ваше внимание.

Постарайтесь не строить ничего, что вы спроектировали, в течение нескольких недель. Часто до того, как что-то застрянет, вам будут приходить другие сценарии.

person Jas Panesar    schedule 27.01.2009
comment
Спасибо за отличный совет, особенно последнюю строчку. :) - person Abs; 28.01.2009
comment
Рад, что это пригодилось. Последняя строчка, кстати, сложнее всего. Я едва могу подождать неделю или две. Когда я могу это сделать, я буду щедро вознагражден. - person Jas Panesar; 28.01.2009

Хороший подход. Некоторые доработки:

  1. Не используйте задание cron, вместо этого выполняйте запрос по таймеру.
  2. Включите государственный флаг для сортировки нескольких читателей / писателей.
  3. Читатель должен опустошить очередь - не блокируйте, пока чтение из очереди не станет пустым.
  4. Будь проще. Добавьте сложности и тонкости в беседу писателя и читателя.

По моему опыту, это хорошо масштабируется.

person dkretz    schedule 27.01.2009