CODESAMPLE

Cluster-based Architecture - Kotlin

Share on:

The Cluster-based Architecture pattern involves grouping similar objects—called clusters—together and treating each cluster as a single unit. This improves performance by reducing the scope of operations and enabling parallel processing. It also aids in scalability and management. In this Kotlin example, Worker instances perform a task and are grouped into WorkerClusters. Tasks are dispatched to a cluster, which then distributes them among its workers. The ClusterManager oversees all clusters, providing a unified interface for execution and simplifying scaling by adding or removing clusters. Kotlin’s data classes and extension functions enhance readability and expressiveness.

// Worker.kt
data class Task(val id: Int, val data: String)

class Worker(val id: Int) {
    fun executeTask(task: Task): String {
        println("Worker $id executing task $task")
        return "Result from ${task.id}"
    }
}

// WorkerCluster.kt
class WorkerCluster(val clusterId: Int, private val workers: List<Worker>) {
    fun executeTasks(tasks: List<Task>): List<String> {
        return tasks.parallelStream().map { task ->
            workers.random().executeTask(task) // Distribute tasks randomly
        }.toList()
    }
}

// ClusterManager.kt
class ClusterManager(private val clusters: List<WorkerCluster>) {
    fun executeTasksAcrossClusters(tasks: List<Task>): List<String> {
        val results = mutableListOf<String>()
        for (cluster in clusters) {
            results.addAll(cluster.executeTasks(tasks.subList(0, tasks.size / clusters.size)))
        }
        return results
    }
}

// Main.kt
fun main() {
    val worker1 = Worker(1)
    val worker2 = Worker(2)
    val worker3 = Worker(3)

    val cluster1 = WorkerCluster(1, listOf(worker1, worker2))
    val cluster2 = WorkerCluster(2, listOf(worker3))

    val clusterManager = ClusterManager(listOf(cluster1, cluster2))

    val tasks = List(10) { Task(it, "Data $it") }
    val results = clusterManager.executeTasksAcrossClusters(tasks)

    println("Results: $results")
}