问题描述
我实施了一个演员,为akka演员进行健康检查。 该参与者检查健康状况,并返回上,下或未知状态。
val actorSystemCheckRunnable =
new ActorSystemCheckRunnable(
actorSystemHealthChecker,healthCheckHost,healthCheckPort
)
该类声明如下
case class ActorSystemCheckRunnable(
kinesisActorSystemHealthChecker: ActorSystemHealthChecker,healthCheckHost: String,healthCheckPort: Int
) extends Runnable {
override def run(): Unit = {
kinesisActorSystemHealthChecker.checkActorSystem() match {
case t@_ => logger.info(s"${system.name} is ${t.toString}")
}
}
}
并且安排如下
appHealthActorSystem
.scheduler
.scheduleWithFixedDelay(0 seconds,5 seconds)(actorSystemCheckRunnable)(appHealthEC)
一旦运行它将返回输出作为日志
[app-health-actor-system-akka.actor.default-dispatcher-4] - source is UP {}
[app-health-actor-system-akka.actor.default-dispatcher-5] - source is UNKNowN {}
但是我很难将这些健康检查输出暴露给本地主机。 有没有办法从case类中进行HTTP发布的声明?
编辑:
我将其作为独立应用程序运行,并且确实尝试创建http端点并将actor系统运行状况检查路由到该端点,但是该端点仅保持静态并显示第一个运行状况检查状态,如果应用程序i停机,未知或故障状态,不会反映在端点上
case class ActorSystemCheckRunnable(kinesisActorSystemHealthChecker: ActorSystemHealthChecker,healthCheckPort: Int) extends Runnable {
override def run(): Unit = {
kinesisActorSystemHealthChecker.checkActorSystem() match {
case t@_ => Http().newServerAt("localhost",9000).bindFlow(path("hello") {
Directives.put {
complete(s"${system.name} is ${t.toString}")
}
})
}
}
}
解决方法
如果您在akka群集中运行该应用程序,则引入akka管理依赖关系并以akka管理的方式进行运行状况检查无害,例如:
class KinesisHealthCheck(system: ActorSystem) extends (() => Future[Boolean]) {
private val kinesisActorSystemHealthChecker = ...
override def apply(): Future[Boolean] = {
...
}
}
然后配置运行状况检查路由。请参阅https://doc.akka.io/docs/akka-management/current/healthchecks.html
或者,如果您出于任何原因不想包含akka管理依赖项,则可以使用Akka HTTP创建HTTP端点/ healthcheck,并像调用任何常规HTTP端点一样调用该端点