Skip to content

Instantly share code, notes, and snippets.

@ruslander
Created March 11, 2015 15:24
Show Gist options
  • Save ruslander/8f487f9710edcaa2ddeb to your computer and use it in GitHub Desktop.
Save ruslander/8f487f9710edcaa2ddeb to your computer and use it in GitHub Desktop.
Dynamic discovery by cluster key
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