Created
March 11, 2015 15:24
-
-
Save ruslander/8f487f9710edcaa2ddeb to your computer and use it in GitHub Desktop.
Dynamic discovery by cluster key
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
class Program | |
{ | |
private static readonly NetMQContext Context = NetMQContext.Create(); | |
static void Main(string[] args) | |
{ | |
Task.Factory.StartNew(() => | |
{ | |
using (var cluster_A_Node1 = Context.CreateResponseSocket()) | |
{ | |
var randomPort = cluster_A_Node1.BindRandomPort("tcp://*"); | |
var info = new MemberInfo() | |
{ | |
ClusterName = "A", | |
Name = "Node1", | |
Port = randomPort.ToString() | |
}; | |
var advertizer = new NetMQBeacon(Context); | |
advertizer.Configure(9999); | |
advertizer.Publish(info.ToString(), TimeSpan.FromSeconds(2)); | |
while (true) | |
{ | |
Thread.Sleep(1000); | |
} | |
} | |
}); | |
Task.Factory.StartNew(() => | |
{ | |
using (var cluster_A_Node2 = Context.CreateResponseSocket()) | |
{ | |
var randomPort = cluster_A_Node2.BindRandomPort("tcp://*"); | |
var info = new MemberInfo() | |
{ | |
ClusterName = "A", | |
Name = "Node2", | |
Port = randomPort.ToString() | |
}; | |
var advertizer = new NetMQBeacon(Context); | |
advertizer.Configure(9999); | |
advertizer.Publish(info.ToString(), TimeSpan.FromSeconds(2)); | |
while (true) | |
{ | |
Thread.Sleep(1000); | |
} | |
} | |
}); | |
// the broadcast of this node is going be ignored by cluster_A_broadcast_inspector | |
Task.Factory.StartNew(() => | |
{ | |
using (var cluster_B_Node1 = Context.CreateResponseSocket()) | |
{ | |
var randomPort = cluster_B_Node1.BindRandomPort("tcp://*"); | |
var info = new MemberInfo() | |
{ | |
ClusterName = "B", | |
Name = "Node2", | |
Port = randomPort.ToString() | |
}; | |
var advertizer = new NetMQBeacon(Context); | |
advertizer.Configure(9999); | |
advertizer.Publish(info.ToString(), TimeSpan.FromSeconds(2)); | |
while (true) | |
{ | |
Thread.Sleep(1000); | |
} | |
} | |
}); | |
Task.Factory.StartNew(() => | |
{ | |
using (var cluster_A_broadcast_inspector = new NetMQBeacon(Context)) | |
{ | |
cluster_A_broadcast_inspector.Configure(9999); | |
cluster_A_broadcast_inspector.Subscribe("A"); | |
while (true) | |
{ | |
string peerName; | |
string nodeInfoAsString = cluster_A_broadcast_inspector.ReceiveString(out peerName); | |
// use this for members list | |
MemberInfo.Parse(nodeInfoAsString); | |
Console.WriteLine("heard of " + nodeInfoAsString); | |
} | |
} | |
}); | |
Console.ReadLine(); | |
} | |
} | |
public class MemberInfo | |
{ | |
public string ClusterName; | |
public string Name; | |
public string Uptime; | |
public string Port; | |
public MemberInfo() | |
{ | |
Uptime = DateTime.Now.Ticks.ToString(); | |
} | |
public override string ToString() | |
{ | |
return ClusterName + "|" + Name + "|" + Port + "|" + Uptime; | |
} | |
public static MemberInfo Parse(string payload) | |
{ | |
var parts = payload.Split('|'); | |
return new MemberInfo() | |
{ | |
ClusterName = parts[0], | |
Name = parts[1], | |
Port = parts[2], | |
Uptime = parts[3] | |
}; | |
} | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment