Я хотел бы использовать актеров в программе, где у меня будет какое-то ограничение, относящееся к тому, чтобы рассматривать некоторых актеров, как будто они были очередями. Например, предположим, у меня есть какая-то внешняя система, к которой применяются события изменений, а также некоторый кеш данных внешней системы. Итак, у меня есть 2 актера:
ChangeApplicationActor
CacheActor
Как часть ChangeApplicationActor
, когда я применяю изменение к некоторому объекту X
во внешней системе, я хочу отправить событие, чтобы сообщить CacheActor
о синхронизации:
val changeApplicationActor = actor {
loop {
react {
case ChangeInstruction(x) =>
externalSystem.applyChange(x)
cacheActor ! Sync(x)
}
}
}
Но у меня теперь есть два требования:
- У
CacheActor
есть внутреннее состояние, и в идеале я бы хотел, чтобы он обрабатывал Sync
инструкций последовательно
- Если я получу входящую почту
CacheActor
, содержащую две Sync(x)
инструкции для одного и того же значения x
, тогда я хотел бы проигнорировать второе (т.е. у меня должен быть только один ожидающий * 1027) * инструкция для любого заданного значения x
)
Есть ли способ заставить актера быть однопоточным? Есть ли способ получить доступ к почтовому ящику актера и удалить дубликаты событий? Могу ли я не избежать реализации CacheActor
, так как не Actor ?