Created
December 8, 2015 09:58
-
-
Save krgn/f9fb90dabfac3d46c722 to your computer and use it in GitHub Desktop.
Cluster routers
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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 = on | |
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() | |
remote <! cmd | |
0 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment