Skip to content
This repository has been archived by the owner on May 25, 2023. It is now read-only.

Commit

Permalink
More DC/OS fixes (#55)
Browse files Browse the repository at this point in the history
* depend on marathon api

* bind host/port fix for DC/OS

* Increase service locator timeout and implement retries
  • Loading branch information
longshorej authored and dbrinegar committed Mar 26, 2018
1 parent 5c4acdb commit 2d6eb55
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 7 deletions.
6 changes: 4 additions & 2 deletions akka-management/src/main/resources/rp-tooling.conf
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,10 @@ akka {

management {
http {
hostname = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_BIND_HOST}
port = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_BIND_PORT}
hostname = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_HOST}
port = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_PORT}
bind-hostname = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_BIND_HOST}
bind-port = ${?RP_ENDPOINT_AKKA_MGMT_HTTP_BIND_PORT}
}
}
}
1 change: 1 addition & 0 deletions build.sbt
Original file line number Diff line number Diff line change
Expand Up @@ -130,6 +130,7 @@ lazy val akkaClusterBootstrap = createProject("reactive-lib-akka-cluster-bootstr
.settings(
libraryDependencies ++= Seq(
"com.lightbend.akka.discovery" %% "akka-discovery-kubernetes-api" % Versions.akkaManagement,
"com.lightbend.akka.discovery" %% "akka-discovery-marathon-api" % Versions.akkaManagement,
"com.lightbend.akka.management" %% "akka-management-cluster-bootstrap" % Versions.akkaManagement,
"com.typesafe.akka" %% "akka-testkit" % Versions.akka % "test",
"com.typesafe.akka" %% "akka-cluster" % Versions.akka % "provided"
Expand Down
4 changes: 3 additions & 1 deletion service-discovery/src/main/resources/reference.conf
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
com.lightbend.platform-tooling {
service-discovery {
ask-timeout = 1 second
ask-timeout = 5 seconds

external-service-addresses {
# "my-service/my-endpoint" {
Expand All @@ -9,5 +9,7 @@ com.lightbend.platform-tooling {
}

external-service-address-limit = 3

retry-delays = [100 milliseconds, 500 milliseconds, 1 second]
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,15 +19,16 @@ package com.lightbend.rp.servicediscovery.scaladsl
import akka.actor._
import akka.io.Dns.Resolved
import akka.io.{ Dns, IO }
import akka.pattern.ask
import akka.pattern.{ after, ask }
import com.lightbend.rp.asyncdns.AsyncDnsResolver
import com.lightbend.rp.asyncdns.raw.SRVRecord
import com.lightbend.rp.common._
import com.lightbend.rp.servicediscovery.scaladsl.ServiceLocatorLike.{ AddressSelection, AddressSelectionRandom }
import java.net.URI
import java.util.concurrent.ThreadLocalRandom
import scala.collection.immutable.Seq
import scala.concurrent.Future
import scala.concurrent.{ ExecutionContext, Future }
import scala.concurrent.duration.FiniteDuration

import AsyncDnsResolver.SrvResolved

Expand Down Expand Up @@ -226,6 +227,12 @@ trait ServiceLocatorLike {
else
s"$name/$endpoint"

def retry[T](delays: Seq[FiniteDuration])(value: => Future[T]): Future[T] =
value
.recoverWith {
case _ if delays.nonEmpty => after(delays.head, as.scheduler)(retry(delays.tail)(value))
}

settings.externalServiceAddresses.get(externalEntry) match {
case Some(services) =>
val resolved =
Expand Down Expand Up @@ -264,8 +271,7 @@ trait ServiceLocatorLike {
for {
srvRecord <- srvRecords
} yield {
dnsResolver
.ask(Dns.Resolve(srvRecord.target))(settings.askTimeout)
retry(settings.retryDelays)(dnsResolver.ask(Dns.Resolve(srvRecord.target))(settings.askTimeout))
.collect {
case aRecord: Resolved =>
translateResolvedSrv(protocol, srvRecord, aRecord)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,13 @@ final class Settings(system: ExtendedActorSystem) extends Extension {

val externalServiceAddressLimit: Int = serviceDiscovery.getInt("external-service-address-limit")

val retryDelays: Seq[FiniteDuration] =
serviceDiscovery
.getDurationList("retry-delays", MILLISECONDS)
.asScala
.toVector
.map(Duration(_, MILLISECONDS))

private def duration(config: Config, key: String): FiniteDuration =
Duration(config.getDuration(key, MILLISECONDS), MILLISECONDS)
}
Expand Down

0 comments on commit 2d6eb55

Please sign in to comment.