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

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

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

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

Спасибо всем

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
3
0
566
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

Я понимаю, очень важно сохранить свободный интерфейс, что, кроме БД, я могу использовать, когда вы говорите о другом сервере, доставляющем мою почту?

Abs 22.01.2009 21:57

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

orip 22.01.2009 22:01

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

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

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

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

Хороший момент - спасибо за это. Также вы бы порекомендовали мне обработать все, что находится в очереди, или что-то еще? Помните, что все это время критично, чем быстрее, тем лучше :)

Abs 22.01.2009 21:56

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

eliego 22.01.2009 22:05

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

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

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

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

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

--
bmb

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

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

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

Спасибо за отличный совет, особенно последнюю строчку. :)

Abs 28.01.2009 18:37

Рад, что это пригодилось. Последняя строчка, кстати, сложнее всего. Я едва могу подождать неделю или две. Когда у меня есть возможность, я щедро вознагражден.

Jas Panesar 28.01.2009 20:28

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

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

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

Другие вопросы по теме