假设发生网络分区并且领导者 A 占少数。Raft 会选出一个新的领导者 B,但 A 认为它仍然是领导者一段时间。我们有两个客户。客户端 1 将键/值对写入 B,然后客户端 2 在 A 下台之前从 A 读取键。因为 A 仍然相信它是领导者,所以它会返回陈旧的数据。
原论文说:
其次,领导者必须在处理只读请求之前检查它是否已被废黜(如果选举了最近的领导者,则其信息可能会过时)。Raft 通过在响应只读请求之前让领导者与集群的大多数人交换心跳消息来处理这个问题。
是不是太贵了?领导者必须为每个读取请求与多数节点交谈?
我正在Scala中实现可序列化类型的类型类.简单类型很容易
trait Serializer[T] {
def toBytes(a: T): Array[Byte]
}
implicit object StringSerializer extends Serializer[String] {
override def toBytes(x: String) = ...
}
// similar codes for other simple types
Run Code Online (Sandbox Code Playgroud)
但是我不得不为Option [T],List [T]等更高级别的类型定义一个实例.当然,只有当T是可序列化的时候,List [T]才是可序列化的.但是如何在Scala中表达约束?我的尝试不成功:
implicit object ListSerializer extends Serializer[List[_]] {
// won't compile
override def toBytes[T: Serializer](a: List[T]): Array[Byte] = ...
}
Run Code Online (Sandbox Code Playgroud)