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

io.buoyant.linkerd.LoadBalancerConfig.scala Maven / Gradle / Ivy

The newest version!
package io.buoyant.linkerd

import com.fasterxml.jackson.annotation.JsonSubTypes.Type
import com.fasterxml.jackson.annotation.{JsonIgnore, JsonSubTypes}
import com.fasterxml.jackson.databind.annotation.JsonDeserialize
import com.twitter.conversions.time._
import com.twitter.finagle.Stack
import com.twitter.finagle.loadbalancer.LoadBalancerFactory.EnableProbation
import com.twitter.finagle.loadbalancer.{Balancers, LoadBalancerFactory}
import io.buoyant.config.PolymorphicConfig

@JsonSubTypes(Array(
  new Type(value = classOf[P2C], name = "p2c"),
  new Type(value = classOf[P2CEwma], name = "ewma"),
  new Type(value = classOf[Aperture], name = "aperture"),
  new Type(value = classOf[Heap], name = "heap"),
  new Type(value = classOf[RoundRobin], name = "roundRobin")
))
abstract class LoadBalancerConfig extends PolymorphicConfig {
  val factory: LoadBalancerFactory

  val enableProbation: Option[Boolean] = None

  @JsonIgnore
  def clientParams = Stack.Params.empty + LoadBalancerFactory.Param(factory) +
    LoadBalancerFactory.EnableProbation(enableProbation.getOrElse(false))
}

case class P2C(maxEffort: Option[Int]) extends LoadBalancerConfig {
  @JsonIgnore
  val factory = Balancers.p2c(maxEffort.getOrElse(Balancers.MaxEffort))
}

case class P2CEwma(decayTimeMs: Option[Int], maxEffort: Option[Int]) extends LoadBalancerConfig {
  @JsonIgnore
  val factory = Balancers.p2cPeakEwma(
    decayTime = decayTimeMs.map(_.millis).getOrElse(10.seconds),
    maxEffort = maxEffort.getOrElse(Balancers.MaxEffort)
  )
}

case class Aperture(
  smoothWindowMs: Option[Int],
  maxEffort: Option[Int],
  @JsonDeserialize(contentAs = classOf[java.lang.Double]) lowLoad: Option[Double],
  @JsonDeserialize(contentAs = classOf[java.lang.Double]) highLoad: Option[Double],
  minAperture: Option[Int]
) extends LoadBalancerConfig {
  @JsonIgnore
  val factory = Balancers.aperture(
    smoothWin = smoothWindowMs.map(_.millis).getOrElse(5.seconds),
    maxEffort = maxEffort.getOrElse(Balancers.MaxEffort),
    lowLoad = lowLoad.getOrElse(0.5),
    highLoad = highLoad.getOrElse(2.0),
    minAperture = minAperture.getOrElse(1)
  )
}

class Heap extends LoadBalancerConfig {
  @JsonIgnore
  val factory = Balancers.heap()
}

case class RoundRobin(maxEffort: Option[Int]) extends LoadBalancerConfig {
  @JsonIgnore
  val factory = Balancers.roundRobin(
    maxEffort = maxEffort.getOrElse(Balancers.MaxEffort)
  )
}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy