Akka
Дмитрий Орнатский
Qubell
twitter.com/ornatsky
Зачем
• Акторы — объекты, которые вместо того чтобы
просто хранить состояние еще и выполняют код
конкурентно.
• Разделяемое состояние — это плохо, только
иммутабельные сообщения.
• Ручная синхронизация — это утомительно
!
class MyActor extends Actor {!
val log = Logging(context.system, this)!
def receive = {!
case "test" => log.info("received test")!
case _ => sender ! “what’s this?”!
}!
}
Обработка ошибок
Supervision hierarchies
• Акторы образуют иерархию
• Родитель следит за детьми и может либо
перезапускать их в ответ на ошибку, не делать
ничего, либо передавать управление наверх.
Индивидуальные ошибки
!
val breaker =
new CircuitBreaker(context.system.scheduler,
maxFailures = 5,
callTimeout = 10.seconds,
resetTimeout = 1.minute).onOpen(notifyMeOnOpen())
def notifyMeOnOpen(): Unit =
log.warning("My CircuitBreaker is now open, and will not
close for one minute")
Remoting
• Минимально затрагивает код приложения.
Кластеризация
• Кластер — совокупность узлов, которые с
заранее известной степенью точности находятся
в соглашении относительно того, кто входит в
кластер, и кто его возглавляет.
• Amazon Dynamo
Scala
Писать на джаве можно, но выглядит это грустно.
Dispatchers
• Дают акторам процессорное время.
• Например, можно балансировать нагрузку между
акторами.
• Изолировать пулы потоков, потребляемые
группами акторов (Bulkheading).
STM
• Атомарные обновления внутреннего состояния.
Например, для случаев, когда вы не хотите
рестартовать актор целиком.
• Выглядит как блок atomic {…}, внутри которого
присваивания внутри особого вида контейнеров
(агентов) атомарны.
Agents
def transfer(from: Agent[Int], to: Agent[Int], amount: Int): Boolean =
{!
atomic { txn =>!
if (from.get < amount) false!
else {!
from send (_ - amount)!
to send (_ + amount)!
true!
}!
}!
}

Akka и реактивное программирование на JVM

  • 1.
  • 2.
    Зачем • Акторы —объекты, которые вместо того чтобы просто хранить состояние еще и выполняют код конкурентно. • Разделяемое состояние — это плохо, только иммутабельные сообщения. • Ручная синхронизация — это утомительно
  • 3.
    ! class MyActor extendsActor {! val log = Logging(context.system, this)! def receive = {! case "test" => log.info("received test")! case _ => sender ! “what’s this?”! }! }
  • 4.
  • 6.
    Supervision hierarchies • Акторыобразуют иерархию • Родитель следит за детьми и может либо перезапускать их в ответ на ошибку, не делать ничего, либо передавать управление наверх.
  • 7.
    Индивидуальные ошибки ! val breaker= new CircuitBreaker(context.system.scheduler, maxFailures = 5, callTimeout = 10.seconds, resetTimeout = 1.minute).onOpen(notifyMeOnOpen()) def notifyMeOnOpen(): Unit = log.warning("My CircuitBreaker is now open, and will not close for one minute")
  • 8.
  • 9.
    Кластеризация • Кластер —совокупность узлов, которые с заранее известной степенью точности находятся в соглашении относительно того, кто входит в кластер, и кто его возглавляет. • Amazon Dynamo
  • 10.
    Scala Писать на джавеможно, но выглядит это грустно.
  • 11.
    Dispatchers • Дают акторампроцессорное время. • Например, можно балансировать нагрузку между акторами. • Изолировать пулы потоков, потребляемые группами акторов (Bulkheading).
  • 12.
    STM • Атомарные обновлениявнутреннего состояния. Например, для случаев, когда вы не хотите рестартовать актор целиком. • Выглядит как блок atomic {…}, внутри которого присваивания внутри особого вида контейнеров (агентов) атомарны.
  • 13.
    Agents def transfer(from: Agent[Int],to: Agent[Int], amount: Int): Boolean = {! atomic { txn =>! if (from.get < amount) false! else {! from send (_ - amount)! to send (_ + amount)! true! }! }! }