← Back to akka/akka

How to Deploy & Use akka/akka

Akka Core Library Deployment and Usage Guide

Prerequisites

Before getting started with Akka Core, ensure you have the following:

  • Java Development Kit (JDK) 8 or later - Akka is built on the JVM and requires Java to run
  • Scala 2.13 or 3.x - Akka Core is written in Scala, though it can be used from Java as well
  • Build tool - Choose one of the following:
    • sbt (Scala Build Tool) - Recommended for Scala projects
    • Maven - For Java or mixed Scala/Java projects
    • Gradle - Alternative build tool with good Scala support
  • Git - For cloning the repository and managing version control

Installation

Option 1: Using a Build Tool (Recommended)

Add Akka Core as a dependency to your build configuration:

For sbt:

libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.8.0"

For Maven:

<dependency>
  <groupId>com.typesafe.akka</groupId>
  <artifactId>akka-actor_2.13</artifactId>
  <version>2.8.0</version>
</dependency>

For Gradle:

implementation 'com.typesafe.akka:akka-actor_2.13:2.8.0'

Option 2: Building from Source

  1. Clone the repository:
git clone https://github.com/akka/akka-core.git
cd akka-core
  1. Build the project using sbt:
sbt compile
  1. Run tests to verify the build:
sbt test

Configuration

Basic Actor System Configuration

Create an application.conf file in your project's resources directory:

akka {
  actor {
    provider = "cluster"
    default-dispatcher {
      executor = "fork-join-executor"
      fork-join-executor {
        parallelism-min = 8
        parallelism-max = 64
      }
    }
  }
  
  remote {
    artery {
      enabled = on
      transport = tcp
      canonical {
        hostname = "127.0.0.1"
        port = 2552
      }
    }
  }
}

Environment Variables

  • AKKA_REMOTE_HOSTNAME - Override the remote hostname
  • AKKA_REMOTE_PORT - Override the remote port
  • AKKA_CLUSTER_SEED_NODES - Comma-separated list of seed nodes for clustering

API Keys

Akka Core itself doesn't require API keys, but if you're using it with other Akka modules or services, you may need:

  • Akka Management API - For cluster management and health checks
  • Akka Persistence - For database connection strings if using persistent actors

Build & Run

Development Environment

  1. Create an Actor System:
import akka.actor.ActorSystem

object Main extends App {
  implicit val system: ActorSystem = ActorSystem("MyActorSystem")
  
  // Your application code here
  
  system.terminate()
}
  1. Create an Actor:
import akka.actor.typed.{ActorRef, ActorSystem}
import akka.actor.typed.scaladsl.Behaviors

object MyActor {
  sealed trait Command
  case class Greet(whom: String, replyTo: ActorRef[String]) extends Command
  
  val behavior = Behaviors.receive[Command] { (context, message) =>
    message match {
      case Greet(whom, replyTo) =>
        replyTo ! s"Hello, $whom!"
        Behaviors.same
    }
  }
}
  1. Run the application:
sbt run

Production Environment

  1. Package your application:
sbt assembly
  1. Run with configuration:
java -Dconfig.resource=prod.conf -jar target/scala-2.13/your-app.jar

Deployment

Platform Options

Kubernetes (Recommended for Container Orchestration)

  1. Create a Dockerfile:
FROM openjdk:11-jre-slim
WORKDIR /app
COPY target/scala-2.13/your-app.jar .
EXPOSE 2552
CMD ["java", "-jar", "your-app.jar"]
  1. Deploy to Kubernetes:
apiVersion: apps/v1
kind: Deployment
metadata:
  name: akka-cluster
spec:
  replicas: 3
  selector:
    matchLabels:
      app: akka-cluster
  template:
    metadata:
      labels:
        app: akka-cluster
    spec:
      containers:
      - name: akka
        image: your-registry/your-app:latest
        ports:
        - containerPort: 2552

Cloud Platforms

  • AWS - Deploy as EC2 instances or ECS containers
  • Google Cloud - Use GKE for Kubernetes deployment
  • Azure - Deploy via AKS or Azure Container Instances

Standalone Deployment

For simple deployments, run directly on servers:

java -jar your-app.jar -Dakka.remote.artery.canonical.hostname=your-ip

Troubleshooting

Common Issues and Solutions

1. Connection Refused Error

akka.remote.Remoting$ - Bind failed on [email protected]:2552

Solution: Ensure the port is available and not blocked by firewall:

# Check if port is in use
lsof -i :2552

# Open port in firewall (Linux)
sudo ufw allow 2552

2. Cluster Formation Issues

akka.cluster.ClusterActorRefProvider - Node [email protected] - no seed nodes configured

Solution: Configure seed nodes in your configuration:

akka.cluster.seed-nodes = [
  "akka://MySystem@[email protected]:2552",
  "akka://MySystem@[email protected]:2552"
]

3. Serialization Errors

akka.actor.ActorInitializationException: You need to provide an implicit akka.actor.ExtendedActorSystem

Solution: Ensure proper serialization configuration:

import akka.actor.ExtendedActorSystem
import akka.serialization.SerializerWithStringManifest

class MySerializer(system: ExtendedActorSystem) extends SerializerWithStringManifest {
  // Implement serialization methods
}

4. Memory Issues

java.lang.OutOfMemoryError: Java heap space

Solution: Configure JVM heap size:

java -Xmx2g -Xms1g -jar your-app.jar

5. Actor Not Responding

akka.pattern.AskTimeoutException: Ask timed out on [Actor[akka://system/user/actor#1234567]] after [3000 ms]

Solution: Check actor lifecycle and message handling:

// Increase timeout
implicit val timeout: Timeout = Timeout(10.seconds)

// Or use patterns.ask with explicit timeout
val future = Patterns.ask(actor, message, 10.seconds)

Debugging Tips

  1. Enable debug logging:
akka.loglevel = "DEBUG"
akka.actor.debug {
  receive = on
  autoreceive = on
  lifecycle = on
}
  1. Use Akka Management for monitoring:
libraryDependencies += "com.lightbend.akka.management" %% "akka-management" % "1.0.0"
  1. Check cluster status:
akka cluster status

Performance Optimization

  1. Tune dispatcher settings:
akka.actor.default-dispatcher {
  throughput = 10
  fork-join-executor {
    parallelism-factor = 2.0
    parallelism-min = 8
    parallelism-max = 64
  }
}
  1. Enable adaptive receive timeout:
akka.actor {
  receive-timeout = 30s
  adaptive-receive-timeout = on
}
  1. Monitor with JMX:
java -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=9010 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -jar your-app.jar