Используя приведенный пример и псевдокод, давайте представим, что:
-
recipient.user1
получает 60 сообщений в минуту - , а метод
perform_task()
занимает 2 секунды, чтобы выполнить.
То, что здесь произойдет, очевидно: задержка между поступлением нового сообщения и его обработкой будет только расти со временем, все больше отдаляясь от «обработки в реальном времени».
system throughput = 30 messages/minute
Чтобы обойти это, вы можете создать группу потребителей для user1
. Здесь вы могли бы иметь 4 отдельных python процесса, работающих параллельно, и все 4 были объединены в одну группу для user1
. Теперь, когда приходит сообщение для user1
, один из 4 рабочих его подберет и perform_task()
.
system throughput = 120 message/minute
В вашем примере message.acknowledge()
не на самом деле существует, потому что ваш потоковый читатель один (команды XREAD).
Если бы это была группа, подтверждение сообщений становится необходимым, вот как Redis знает, что один из членов группы действительно обработал это сообщение, поэтому он может «двигаться дальше» (он может забыть тот факт, что это сообщение ожидало подтверждения). Когда вы используете группы, существует небольшая часть серверной логики c для обеспечения того, чтобы каждое сообщение доставлялось одной из рабочих групп потребителей один раз (команды XGROUPREAD). Когда клиент завершил работу, он выдает подтверждение этого сообщения (команды XACK), чтобы «буфер группы потребителей» на стороне сервера мог удалить его и двигаться дальше.
Представьте, если работник умер и никогда не подтвердил сообщение , С группой потребителей вы можете следить за этой ситуацией (используя команды XPENDING) и реагировать на них, например, повторяя попытку обработать то же сообщение у другого потребителя.
Когда вы не используете группы серверу redis не нужно «двигаться дальше», «подтверждение» становится на 100% клиентской / бизнес логи c.