Пользовательский тип распределенных данных Акка: я должен расширить ReplicatedDataSerialization? - PullRequest
0 голосов
/ 11 февраля 2020

Согласно do c, рекомендуется реализовать эффективную сериализацию с Protobuf или аналогичной для нашего пользовательского типа данных. Однако я также обнаружил, что встроенные типы данных (например, GCounter) расширяются ReplicatedDataSerialization (см. код ), что в соответствии с scalado c,

Характеристика маркера для ReplicatedData, сериализованного akka.cluster.ddata.protobuf.ReplicatedDataSerializer.

Интересно, должен ли я реализовать свою собственную реализацию сериализатора или просто использовать ту из akka. Какая польза от реализации моей? Поскольку моя реализация пользовательского типа данных (см. код или ниже) действительно похожа на PNCounter, я считаю, что 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 ]

2 голосов
/ 11 февраля 2020

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

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

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

1 голос
/ 11 февраля 2020

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

0 голосов
/ 11 февраля 2020

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

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

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

...