Согласно документу, рекомендуется реализовать эффективную сериализацию с 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
0
Yik San Chan 11 Фев 2020 в 00:24

3 ответа

Лучший ответ

Вы можете определенно использовать встроенный ReplicatedDataSerializer для сериализации GCounter объектов, лежащих в основе вашего пользовательского CRDT.

Однако, как вы можете видеть, глядя на этот класс, он явно перечисляет типы, которые он может сериализовать, то есть он не сможет сериализовать ваши FractionGCounter объекты.

Вам все еще понадобится ваш собственный сериализатор, который понимает объекты FractionGCounter (и который может использовать встроенный ReplicatedDataSerializer 'inside').

2
Arnout Engelen 11 Фев 2020 в 08:22

AFAIU, они не предлагают реализовать собственный механизм сериализации, а используют одно из существующих на рынке решений, которые просто не являются частью akka, поскольку не являются специфичными для akka. Однако они могут быть легко включены, и вы наверняка найдете сторонние библиотеки, которые интегрируют их в akka.

Не существует простого ответа на вопрос, какой из них будет лучшим, так как он сильно зависит от конкретного варианта использования. Здесь вы обсудите производительность нескольких наиболее популярных опций:
Сравнение производительности Thrift, протокольных буферов, JSON, EJB, другой?

Вы можете начать с использования встроенной сериализации akka и позже заменить ее чем-то более подходящим.

0
michaJlS 10 Фев 2020 в 22:05

Помимо сказанного Арно, одним из важных аспектов сериализации является миграция схемы. Очевидно, что внутренние Akka связаны с жизненным циклом соответствующих модулей Akka. Следовательно, я бы обязательно написал свой.

1
Heiko Seeberger 11 Фев 2020 в 14:07