Русское сообщество разработки на PHP-фреймворке Laravel.
Ты не вошёл. Вход тут.
Страницы 1
Раз уж я начал задавать много вопросов, то еще один назрел. Как работать с очередями. Redis
Например я запушил очередь
Queue::push('film', array(1, 2, 3), 99);
все красиво, вот я ее получаю
Queue::pop(99);
Вот я ее массово пушу в очередь
Queue::pushRaw('film', 99, [[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]]);
А как получить массово из очереди не знаю((
получается что если мне надо собрать из пула данные, то я создаю цикл, и в нем выдираю по одной из очереди, собираю в пул, и делаю с ними что захочу.
Может что то я упустил. Вообще не нашел инфы по очередям, кроме анонимных функций и методов класса.
Не в сети
Не в сети
У меня есть статистика, в меня обновляется 10 000 000 полей в час. Как раз очередь, и подразумевает, собирать одинаковые данные в поле, а потом их пачкой обрабатывать. Как раз обработку каждого отдельно не вижу смысла ни какого, если это не перекодирование фильма. Я так понял что нет такого способа ((
Не в сети
Приведу пример делаю я обработку в цикле, а пока я ее выполняю, мне в очередь пришло еще куча данные, и получается бесконечный цикл. Можно разными хаками это конечно решить. Но отнють это не хоршее решение.
Не в сети
- Как раз очередь, и подразумевает, собирать одинаковые данные в поле, а потом их пачкой обрабатывать.
Этиот получается не очередь, а фоновый процесс (worker), который бесконечно обрабатывает поток входящих данных. Очередь — это «задачи», не даром там есть методы типа remove(). Например, отправка e-mail — один e-mail — одна задача.
В твоём случае я бы не добавлял в очередь данные, а использовал отдельную таблицу, а в очередь вставлял бы только сам вызов начала обработки. Ну, или можно, конечно, использовать и саму таблицу очередей для хранения данных, но это не совсем использование по назначению, так что отдельная таблица лучше.
Не в сети
ты смеешься ? 3000 инкрементов в секунду в табличку? Да mysql ляжет. Как раз для этого и нужна очередь, а обработка и добавление в базу пачками. По крону например. А если количество возрастет до 100 000 в секунду?
Не в сети
И та же отправка писем, бывает по разному реализована. В маленьком проекте проблем не будет.
Не в сети
- 3000 инкрементов в секунду в табличку?
В чём проблема с созданием отдельной таблицы для хранения пачек данных для фонового процесса, который будет в начале цикла вытаскивать все имеющиеся записи, делать что-то вроде
sqlUPDATE data SET active = 1 WHERE id IN (...)
, и работать с ними, а в конце цикла удалять?
Очереди на мой взгляд в той реализации, которая есть в Laravel, предназначены как раз для атомарных (+ затратных) операций, а не для обработки оных пачками. Для пачек даже особого API не надо создавать.
Не в сети
Я понял что это не те очереди которые мне нужны. Спасибо за советы. А насчет атомарности, я бы поспорил (: Но это уже другая тема (100 серверов, 100 запросов на одни и те же данные, каждый сервер обрабатывает запрос. Атомарность обеспечить очень сложно будет (: )
Спасибо еще раз!
Изменено Ruzarh (22.03.2014 19:32:48)
Не в сети
Страницы 1