Согласно документу, рекомендуется реализовать эффективную сериализацию с Protobuf или аналогичной для нашего пользовательского типа данных. Однако я также обнаружил, что встроенные типы данных (например, GCounter
) расширяет ReplicatedDataSerialization
(см. code ), что в соответствии с scaladoc,
Черта маркера для ReplicatedData, сериализуемой akka.cluster.ddata.protobuf.ReplicatedDataSerializer.
Я задаюсь вопросом, должен ли я реализовать свою собственную реализацию сериализатора или просто использовать ту из akka. Какая польза от реализации моей? Поскольку моя реализация пользовательского типа данных (см. код или ниже) действительно похожа на {{X0 }} Я чувствую, что Akka хорошо подойдет для моего случая.
import akka.cluster.ddata.{GCounter, Key, ReplicatedData, ReplicatedDataSerialization, SelfUniqueAddress}
/**
* Denote a fraction whose numerator and denominator are always growing
* Prefer such a custom ddata structure over using 2 GCounter separately is to get best of both worlds:
* As lightweight as a GCounter, and can update/get both values at the same time like a PNCounterMap
* Implementation-wise, it borrows from PNCounter a lot
*/
case class FractionGCounter(
private val numerator: GCounter = GCounter(),
private val denominator: GCounter = GCounter()
) extends ReplicatedData
with ReplicatedDataSerialization {
type T = FractionGCounter
def value: (BigInt, BigInt) = (numerator.value, denominator.value)
def incrementNumerator(n: Int)(implicit node: SelfUniqueAddress): FractionGCounter = copy(numerator = numerator :+ n)
def incrementDenominator(n: Int)(implicit node: SelfUniqueAddress): FractionGCounter =
copy(denominator = denominator :+ n)
override def merge(that: FractionGCounter): FractionGCounter =
copy(numerator = this.numerator.merge(that.numerator), denominator = this.denominator.merge(that.denominator))
}
final case class FractionGCounterKey(_id: String) extends Key[FractionGCounter](_id) with ReplicatedDataSerialization
3 ответа
Вы можете определенно использовать встроенный ReplicatedDataSerializer для сериализации GCounter
объектов, лежащих в основе вашего пользовательского CRDT.
Однако, как вы можете видеть, глядя на этот класс, он явно перечисляет типы, которые он может сериализовать, то есть он не сможет сериализовать ваши FractionGCounter
объекты.
Вам все еще понадобится ваш собственный сериализатор, который понимает объекты FractionGCounter
(и который может использовать встроенный ReplicatedDataSerializer 'inside').
AFAIU, они не предлагают реализовать собственный механизм сериализации, а используют одно из существующих на рынке решений, которые просто не являются частью akka, поскольку не являются специфичными для akka. Однако они могут быть легко включены, и вы наверняка найдете сторонние библиотеки, которые интегрируют их в akka.
Не существует простого ответа на вопрос, какой из них будет лучшим, так как он сильно зависит от конкретного варианта использования. Здесь вы обсудите производительность нескольких наиболее популярных опций:
Сравнение производительности Thrift, протокольных буферов, JSON, EJB, другой?
Вы можете начать с использования встроенной сериализации akka и позже заменить ее чем-то более подходящим.
Помимо сказанного Арно, одним из важных аспектов сериализации является миграция схемы. Очевидно, что внутренние Akka связаны с жизненным циклом соответствующих модулей Akka. Следовательно, я бы обязательно написал свой.
Похожие вопросы
Связанные вопросы
Новые вопросы
scala
Scala - это язык программирования общего назначения, в основном предназначенный для виртуальной машины Java. Разработанный для краткого, элегантного и безопасного для типов представления общих шаблонов программирования, он сочетает в себе как императивный, так и функциональный стили программирования. Его ключевые особенности: продвинутая система статического типа с выводом типа; типы функций; сопоставления с образцом ; неявные параметры и преобразования; перегрузка оператора; полная совместимость с Java; совпадение