我了解有一些与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
答案 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!
}