У меня есть несколько распределенных конкурирующих потребителей, каждый из которых отключает сообщения от одной и той же (транзакционной) очереди. Я хочу реализовать каждого потребителя как Idempotent Receiver, поэтому я никогда не обрабатываю одно и то же сообщение более одного раза (для всех потребителей), даже если появляется дубликат. Как я могу это сделать с несколькими потребителями?Как обеспечить идемпотентность сообщений несколькими конкурирующими потребителями?
Моя первая мысль - как-то создать последовательный порядковый номер для каждого сообщения, прежде чем помещать их в очередь, а затем использовать общую таблицу базы данных для координации работы между потребителями. То есть потребитель # 1 обрабатывает сообщение # 1, а затем записывает строку в таблицу БД, говоря «msg # 1 обрабатывается» (хочу, чтобы он в базе данных обеспечивал долговечность). Когда потребитель готов обработать сообщение, он заглядывает в следующий доступный в очереди, консультируется с общей таблицей БД и определяет, является ли это следующим msg в порядке. Если это так, он вытаскивает его из очереди. Если нет, он игнорирует это.
Таким образом, мне нужно только сохранить последнее обработанное сообщение (так как для всех msgs есть последовательный порядковый номер), мне не нужно использовать буфер, хранящий идентификаторы всех сообщений, полученных с помощью согласованного окна ', и сообщения всегда обрабатываются последовательно (это то, что я хочу для этого сценария).
Любопытно, есть ли лучший способ? Меня беспокоит стоимость запросов к базе данных всякий раз, когда мне нужно обработать сообщение.
Если ответ «это зависит от структуры», то я имел в виду MSMQ
Если моя логика обработки API/сообщения разработана таким образом, чтобы быть идемпотентно тогда да, мне не нужно беспокоиться о получении дубликатов сообщи. Это не относится к моему сценарию. Мне нужно отфильтровывать повторяющиеся сообщения, а не только для одного экземпляра пользователя, но в нескольких экземплярах. – emertechie
Но что, если я единственный способ гарантировать идемпотентность - избежать побочных эффектов во второй раз? –