Обнаружение идентичных необработанных сообщений в Azure Service Bus Queue - PullRequest
0 голосов
/ 23 апреля 2020

Мы строим систему для предварительного расчета всех цен для всех наших клиентов. Основываясь на некотором триггере (например, изменении прайс-листа) в нашей ERP, мы поместим все затронутые номера клиентов в очередь, а функция Azure, прослушивающая эту очередь, пересчитает цены для этого конкретного c клиента.

Пример: изменение выполняется в прайс-листе, и пользователь нажимает кнопку Сохранить. Это изменение затронуло 3000 клиентов и добавлено в очередь расчета. Если расчет занимает две секунды, и мы можем сделать 10 вычислений параллельно, цены последнего клиента будут сделаны через 3000 * 2/10 = 600 секунд. Пока номер клиента находится в очереди, пользователь вносит другое изменение и нажимает кнопку Сохранить. В этом случае мы хотели бы исключить добавление всех номеров клиентов, которые уже присутствуют в очереди.

Вопрос: Azure В очереди служебной шины есть функция обнаружения дубликатов, но она основана на времени. Существуют ли другие способы избежать добавления сообщения в очередь, если другое сообщение с таким же содержимым уже находится в очереди?

Примечание: все остальные ресурсы находятся в Azure, поэтому мы смотрим только на Azure основанные очереди и решения для событий.

1 Ответ

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

Azure Очередь служебной шины имеет функцию обнаружения дубликатов, но она основана на времени. Существуют ли другие способы избежать добавления сообщения в очередь, если другое сообщение с таким же содержимым уже находится в очереди?

Обнаружение дубликатов основано на идентификаторе сообщения во времени. Если вы хотите использовать дедупликацию на основе содержимого, вам необходимо превратить идентификатор сообщения в содержимое ha sh. Таким образом, один и тот же контент будет генерировать тот же идентификатор сообщения, и последующие сообщения будут удалены. Я подробно описал эту идею в своем сообщении .

Обновление

Из комментария к ответу:

Это работает только для удаленных вещей в очереди? Если мое сообщение было обработано в течение 5 минут go, я определенно хочу перезапустить его. Но если мое сообщение все еще находится в очереди, я не хочу добавлять его снова.

Это не так, как работает дедупликация. Ему не важно, находится сообщение в очереди или нет, он смотрит на идентификатор сообщения и проверяет, было ли обработано сообщение с идентичным идентификатором в пределах временного окна дедупликации. Если ответ «да», сообщение будет считаться дубликатом и будет отклонено. В противном случае сообщение будет обработано. Если промежуток времени покажет последнее сообщение с таким идентификатором, прошло, сообщение не будет считаться дубликатом и будет обработано.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...