Это РАННИЙ ПРОСМОТР библиотеки для репликации данных в кластере АККА. Она представляет собой реплицированное хранилище данных в памяти, поддерживающее требования низкой задержки и высокой доступности. Данные должны быть так называемыми бесконфликтными реплицированными типами данных (CRDT), то есть они предоставляют монотонную функцию слияния, и изменения состояния всегда сходятся.
Для хорошего введения в CRDT вам следует посмотреть доклад «Последовательные структуры данных» Шона Криббса (Sean Cribbs).
CRDT нельзя использовать для всех типов задач, но когда это возможно, они обладают очень хорошими свойствами:
Встроенные типы данных:
GCounter
, PNCounter
;LWWRegister
, Flag
;GSet
, ORSet
;ORMap
, LWWMap
, PNCounterMap
.Вы можете использовать свои собственные пользовательские типы данных, реализовав функцию merge
признака ReplicatedData
. Обратите внимание, что CRDT обычно хорошо сочетаются друг с другом, то есть вы можете использовать предоставленные типы данных для создания более богатых структур данных.
Актор Replicator
реализует инфраструктуру для репликации данных. Он использует прямую репликацию и распространение на основе сплетен. Актор Replicator
запускается на каждом узле кластера или группе узлов, помеченных определённой ролью. Он связывается с другими экземплярами Replicator
, работающими на других узлах, с тем же путём (без адреса). Для удобства он обычно используется с расширением DataReplication
Akka.
Краткий пример того, как его использовать:
class DataBot extends Actor with ActorLogging {
import DataBot._
import Replicator._
val replicator = DataReplication(context.system).replicator
implicit val cluster = Cluster(context.system)
import context.dispatcher
val tickTask = context.system.scheduler.schedule(5.seconds, 5.seconds, self, Tick)
replicator ! Subscribe("key", self)
def receive = {
case Tick =>
val s = ThreadLocalRandom.current().nextInt(97, 123).toChar.toString
if (ThreadLocalRandom.current().nextBoolean()) {
// add
log.info("Adding: {}", s)
replicator ! Update("key", ORSet(), WriteLocal)(_ + s)
} else {
// remove
log.info("Removing: {}", s)
replicator ! Update("key", ORSet(), WriteLocal)(_ - s)
}
case _: UpdateResponse => // ignore
case Changed("key", data: ORSet) =>
log.info("Current elements: {}", data.value)
}
override def postStop(): Unit = tickTask.cancel()
}
Полный исходный код этого примера находится в DataBot.scala
(https://github.com/patriknw/akka-data-replication/blob/v0.8/src/test/scala/akka/contrib/datareplication/sample/DataBot.scala).
Более подробную документацию можно найти в ScalaDoc Replicator
и связанных классов.
Два других примера:
VotingService
(https://github.com/patriknw/akka-data-replication/blob/v0.8/src/multi-jvm/scala/akka/contrib/datareplication/VotingContestSpec.scala#L30);ShoppingCart
(https://github.com/patriknw/akka-data-replication/blob/v0.8/src/multi-jvm/scala/akka/contrib/datareplication/ReplicatedShoppingCartSpec.scala#L31).Последняя версия akka-data-replication
— 0.8
. Эта версия зависит от Akka 2.3.6 и кросс-совместима со Scala 2.10.4 и 2.11.4.
Добавьте следующие строки в файл build.sbt
:
resolvers += "patriknw at bintray" at "http://dl.bintray.com/patriknw/maven"
libraryDependencies += "com.github.patriknw" %% "akka-data-replication" % "0.8"
Сильная согласованность в конечном счёте и типы данных с бесконфликтной репликацией. Доклад Марка Шапиро.
Всестороннее исследование конвергентных и коммутативных типов данных с репликацией. Статья Марка Шапиро и соавторов.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Комментарии ( 0 )