akka и реактивное программирование на jvm

13
Akka Дмитрий Орнатский Qubell twitter.com/ornatsky

Upload: open-it

Post on 25-Jan-2015

317 views

Category:

Engineering


1 download

DESCRIPTION

Concurrency — на самом деле важно, заняты ли параллельные треды совместной работой. Все знают, что разделяемое состояние — плохая идея. Альтернатива — передача immutable-сообщений для обмена данными. Эксепшены в многопоточной программе — головная боль. Альтернатива — supervision hierarchies. Переход от одной машины к кластеру. Точки расширения: mailboxes, dispatchers. Дополнительные возможности: транзакционная память.

TRANSCRIPT

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

AkkaДмитрий Орнатский

Qubell twitter.com/ornatsky

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

Зачем

• Акторы — объекты, которые вместо того чтобы просто хранить состояние еще и выполняют код конкурентно.

• Разделяемое состояние — это плохо, только иммутабельные сообщения.

• Ручная синхронизация — это утомительно

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

!

class MyActor extends Actor {!

val log = Logging(context.system, this)!

def receive = {!

case "test" => log.info("received test")!

case _ => sender ! “what’s this?”!

}!

}

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

Обработка ошибок

Page 5: Akka и реактивное программирование на JVM
Page 6: Akka и реактивное программирование на JVM

Supervision hierarchies

• Акторы образуют иерархию

• Родитель следит за детьми и может либо перезапускать их в ответ на ошибку, не делать ничего, либо передавать управление наверх.

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

Индивидуальные ошибки!

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")

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

Remoting

• Минимально затрагивает код приложения.

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

Кластеризация

• Кластер — совокупность узлов, которые с заранее известной степенью точности находятся в соглашении относительно того, кто входит в кластер, и кто его возглавляет.

• Amazon Dynamo

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

Scala

Писать на джаве можно, но выглядит это грустно.

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

Dispatchers

• Дают акторам процессорное время.

• Например, можно балансировать нагрузку между акторами.

• Изолировать пулы потоков, потребляемые группами акторов (Bulkheading).

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

STM

• Атомарные обновления внутреннего состояния. Например, для случаев, когда вы не хотите рестартовать актор целиком.

• Выглядит как блок atomic {…}, внутри которого присваивания внутри особого вида контейнеров (агентов) атомарны.

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

Agentsdef 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!

}!

}!

}