Рассмотрим одновременных карт , которые обеспечивают атомы c операций и
могут быть доступны сразу нескольким потокам
например
import java.util.concurrent.ConcurrentHashMap
import scala.jdk.CollectionConverters._
case class User(id: Int, name: String)
val chm: collection.concurrent.Map[Int, User] = new ConcurrentHashMap[Int, User]().asScala
chm.addOne(1 -> User(1, "Picard"))
Другой вариант заключается в переносе изменяемого состояния с помощью Akka Actor , который гарантирует
обработка одного сообщения перед обработкой следующего сообщения тем же субъектом
возможно, что-то вроде этого
class MyActor() extends Actor {
private val _mutableSate = mutable.Map[Int, User]()
def insertUser(u: User): Unit = _mutableSate.addOne(u.id, u)
}
Относительно того, следует ли использовать коллекцию или базу данных в памяти, IMO, это техническое решение, которое имеет компромиссы, но не дает четких ответов. Например, можно применить принцип минимальной мощности рассуждений и сказать, что если коллекции решают проблему адекватно, то нет необходимости go с более мощным решением для базы данных. С другой стороны, следует также учитывать масштаб решения. Например, будут ли коллекции иметь достаточно выразительный механизм запросов, если есть несколько таблиц, которые необходимо объединить?