Согласно 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