【问题标题】:Custom akka distributed data type: should I extend ReplicatedDataSerialization?自定义 akka 分布式数据类型:我应该扩展 ReplicatedDataSerialization 吗?
【发布时间】:2020-02-10 21:24:35
【问题描述】:

根据the doc,对于我们的自定义数据类型,建议使用Protobuf或类似的实现高效序列化。但是,我还发现内置数据类型(例如,GCounter)扩展了ReplicatedDataSerialization(参见code),根据scaladoc

由 akka.cluster.ddata.protobuf.ReplicatedDataSerializer 序列化的 ReplicatedData 的标记特征。

我想知道我应该实现自己的序列化器实现还是简单地使用来自 akka 的序列化器实现。实施我自己的有什么好处?由于我的自定义数据类型实现(参见code 或以下)与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

【问题讨论】:

    标签: scala akka


    【解决方案1】:

    您绝对可以使用内置的 ReplicatedDataSerializer 序列化位于自定义 CRDT 核心的 GCounters。

    但是,正如您在查看该类时看到的那样,它显式枚举了它可以序列化的类型,这意味着它无法序列化您的 FractionGCounter 对象。

    您仍然需要自己的序列化程序来理解FractionGCounter 对象(并且可能使用内置的ReplicatedDataSerializer 'inside')。

    【讨论】:

      【解决方案2】:

      除了 Arnout 所说的,序列化的一个重要方面是模式迁移。显然,Akka 内部的那些都绑定到各个 Akka 模块的生命周期。因此我肯定会自己写。

      【讨论】:

        【解决方案3】:

        AFAIU 他们不建议实现 自己的 序列化机制,而是使用市场上现有的解决方案之一,因为它不是 akka 的一部分,因为它不是 akka 特定的。然而,它们可以很容易地被合并,并且您肯定可以找到将它们集成到 akka 中的 3rd 方库。

        对于哪个是最好的问题没有简单的答案,因为它在很大程度上取决于特定的用例。您可以在这里讨论几个更受欢迎的选项的性能:
        Performance comparison of Thrift, Protocol Buffers, JSON, EJB, other?

        您可以从使用 akka 内置序列化开始,稍后用更合适的方式替换它。

        【讨论】:

          猜你喜欢
          • 2011-05-04
          • 2019-10-30
          • 2011-12-11
          • 1970-01-01
          • 2021-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多