All Downloads are FREE. Search and download functionalities are using the official Maven repository.

com.crobox.clickhouse.balancing.HostBalancer.scala Maven / Gradle / Ivy

The newest version!
package com.crobox.clickhouse.balancing

import akka.actor.ActorSystem
import akka.http.scaladsl.model._
import com.crobox.clickhouse.balancing.Connection.{BalancingHosts, ClusterAware, ConnectionType, SingleHost}
import com.crobox.clickhouse.balancing.discovery.ConnectionManagerActor
import com.crobox.clickhouse.balancing.discovery.cluster.ClusterConnectionProviderActor
import com.crobox.clickhouse.balancing.discovery.health.HostHealthChecker
import com.crobox.clickhouse.internal.{ClickhouseHostBuilder, InternalExecutorActor}
import com.typesafe.config.Config
import com.typesafe.scalalogging.LazyLogging

import scala.collection.JavaConverters._
import scala.concurrent.Future
import scala.concurrent.duration._

trait HostBalancer extends LazyLogging {

  def nextHost: Future[Uri]

}

object HostBalancer extends ClickhouseHostBuilder {

  def apply(config: Config)(implicit system: ActorSystem): HostBalancer = {
    val connectionConfig =
      config.getConfig("crobox.clickhouse.client.connection")
    val internalExecutor = system.actorOf(InternalExecutorActor.props(config))
    val connectionType   = ConnectionType(connectionConfig.getString("type"))
    connectionType match {
      case SingleHost => SingleHostBalancer(extractHost(connectionConfig))
      case BalancingHosts =>
        val manager = system.actorOf(
          ConnectionManagerActor
            .props(HostHealthChecker.props(
                     _,
                     internalExecutor,
                     connectionConfig.getDuration("health-check.timeout").getSeconds seconds
                   ),
                   config)
        )
        MultiHostBalancer(connectionConfig
                            .getConfigList("hosts")
                            .asScala
                            .toSet
                            .map((config: Config) => extractHost(config)),
                          manager)
      case ClusterAware =>
        val manager = system.actorOf(
          ConnectionManagerActor
            .props(HostHealthChecker.props(
                     _,
                     internalExecutor,
                     connectionConfig.getDuration("health-check.timeout").getSeconds seconds
                   ),
                   config)
        )
        val provider = system.actorOf(ClusterConnectionProviderActor.props(manager, internalExecutor))
        ClusterAwareHostBalancer(
          extractHost(connectionConfig),
          connectionConfig.getString("cluster"),
          manager,
          provider,
          connectionConfig.getDuration("scanning-interval").getSeconds seconds
        )(system, config.getDuration("crobox.clickhouse.client.host-retrieval-timeout").getSeconds seconds)
    }
  }

  private def extractHost(connectionConfig: Config): Uri =
    toHost(connectionConfig.getString("host"),
           if (connectionConfig.hasPath("port")) Option(connectionConfig.getInt("port")) else None)
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy