2009-11-03 4 views
4

У меня есть несколько распределенных конкурирующих потребителей, каждый из которых отключает сообщения от одной и той же (транзакционной) очереди. Я хочу реализовать каждого потребителя как Idempotent Receiver, поэтому я никогда не обрабатываю одно и то же сообщение более одного раза (для всех потребителей), даже если появляется дубликат. Как я могу это сделать с несколькими потребителями?Как обеспечить идемпотентность сообщений несколькими конкурирующими потребителями?

Моя первая мысль - как-то создать последовательный порядковый номер для каждого сообщения, прежде чем помещать их в очередь, а затем использовать общую таблицу базы данных для координации работы между потребителями. То есть потребитель # 1 обрабатывает сообщение # 1, а затем записывает строку в таблицу БД, говоря «msg # 1 обрабатывается» (хочу, чтобы он в базе данных обеспечивал долговечность). Когда потребитель готов обработать сообщение, он заглядывает в следующий доступный в очереди, консультируется с общей таблицей БД и определяет, является ли это следующим msg в порядке. Если это так, он вытаскивает его из очереди. Если нет, он игнорирует это.

Таким образом, мне нужно только сохранить последнее обработанное сообщение (так как для всех msgs есть последовательный порядковый номер), мне не нужно использовать буфер, хранящий идентификаторы всех сообщений, полученных с помощью согласованного окна ', и сообщения всегда обрабатываются последовательно (это то, что я хочу для этого сценария).

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

Если ответ «это зависит от структуры», то я имел в виду MSMQ

ответ

1

Точка идемпотентного приемника является то, что не имеет значения, если сообщение обрабатывается несколько раз. Следовательно, идемнотентные приемники не должны somhow обнаружить, что сообщение является дубликатом, они могут просто обработать его, как обычно ...

Так что либо ваш ресивер не идемпотентен, или вы беспокоитесь понапрасну ...

+0

Если моя логика обработки API/сообщения разработана таким образом, чтобы быть идемпотентно тогда да, мне не нужно беспокоиться о получении дубликатов сообщи. Это не относится к моему сценарию. Мне нужно отфильтровывать повторяющиеся сообщения, а не только для одного экземпляра пользователя, но в нескольких экземплярах. – emertechie

+0

Но что, если я единственный способ гарантировать идемпотентность - избежать побочных эффектов во второй раз? –

0

Andrew -

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

Беста, Генри

Смежные вопросы