Обрабатываете ли вы максимальное количество задач для каждого потребителя в топи c для данного временного окна? - PullRequest
0 голосов
/ 23 января 2020

Мой производитель генерирует n задач из одного входного сообщения и публикует их в topic.

Требование состоит в том, что из всех отдельных потребителей в группе потребителей topic никто из них следует обработать более 3 из этих n задач в течение 1 часа.

Это означает, что если я хочу немедленно обработать все эти сообщения, мне нужно как минимум ceil(n/3) потребителей. Если число пользователей меньше, чем ceil(n/3), мне нужно каким-то образом отложить сообщение до тех пор, пока за последний час не будет num_processed < 3.

С точки зрения практичности для реализации этого решения, я надеюсь использовать Кафка с Faust [1], но у меня также есть доступ к Redis, если это необходимо.

До сих пор моя идея заключалась в том, чтобы при производстве было как минимум ceil(n/3) потребителей, а затем просто использовать циклическое назначение задачи до topic от производителя. В любом случае это оптимальное решение, потому что оно не требует необходимости ждать до 1 часа для обработки сообщений. Однако это будет работать только до тех пор, пока достаточное количество потребителей d ie, после чего один и тот же потребитель может обработать более 3, скорее всего, в течение 1 часа. Это неприемлемо.

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

[1] https://faust.readthedocs.io/

1 Ответ

0 голосов
/ 23 января 2020

Что-то, что потребовало бы немного больше усилий, но значительно упростило бы фактическую обработку, - это иметь пре-потребителя, который просто ждал бы, пока есть 3 сообщения, которые нужно потребить, упаковал их в «мета-сообщение» и отправьте это в "готовый к обработке " топи c. Это должно быть похоже на упомянутое @ cricket_007, оно не должно фиксироваться до тех пор, пока оно фактически не израсходует 3 сообщения и произведет их в исходящие топи c.

Таким образом, финал потребитель очень прост. Он просто потребляет из топика " ready-to-processing " c, и каждый раз, когда он получает сообщение, вы знаете, , что у него будет 3 события, которые вам нужны. Вы просто обрабатываете их и ждете еще час, пока не сможете снова опросить. Там не будет необходимости согласовывать с другими потребителями.

...