Laravel по-русски

Русское сообщество разработки на PHP-фреймворке Laravel.

Ты не вошёл. Вход тут.

#1 21.03.2014 17:34:30

Ruzarh
Откуда: СПБ
Сообщений: 27

Queue Массовый POP

Раз уж я начал задавать много вопросов, то еще один назрел. Как работать с очередями. 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]]); 

А как получить массово из очереди не знаю((

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

Может что то я упустил. Вообще не нашел инфы по очередям, кроме анонимных функций и методов класса.

Не в сети

#2 22.03.2014 03:13:17

Re: Queue Массовый POP

Очередь на то и очередь, что «массово» элементы из нее не предполагается обрабатывать и удалять. Каждый элемент должен быть отдельной самодостаточной задачей, которая будет выполняться одним потоком.

Не в сети

#3 22.03.2014 17:58:16

Ruzarh
Откуда: СПБ
Сообщений: 27

Re: Queue Массовый POP

У меня есть статистика, в меня обновляется 10 000 000 полей в час. Как раз очередь, и подразумевает, собирать одинаковые данные в поле, а потом их пачкой обрабатывать. Как раз обработку каждого отдельно не вижу смысла ни какого, если это не перекодирование фильма. Я так понял что нет такого способа ((

Не в сети

#4 22.03.2014 18:04:30

Ruzarh
Откуда: СПБ
Сообщений: 27

Re: Queue Массовый POP

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

Не в сети

#5 22.03.2014 18:17:27

Re: Queue Массовый POP

  1. Как раз очередь, и подразумевает, собирать одинаковые данные в поле, а потом их пачкой обрабатывать.

Этиот получается не очередь, а фоновый процесс (worker), который бесконечно обрабатывает поток входящих данных. Очередь — это «задачи», не даром там есть методы типа remove(). Например, отправка e-mail — один e-mail — одна задача.

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

Не в сети

#6 22.03.2014 18:39:26

Ruzarh
Откуда: СПБ
Сообщений: 27

Re: Queue Массовый POP

ты смеешься ? 3000 инкрементов в секунду в табличку? Да mysql ляжет. Как раз для этого и нужна очередь, а обработка и добавление в базу пачками. По крону например.  А если количество возрастет до 100 000 в секунду?

Не в сети

#7 22.03.2014 18:40:35

Ruzarh
Откуда: СПБ
Сообщений: 27

Re: Queue Массовый POP

И та же отправка писем, бывает по разному реализована. В маленьком проекте проблем не будет.

Не в сети

#8 22.03.2014 19:05:54

Re: Queue Массовый POP

  1. 3000 инкрементов в секунду в табличку?

Каких инкрементов? Куда?

В чём проблема с созданием отдельной таблицы для хранения пачек данных для фонового процесса, который будет в начале цикла вытаскивать все имеющиеся записи, делать что-то вроде sqlUPDATE data SET active = 1 WHERE id IN (...), и работать с ними, а в конце цикла удалять?

Очереди на мой взгляд в той реализации, которая есть в Laravel, предназначены как раз для атомарных (+ затратных) операций, а не для обработки оных пачками. Для пачек даже особого API не надо создавать.

Не в сети

#9 22.03.2014 19:32:34

Ruzarh
Откуда: СПБ
Сообщений: 27

Re: Queue Массовый POP

Я понял что это не те очереди которые мне нужны. Спасибо за советы. А насчет атомарности, я бы поспорил (: Но это уже другая тема (100 серверов, 100 запросов на одни и те же данные, каждый сервер обрабатывает запрос. Атомарность обеспечить очень сложно будет (:   )

Спасибо еще раз!

Изменено Ruzarh (22.03.2014 19:32:48)

Не в сети

Подвал раздела