Skip to content

Instantly share code, notes, and snippets.

@krgn
Created December 8, 2015 09:31
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save krgn/b2c4c382f54400393951 to your computer and use it in GitHub Desktop.
Save krgn/b2c4c382f54400393951 to your computer and use it in GitHub Desktop.
akka test cluster
namespace TestCluster
open Akka
open Akka.Routing
open Akka.Actor
open Akka.Cluster
open Akka.FSharp
open System
module Main =
[<EntryPoint>]
let main _ =
let localPort = int(Environment.GetEnvironmentVariable("LOCAL_PORT"))
let remotePort = Environment.GetEnvironmentVariable("REMOTE_PORT")
let tmpl = @"
akka {
actor {
provider = ""Akka.Cluster.ClusterActorRefProvider, Akka.Cluster""
deployment {
/clients {
router = broadcast-group
routees.paths = [""/user/worker/*""]
}
/remotes {
router = broadcast-group
routees.paths = [""/user/clients""]
cluster {
enabled = on
nr-of-instances = 99
allow-local-routees = off
use-role = backend
}
}
}
}
remote {
log-remote-lifecycle-events = DEBUG
log-received-messages = on
helios.tcp {
port = %localport%
hostname = localhost
}
}
cluster {
seed-nodes = [
""akka.tcp://TestCluster@localhost:%localport%"",
""akka.tcp://TestCluster@localhost:%remoteport%""
]
roles = [ backend ]
}
}"
let cnfstr =
tmpl
.Replace("%localport%", localPort.ToString())
.Replace("%remoteport%", remotePort.ToString())
let config = Configuration.parse(cnfstr)
use system = System.create "TestCluster" config
let router = system.ActorOf(Props.Empty.WithRouter(FromConfig.Instance), "clients")
let remote = system.ActorOf(Props.Empty.WithRouter(FromConfig.Instance), "remotes")
spawn system "worker" <| (fun worker ->
let mkLoop (mbx : Actor<string>) name =
let rec loop () =
actor {
let! msg = mbx.Receive()
printfn "%s got message: %s" name msg
return! loop()
}
loop
["w1"; "w2"; "w3"]
|> List.map (fun el ->
spawn worker el <| fun mailbox ->
let loop = mkLoop mailbox el
loop())
|> ignore
(mkLoop worker "worker")())
|> ignore
while true do
let cmd = Console.ReadLine()
router <! cmd
remote <! cmd
0
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment