Очереди (yii2-queue)
Очереди (yii2-queue)
Здравствуйте!
Никогда не сталкивался с очередями и сразу такой вопрос: Может ли очередь заменить CRON TAB в целях сохранения ресурсов сервера?
А теперь описание: Есть некоторый cron action выполняющийся с периодичностью, кажем раз в 6 часов, сжирает он довольно таки приличное количество ресурсов (ЦПУ, ОЗУ) из-за некоторым клиентам, обращающиеся за данными, просто не будет ответа а того и вообще сервер может лечь не на долго. В этом и вопрос, можно ли с очередями мягко ограничить выполнение задания в плане ресурсов пусть работает пол часа, но в фоне, чем 5 минут и все грохает...
Операция, кстати, нечто вроде парсинга, примерно 200МБ файл xml грузится в память, от туда уже просто, реально много запросов к БД.
Никогда не сталкивался с очередями и сразу такой вопрос: Может ли очередь заменить CRON TAB в целях сохранения ресурсов сервера?
А теперь описание: Есть некоторый cron action выполняющийся с периодичностью, кажем раз в 6 часов, сжирает он довольно таки приличное количество ресурсов (ЦПУ, ОЗУ) из-за некоторым клиентам, обращающиеся за данными, просто не будет ответа а того и вообще сервер может лечь не на долго. В этом и вопрос, можно ли с очередями мягко ограничить выполнение задания в плане ресурсов пусть работает пол часа, но в фоне, чем 5 минут и все грохает...
Операция, кстати, нечто вроде парсинга, примерно 200МБ файл xml грузится в память, от туда уже просто, реально много запросов к БД.
-
- Сообщения: 50
- Зарегистрирован: 2017.03.06, 15:37
- Откуда: Владивосток
Re: Очереди (yii2-queue)
Очереди используются, как правило, для отложенного выполнения, дабы основной процесс не ждал выполнения чего-либо.
Например, зарегистрировался пользователь, и письмо отправилось не сразу, а отправилось в очередь.
Тем самым, клиент не ждёт, пока уйдёт письмо, а сразу видит "Вы зарегистрированы".
Или, например, пользователь добавил отзыв.
И надо пересчитать количество отзывов или рейтинг статьи по отзывам.
Так вот, отзыв в базу добавляется сразу, а в очередь отправляется событие на пересчёт количества/рейтинга.
Тем самым, пользователь, опять же, не ждёт, пока выполнится что-то, что может выполниться и потом.
Что касается XML - его не надо грузить весь в память, иначе что делать с файлами больше 10 Гб? А больше 50 Гб?
Файл надо читать побайтово, а не через Xml DOM Parser.
Например, XMLReader.
В базу вставлять не поштучно, а сначала складывать в буфер, а потом batchInsert() этого буфера каждые, скажем, 1000 записей.
Например, зарегистрировался пользователь, и письмо отправилось не сразу, а отправилось в очередь.
Тем самым, клиент не ждёт, пока уйдёт письмо, а сразу видит "Вы зарегистрированы".
Или, например, пользователь добавил отзыв.
И надо пересчитать количество отзывов или рейтинг статьи по отзывам.
Так вот, отзыв в базу добавляется сразу, а в очередь отправляется событие на пересчёт количества/рейтинга.
Тем самым, пользователь, опять же, не ждёт, пока выполнится что-то, что может выполниться и потом.
Что касается XML - его не надо грузить весь в память, иначе что делать с файлами больше 10 Гб? А больше 50 Гб?
Файл надо читать побайтово, а не через Xml DOM Parser.
Например, XMLReader.
В базу вставлять не поштучно, а сначала складывать в буфер, а потом batchInsert() этого буфера каждые, скажем, 1000 записей.
Re: Очереди (yii2-queue)
не понятно, кто и куда и зачем обращается и почему жрет ресурсы. Можете внятно описать то что происходит?
Re: Очереди (yii2-queue)
Обращаются пользователи (клиентские приложения), жрет ресурсы CRON TAB (каждые 6 часов) и так бывает, что памяти может не хватить для ответа некоторым клиентам да и вообще, сам CRON может крякнуться и унести собой всю виртуалку, т.е минус 1 хост - вот сюда и может попасть клиент и ничего не получить, тем самым крякнется уже у него на устройстве (приложение) вот такие да дела. Но на самом деле это излишние детали...
А что хотелось бы получить в идеале: такую схему, при котором планировщик или очередь или еще что-то невиданное да неслыханное (мною) могло бы само "думать и решать" типа: "хозяин поставил планку в 1ГБ ОЗУ и ЦПУ не выше 25% в нагрузке, моя активность уже на пике, а ресурсов не хватает, пожалуй подожду-ка я пока кто-нить не освободит ресурсы" Вот так как-то, но это, думаю, утопия
Re: Очереди (yii2-queue)
там вообще simplexml_load_stringfrid-karatel писал(а): ↑2019.03.06, 17:26
Что касается XML - его не надо грузить весь в память, иначе что делать с файлами больше 10 Гб? А больше 50 Гб?
Файл надо читать побайтово, а не через Xml DOM Parser.
В общем там такая "фиг победишь" логика, я насчитал 4 вложенных цикла где вызывается метод Model::save().frid-karatel писал(а): ↑2019.03.06, 17:26 В базу вставлять не поштучно, а сначала складывать в буфер, а потом batchInsert() этого буфера каждые, скажем, 1000 записей.
А batchInsert будет выйгрышь в том, что будет 1 обращение к БД вместо 1000? UPD: и думаю не только, получается 1000 (условно) объектов создается при итерациях в О(4), омг...
Спасибо за пояснение очередей на прекрасных примерах!)
Re: Очереди (yii2-queue)
Может на чистом SQL переписать?
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Re: Очереди (yii2-queue)
Нет, я про это
В общем там такая "фиг победишь" логика, я насчитал 4 вложенных цикла где вызывается метод Model::save().
Чтобы правильно задать вопрос, нужно знать бо́льшую часть ответа. Роберт Шекли.
Re: Очереди (yii2-queue)
Нужна мультибэкендная схема с балансировщиком. Если один хост не отвечает, то балансировщик на другой переведет запрос и так пока не опросит все хосты. В такой схеме можно отключать один хост на время выполнения крона.
Последний раз редактировалось SiZE 2019.03.07, 15:15, всего редактировалось 1 раз.
Re: Очереди (yii2-queue)
Запускайте Cron на отдельной виртуалке, куда клиенты не ходят.