f327441089
- Add coordinator module with gRPC stream-based instance health detection - Implement InstanceHeartbeatService in core: bidirectional stream to coordinator every 200ms - Track game subscriptions per core via Redis Sets (SADD/SREM) - Add gRPC handlers for batch resubscribe/unsubscribe/evict/drain operations - Implement coordinator services: InstanceRegistry, FailoverService, LoadBalancer, AutoScaler, CacheEvictionManager - Add REST API for metrics and manual failover/rebalance/scaling - Proto definition: coordinator_service.proto with HeartbeatStream + batch game operations - Failover timeline: gRPC stream drop (50-200ms) → game migration (<300ms target) - Support for Argo Rollouts auto-scaling (k8s CRD patching via Fabric8 client) Note: Proto compilation issues documented in COORDINATOR_IMPLEMENTATION.md. Requires: - Add task dependency: tasks.compileScala dependsOn tasks.compileJava - Fix deprecated @Inject var = _ → = uninitialized syntax - Implement remaining service methods (gRPC clients, FailoverService distribution) Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
97 lines
3.1 KiB
Kotlin
97 lines
3.1 KiB
Kotlin
plugins {
|
|
id("scala")
|
|
id("org.scoverage") version "8.1"
|
|
id("io.quarkus")
|
|
}
|
|
|
|
group = "de.nowchess"
|
|
version = "1.0-SNAPSHOT"
|
|
|
|
@Suppress("UNCHECKED_CAST")
|
|
val versions = rootProject.extra["VERSIONS"] as Map<String, String>
|
|
@Suppress("UNCHECKED_CAST")
|
|
val scoverageExcluded = rootProject.extra["SCOVERAGE_EXCLUDED"] as List<String>
|
|
|
|
repositories {
|
|
mavenCentral()
|
|
}
|
|
|
|
scala {
|
|
scalaVersion = versions["SCALA3"]!!
|
|
}
|
|
|
|
scoverage {
|
|
scoverageVersion.set(versions["SCOVERAGE"]!!)
|
|
excludedFiles.set(scoverageExcluded)
|
|
}
|
|
|
|
tasks.withType<ScalaCompile> {
|
|
scalaCompileOptions.additionalParameters = listOf("-encoding", "UTF-8")
|
|
}
|
|
|
|
val quarkusPlatformGroupId: String by project
|
|
val quarkusPlatformArtifactId: String by project
|
|
val quarkusPlatformVersion: String by project
|
|
|
|
dependencies {
|
|
|
|
compileOnly("org.scala-lang:scala3-compiler_3") {
|
|
version {
|
|
strictly(versions["SCALA3"]!!)
|
|
}
|
|
}
|
|
implementation("org.scala-lang:scala3-library_3") {
|
|
version {
|
|
strictly(versions["SCALA3"]!!)
|
|
}
|
|
}
|
|
|
|
implementation(enforcedPlatform("${quarkusPlatformGroupId}:${quarkusPlatformArtifactId}:${quarkusPlatformVersion}"))
|
|
implementation("io.quarkus:quarkus-rest")
|
|
implementation("io.quarkus:quarkus-grpc")
|
|
implementation("io.quarkus:quarkus-arc")
|
|
implementation("io.quarkus:quarkus-config-yaml")
|
|
implementation("io.quarkus:quarkus-smallrye-health")
|
|
implementation("io.quarkus:quarkus-rest-client")
|
|
implementation("io.quarkus:quarkus-rest-client-jackson")
|
|
implementation("org.redisson:redisson:${versions["REDISSON"]!!}")
|
|
implementation("io.fabric8:kubernetes-client:6.13.0")
|
|
|
|
testImplementation(platform("org.junit:junit-bom:${versions["JUNIT_BOM"]!!}"))
|
|
testImplementation("org.junit.jupiter:junit-jupiter")
|
|
testImplementation("org.scalatest:scalatest_3:${versions["SCALATEST"]!!}")
|
|
testImplementation("co.helmethair:scalatest-junit-runner:${versions["SCALATEST_JUNIT"]!!}")
|
|
testImplementation("io.quarkus:quarkus-junit5")
|
|
testImplementation("io.quarkus:quarkus-junit5-mockito")
|
|
|
|
testRuntimeOnly("org.junit.platform:junit-platform-launcher")
|
|
testRuntimeOnly("org.junit.jupiter:junit-jupiter-engine")
|
|
}
|
|
|
|
configurations.matching { !it.name.startsWith("scoverage") }.configureEach {
|
|
resolutionStrategy.force("org.scala-lang:scala-library:${versions["SCALA_LIBRARY"]!!}")
|
|
}
|
|
configurations.scoverage {
|
|
resolutionStrategy.eachDependency {
|
|
if (requested.group == "org.scoverage" && requested.name.startsWith("scalac-scoverage-plugin_")) {
|
|
useTarget("${requested.group}:scalac-scoverage-plugin_2.13.16:2.3.0")
|
|
}
|
|
}
|
|
}
|
|
|
|
tasks.withType<JavaCompile> {
|
|
options.encoding = "UTF-8"
|
|
options.compilerArgs.add("-parameters")
|
|
}
|
|
tasks.withType<Jar>().configureEach { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|
|
|
|
tasks.test {
|
|
useJUnitPlatform {
|
|
includeEngines("scalatest", "junit-jupiter")
|
|
testLogging { events("passed", "skipped", "failed") }
|
|
}
|
|
finalizedBy(tasks.reportScoverage)
|
|
}
|
|
tasks.reportScoverage { dependsOn(tasks.test) }
|
|
tasks.jar { duplicatesStrategy = DuplicatesStrategy.EXCLUDE }
|