Создает ли неизменный набор данных между актерами дублирующий набор данных внизу? - PullRequest
1 голос
/ 09 апреля 2020

У меня есть случай, когда каждый узел кластера Akka (JVM) имеет одного действующего лица, ответственного за создание и поддержание (READ / WRITE) карты некоторых огромных объектов. Другие актеры в том же узле должны совместно использовать (READ) карту (карта будет передана в какую-либо стороннюю библиотеку, поэтому нет способа изменить доступ к карте с помощью сообщений Akka).

case class ShareMap(m: Map[String, HugeObject])

class MapOwner extends Actor {
  var m: immutable.Map[String, HugeObject] = ???
  override def receive: Receive = {
    case UpdateMap(delta) =>
      val m2 = m ++ delta
      this.m = m2
    case GetMap =>
      sender ! ShareMap(m)
  }
}

I хотите поделиться неизменной картой, отправив ссылку на карту актерам в той же JVM.

Мой вопрос: для моего случая (в рамках той же JVM) будет ли гарантировано, что дублированный объект карты не будет создан? У меня есть некоторые опасения по поводу использования памяти и производительности.

1 Ответ

2 голосов
/ 09 апреля 2020

Согласно документам

Сообщения, которые актеры Akka отправляют друг другу, являются объектами JVM (например, экземплярами Scala классов case). Передача сообщений между актерами, живущими в одной и той же JVM, проста. Это делается через передачу ссылок. Однако сообщения, которые должны выходить из JVM, чтобы достичь актера, работающего на другом хосте, должны иметь go некоторую форму сериализации (т. Е. Объекты должны быть преобразованы в байтовые массивы и из них).

Это должна быть просто ссылка.

...