节点检查点本身何时

时间:2018-07-04 16:40:45

标签: corda

我了解有一些与send相关的注释,用于将函数标记为可序列化。流检查点本身有多少?

仅当节点sendAndReceive / @Suspendable等待响应时,节点检查点才自己吗?还是按间隔序列化检查点?

给出一个除了计算外什么都不做的流程,它对磁盘进行序列化/写入多少,如果在执行库查询/写入的其他线程的读取/写入负载达到峰值时,这会影响性能。

send在这些仅执行计算而没有其他操作的私有方法中如何发挥作用。如果对方法进行了注释,它将仅在下一个@Suspendable override fun call() { val states = querySomeStates() computeSomethingHeavy(states) decideSomething() } @Suspendable private querySomeStates() @Suspendable computeSomethingHeavy() @Suspendable decideSomething() 上进行序列化,否则什么都不会序列化?

示例

INSERT .... IF NOT EXISTS

1 个答案:

答案 0 :(得分:2)

@Suspendable将功能标记为潜在可暂停的。仅当执行以下操作之一时,该流才会实际上被暂停:

  • 流启动
  • send
  • receive
  • sendAndReceive
  • waitForLedgerCommit
  • getFlowInfo
  • sleep

执行这些操作之一时,节点将使用Quasar捕获执行堆栈并创建检查点。如果函数不执行任何这些操作,则不会创建检查点。即使流程正在执行大量计算和/或将功能标记为@Suspendable,也是如此。换句话说,Quasar不会进行 抢占,这意味着我们不会“定期检查点”,而只是在特定的呼叫站点。

例如,以下是简单流程中的检查点序列:

@Suspendable fun call() { // checkpoint! sendSomething() computeSomething() } @Suspendable fun sendSomething() { send() // checkpoint! } @Suspendable fun computeSomething() { heavyComputation() // no checkpoint! }