Redis Stream - Заказать Гарантия событий - PullRequest
0 голосов
/ 16 апреля 2020

Я использовал Кафку. В Кафке порядок проведения мероприятия гарантируется с помощью идентификатора. У нас есть что-нибудь подобное в Redis? Если у меня есть поток событий заказов и несколько потребителей в группе потребителей, все события, связанные с одним конкретным заказом, должны обрабатываться последовательно.


Событие - сообщение / уведомление / все, что произошло, о котором необходимо объявить. Как событие, созданное заказом, событие отмененное заказом.


Чтобы быть более понятным,

Допустим, user1 заказывает продукт под названием ABC1 через службу заказа. Этот сервис-заказ публикует purchase-order-related Страм. Пользователь user1 изменяет / обновляет количество ABC1, для которого служба заказа публикует другое событие в том же потоке, что и второе сообщение. Здесь ID сообщений может быть другим. Но есть ли гарантия, что эти 2 сообщения будут обработаны одним единственным потребителем в группе потребителей, когда есть несколько потребителей? Потому что эти 2 сообщения / события связаны и должны обрабатываться последовательно. Kafka предоставляет гарантию путем секционирования, используя идентификатор заказа ABC1 покупки продукта.

1 Ответ

1 голос
/ 19 апреля 2020

Отказ от ответственности:

  • этот ответ предполагает, что вы имеете в виду Redis Streams (введено в Redis 5.0).
  • Я не Конечно, что вы подразумеваете под «событием», я прокомментировал в ОП с просьбой дать разъяснения. Я постараюсь ответить без этих уточнений и отредактирую свой ответ, как только вы проясните понятия. См. Мое редактирование в конце.

В идентификаторах Redis Streams также используется последовательный идентификатор, как объяснено в документации по команде XADD :

Идентификаторы задаются двумя числами, разделенными символом - [...]
Обе величины являются 64-битными числами. Когда идентификатор генерируется автоматически, первая часть - это время Unix в миллисекундах для экземпляра Redis, генерирующего идентификатор. Вторая часть является просто порядковым номером и используется для различения guish идентификаторов, сгенерированных за одну и ту же миллисекунду.
Идентификаторы гарантированно всегда будут инкрементными

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

Однако на это могут влиять проблемы сети. Рассмотрим следующее (NETWORK - это когда сообщение находится в пути):

Time    Cli1        Cli2        Redis Server
   1    XADD -----------------> Processing Cli1 Request
   2            NETWORK <------ Answer: ID 1
   3                XADD -----> Processing Cli2 Request
   4                ID 2 <----- Answer: ID 2
   5    ID 1 <--NETWORK

Если Cli1 и Cli2 сравнивают свои ответы и время получения, кажется , что Сервер обработал запросы в неправильном порядке, но для сервера все в порядке.
Кроме того, если запрос Cli2 поступил, пока сервер обрабатывал запрос Cli1, он дождался бы завершения обработки Cli1, чтобы начать обработку Cli2.

Отредактируйте после того, как ОП отредактировал вопрос

В разделе Различия с разделами Kafka на странице документации Введение в Redis Streams указано, что:

Если вы используете 1 поток -> N потребителей, вы балансируете нагрузку на N потребителей, однако в этом случае сообщения об одном и том же логическом элементе могут потребляться не по порядку, поскольку данный потребитель может обрабатывать сообщение 3 быстрее, чем другой потребитель обрабатывает сообщение. 4.

Таким образом, в основном разделы Kafka больше похожи на использование N различных ключей Redis. В то время как группы потребителей Redis представляют собой систему балансировки нагрузки на стороне сервера для сообщений от данного потока к N различным потребителям.

Таким образом, функция групп потребителей в Redis не служит той же цели, что и Kafka.

Можно выполнить желаемую группировку, используя несколько клавиш Redis и пометив каждый использованный заказ, но (AFAIK) Redis не предоставляет эту функцию, поэтому вам нужно реализовать ее самостоятельно.

...