Структура данных Scala для дедупликации работы, выполняемой akka

Я хотел бы реализовать структуру данных в scala, которая позволила бы мне дедуплицировать работу, выполняемую моей программой. Программа построена на фреймворке akka-scala.

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

Если такой тип сообщения не найден в этой структуре данных, я бы сохранил его там и начал обработку.

Пока я думаю о чем-то вроде mutable.Map[Long, Seq[ETLMessageMeta]]

Есть ли что-нибудь лучше для такой задачи?


person Vasily802    schedule 21.09.2017    source источник


Ответы (1)


Если каждая единица работы однозначно идентифицируема, то Map звучит как хорошая подгонка. Однако вместо использования mutable.Map используйте immutable.Map, который является var, чтобы гарантировать, что это изменяемое состояние не просочится за пределы рабочего актора. Например:

class Worker extends Actor {
  var inProgress = immutable.Map[Long, Seq[ETLMessageMeta]]()

  def receive = ???
}
person Jeffrey Chung    schedule 21.09.2017