S
S
SimBioT192018-08-21 14:29:38
PHP
SimBioT19, 2018-08-21 14:29:38

How to solve a problem with parallel data processing?

У меня есть API, на которое постоянно приходит очень много данных от разных клиентов.
В ответ на запрос я отдаю код 200 и складываю данные в очередь redis.
Данные нужно обрабатывать как можно быстрее, поэтому у меня 50 воркеров, собирающих данные из очереди и параллельно обрабатывающих их.
Но тут же возникает проблема — данные каждого отдельного клиента обязательно должны обрабатываться последовательно, то есть вариант с просто 50 воркерами не доходит.
Как силами PHP (и не только) эффективно решить такую задачу?

Answer the question

In order to leave comments, you need to log in

2 answer(s)
Александр Аксентьев, 2018-08-21
@Sanasol Куратор тега PHP

Так вам вариант и без воркеров не подходит потому что вебсервер/php-fpm обслуживается в несколько процессов в любом случае. И если данные приходят одновременно, то не будет никакой последовательности.
В общем задача нерешаемая в такой трактовке я бы сказал.
Непонятно что приходит, почему по очереди надо и т.д.
Если в данных не содержится никакого признака с порядковым номером, то все решения так или иначе упрутся в то что данные могут прилететь одновременно и обрабатываться параллельно и что тогда делать?
Если отбросить пункт про
то решение это складывать данные как угодно, а потом синхронно обрабатывать.
Без этого разруливать логику кодом надо в любом случае, проверять есть ли более ранние данные или что-то такое. Но опять же все это без конкретики в пустоту.

D
dtBlack, 2018-08-21
@dtBlack

Вариантов решения, на скорый взгляд, я вижу два:
1. Создать таблицу(массив) блокировок, то есть при начале обработки данных пользователя добавляем его в таблицу блокировки. по окончанию удаляем. При выборе задания пропускаем те на пользователе которого есть блокировка. Из минусов, возможно придется городить костыль для пропуска элемента в списке, я с redis-ом не работал.
1.1. то же самое, что и 1, но не пропускать, а взять данные и ждать удаления пользователя из блокировки. Из минусов, потеря времени на ожидании, зато без костылей.
2. Уйти от очереди данных, к очереди пользователей. То есть одномерной очереди к "двумерной очереди". Первый минус, придется менять логику и тд., а второй то что в итоге вместо очереди мы получим какую то дикость и redis возможно уже не подойдет. :)

Didn't find what you were looking for?

Ask your question

Ask a Question

731 491 924 answers to any question