0

我是 clojure 的新手,我想弄清楚 Jepsen 是做什么的,这是一个用于检查分布式系统一致性的软件。

  • 我的问题是:
    1. 扩展协议有什么作用?
    2. 更具体地说,在Jepsen.Generatorop中,Protocol.
    3. 在上下文中混合是什么意思

亲切的问候

4

1 回答 1

1

扩展协议有什么作用?

协议是一种抽象的东西,看起来像 Java 中的接口。它什么也不做,但其他一些实体可能会实现它。在 Java 中,您声明一个实现接口的类。deftype在 Clojure 中,您可以使用声明或defrecord调用它的自定义类型来扩展特定协议extend-protocol

使用类型扩展协议时,您需要指定该协议中提到的签名的实现。

一个很好的例子可能是 JSON 序列化。比如说,协议如下所示:

(defprotocol JSON
  (to-json [obj]))

如果您调用(to-json ...)任何值,您将收到一条错误消息,指出该类型没有to-json实现。你需要扩展它:

(extend-protocol JSON

  Integer
  (to-json [obj] (str obj))

  Boolean
  (to-json [obj]
    (if obj "true" "false")))

现在,调用(to-json 42)并将(to-json false)工作。您可以为其余类型扩展该协议:浮点数、数组、映射等。

协议中的操作是什么

协议没有实现,只有签名。os是一些只需要三个参数的函数的签名:[gen test process]. 这取决于它应该返回什么。例如,您可以参考第 46 行,其中为该clojure.lang.AFunction类型实现其行为。由于我对 jepsen 不熟悉,所以我不能多说。

在上下文中混合是什么意思

我认为它的文档字符串和代码一样清晰。我收集了一个氏族。如果它为空,则结果将是一个名为 的特殊 Generator 实例void。它是一种匿名类型,它扩展了生成器协议,仅nil在调用时返回,op无需任何计算。

如果gens不为空,则代码返回一个 Generator 类型的实例,该实例具有这样的实现,在执行时op采用随机数。genop

希望这会有所帮助。

于 2018-01-22T12:51:42.230 回答