Не существует готового решения для вашей проблемы , но это можно легко сделать разными способами.
Самый простой способ - использовать на основе очередиШаблон выравнивания нагрузки в сочетании с шаблоном Конкурирующие потребители .Он состоит из создания очереди , добавления работы в очередь, и каждый экземпляр получает одно сообщение для обработки этой работы, если один экземпляр выходит из строя и сообщение не обрабатывается, оно возвращается в очередь идругой экземпляр заберет его.
Таким образом, вам не нужно беспокоиться о количестве запущенных экземпляров, сбоях и т. д.
Что касается работы, помещаемой в очередь, она будетзависит от того, хотите ли вы выполнить пакетную обработку или обработать элемент по элементу.
элемент по элементу , вы помещаете одно сообщение в очередь для каждого обрабатываемого элемента, это простой способобрабатывать работу, и каждый экземпляр обрабатывает одно сообщение за раз или несколько сообщений параллельно.
В пакете вы можете поместить сообщение, представляющее список элементов, подлежащих обработке, и каждый экземпляробрабатывать этот пакет до его завершения, это немного сложнее, потому что вам, возможно, придется обрабатывать ход выполняемой работы, в случае неудачи, в следующий раз, когда вы сможетепродолжить с того места, где оно остановилось.
Подход с использованием очереди является реактивным, в этом случае работа должна быть помещена в очередь для запуска обработки, если вам нужен упреждающий подход и необходимо отслеживать, какойработа идет к тому, кому, возможно, вам лучше использовать какой-то другой подход, например лизинговый механизм , где каждый экземпляр приобретает аренду, принадлежащую этому экземпляру, до тех пор, пока не освободит аренду, это будет более целесообразно, когда выработать с секционированными данными или другим механизмом, где вы можете легко разделить нагрузку.
Что касается проблемы с идентификатором, можно указать InstanceId той реплики, на которой вы находитесь.StatelessService.Context.InstanceId
это не последовательный идентификатор, а случайное число.Это лучше, чем использовать идентификатор узла, потому что у вас может быть несколько разделов на одном узле, и идентификатор будет конфликтовать друг с другом.Если вы решите использовать именованные разделы, вы можете вместо этого использовать порядок в имени раздела, чтобы у каждого раздела было последовательное имя.
Стоит отметить, что у сервисной фабрики есть ограничение, которое не делает 't разрешить службам иметь несколько реплик на одном узле , поскольку из-за этого ограничения вам, возможно, придется проектировать свои службы с учетом этого, иначе вы не сможете масштабироваться после достижения предела.Кроме того, в той же теме обсуждаются подходы к обработке нескольких распределенных элементов, которые могут дать вам некоторые идеи.