У нас есть настройка Scala Akka ActorSystem, которая обрабатывает миллионы событий в день, исторически мы редко находим 1 или 2 события, которые обрабатывались дважды, но в последнее время количество дублированных событий увеличилось до 100 в некоторые дни.
Наша настройка упрощена следующим образом:
// EventJob runs once every 10 seconds
class EventJob extends Actor {
val EventListnerPoolOfActors = ActorSystem().actorOf(
RoundRobinPool(10)
.props(Props(classOf[EventHandler])),
"InjectorActorID"
)
override def preStart(): Unit = {
self ! ReceivedJobStart()
}
def receive: Actor.Receive = {
case ReceivedJobStart() =>
doWork()
context.system.scheduler.scheduleOnce(10, self, ReceivedJobStart())
}
def doWork(): Future[Unit] = {
// returns Future[Seq[Event]]
getUnprocessEvents().map { x =>
{
// pass each Event to an EventHandler Actor to process
for (a <- 0 to x.size) {
EventListnerPoolOfActors ! x(a)
}
}
}
}
}
class EventHandler extends Actor {
def receive = {
...
}
}
Каждое событие имеет уникальный идентификатор, в наших журналах показано, что какое-то событие было обработано дважды (переходит к EventHandler.receive) в течение миллисекунд друг от друга.Все действующие лица являются локальными.
AFAIK. Надежность доставки сообщений по умолчанию не более одного раза, что может быть причиной того, что увеличивающееся количество сообщений доставляется более одного раза, и как уменьшить эту проблему?
Наша система настроена на обработку дубликатов, мы просто не знаем, почему она в последнее время увеличивается, и хотели бы уменьшить ее.