"Что?" Вы спрашиваете: «Этот заголовок не имеет никакого смысла».
Учтите следующее:
Задания с разными идентификаторами могут обрабатываться асинхронно, но задания с одинаковым идентификатором должны обрабатываться синхронно и в порядке очереди.
Моя текущая реализация создает подпрограмму go для обработки заданий для каждого конкретного идентификатора и выглядит примерно так:
func FanOut() chan<- *Job {
channel := make(chan *Job)
routines = make(map[string]chan<- *Job)
go func() {
for j := range channel {
r, found := routines[j.id]
if !found {
r = Routine()
routines[j.id] = r
}
r <- j
}
}()
return channel
}
Кажется, это работает хорошо (в текущем тестировании), но создание тысяч подпрограмм го может быть не лучшим подходом? Кроме того, блоки кода разветвления, если не используется буферный канал.
Вместо набора процедур go (выше) я рассматриваю возможность использования коллекции sync.Mutex. Идея состоит в том, чтобы иметь пул подпрограмм go, которые сначала должны установить блокировку мьютекса, соответствующую идентификатору задания.
Существуют ли какие-либо шаблоны Go, подходящие для удовлетворения этих требований?
Есть ли лучший подход?