Flink Kubernetes Module V2 部分使用ZIO重构
/** Deploy a Flink cluster with the given spec. */
def deployCluster(id: Long, spec: FlinkDeploymentDef): IO[Throwable, TrackKey.ClusterKey] = {
for {
_ <- k8sCrOpr.applyDeployment(spec.copy(job = None))
trackKey = TrackKey.cluster(id, spec.namespace, spec.name)
_ <- obr.track(trackKey)
} yield trackKey
}
// Submit FlinkDeployment CR to Kubernetes
FlinkK8sOperator.deployCluster(deployRequest.id, flinkDeployDef).runIOAsTry match {
case Success(_) =>
logInfo(richMsg("Flink Cluster has been submitted successfully."))
case Failure(err) =>
logError(
richMsg(s"Submit Flink Cluster fail in${deployRequest.executionMode.getName}_V2 mode!"),
err)
throw err
}
def runIOAsTry: Try[A] = unsafeRunToEither(io).toTry
/** unsafe run IO to Either. */
@inline def unsafeRunToEither[E, A](zio: IO[E, A]): Either[Throwable, A] = Unsafe.unsafe {
implicit u =>
Runtime.default.unsafe
.run(zio.provideLayer(Runtime.removeDefaultLoggers >>> ZIOLogger.default))
.toEither
}
可从Flink任务的提交使用上runIOAsTry
看到,返回的是IO[Throwable, TrackKey.ClusterKey]
正如scala一贯式的写法一样,执行这个方法,无论是正常还是错误,都需要有一个返回。只要按着规范执行,内部的错误可以通过ZIO一步步带到需要判断错误的地方,将Java的try…catch变成一个规范。 如下是某个子方法的内容,一个方法给出正确的方法也要给出错误的方法
/** Apply FlinkDeployment CR. */
override def applyDeployment(spec: FlinkDeploymentDef): IO[Throwable, Unit] = {
lazy val mirrorSpace = s"${spec.namespace}_${spec.name}"
for {
_ <- ZIO.fail(FlinkDeploymentCRDNotFound()).unlessZIO(existFlinkDeploymentCRD)
} yield ()
} *> ZIO.logInfo(s"Successfully apply FlinkDeployment K8s CR: namespace=${spec.namespace}, name=${spec.name}")
而为什么用ZIO呢,不得不从ZIO的定义讲起: ZIO[R, E, A]
数据类型具有三个类型参数:
R
- 环境类型。该效果需要R
类型的环境。如果此类型参数为Any
,则表示该效果没有任何要求,因为我们可以使用任何值(例如单位值()
)来运行该效果。E
- 失败类型。当值类型为E
时,效果可能会失败。某些应用程序将使用Throwable
。如果这个类型参数是Nothing
,则意味着效果不会失败,因为没有Nothing
类型的值。A
- 成功类型。如果值为A
类型,效果可能会成功。如果此类型参数为Unit
,则意味着该效果不会产生有用的信息,而如果为Nothing
,则意味着该效果将永远运行(或直到失败)。
ZIO将规范变成了语法,遵守规则变成了强制性的动作,当外部想通过收集对应的堆栈日志,只需要捕获对应的失败类型的结果即可。
– 待完善
文档信息
- 本文作者:Xuxiaotuan
- 本文链接:https://xuyinyin.cn/2023/12/24/%E4%BD%BF%E7%94%A8ZIO%E6%9C%89%E4%BB%80%E4%B9%88%E5%A5%BD%E5%A4%84%E5%91%A2/
- 版权声明:自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)