Ah! The simplicity of this approach makes sense.

I suppose it also allows clients to disconnect/remove a cacher from it's
sources if a SUB notification isn't received in 5 or 10 seconds as well
then?

Thanks again,
James

On Mon, Jun 25, 2018 at 9:38 AM James Harvey <jhar...@factset.com> wrote:

>
> Hi James,
>
> The cachers in my setup, publish their discovery information every second
> to the discovery proxies. I have maybe 100 catchers and the network
> overhead is low compared with the ease of use and the fact you can use that
> info to confirm the publisher is still in running.
>
> I add meta info to the Json blobs with details on cache sizes, how many
> current connections etc. This allows the client to make an informed
> decision on which cache to connect to.
>
> I also setup my publishers as verbose so the publisher can catch the
> subscription message (of the new joiner) and send out its details again. So
> no 1 second delay.
>
> You can use either method or both like me.
>
> I also think there is a beacon service built into zeromq (or czmq?) that
> may suit but I have never used it.
>
> Cheers
>
> James Harvey
>
> On 25 Jun 2018, at 17:16, James Addison <add...@gmail.com> wrote:
>
> James - thank you for building on what Bill mentioned; that's actually
> quite helpful. I think what you describe is very close to what I am needing
> to do. I wouldn't have thought to use XPUB/XSUB for this, but as always
> things seem intuitive _after_ the fact.
>
> Perhaps a naive question, but how are you handling new nodes joining the
> network (ie. scaling the network up due to load) after it's all up and
> running? I mean, they wouldn't receive the initial discovery pub/sub
> notifications from the earlier nodes, would they?
>
> On Mon, Jun 25, 2018 at 1:33 AM James Harvey <jhar...@factset.com> wrote:
>
>> Hi James,
>>
>> I am doing something almost identical to Bill with regards to discovery.
>>
>> My system is a distributed cache, where I have X discovery proxies at
>> fixed location with a fixed port for upstream/downstream. They are just
>> xpub/xsub (with verbose/r on) zmq_proxy.
>>
>> + Cacher publishes (on a topic describing what's in its cache) it's
>> location in a json message (ports, ip, other details) to the upstream port
>> of the discovery proxy.
>> + Consumers subscribe to downstream port of discovery proxy with a prefix
>> partial subject of the caches they are interested in
>> + Consumers parse the incoming json's, decide best cache and connect to
>> it directly (bypassing the proxy).
>>
>> This system works between the DC and cloud (AWS). I also have a system
>> using zeromq internally to the DC that uses mcast PGM to broadcast the
>> discovery info. This is nice as there is no single point of failure but you
>> have more discovery traffic (as mcast PUB/SUB have to filter on the SUB
>> side) and you need a mcast capable network.
>>
>> James Harvey
>>
>>
>> From: zeromq-dev <zeromq-dev-boun...@lists.zeromq.org> On Behalf Of Bill
>> Torpey
>> Sent: 23 June 2018 21:29
>> To: ZeroMQ development list <zeromq-dev@lists.zeromq.org>
>> Subject: Re: [zeromq-dev] zmq architecture/protocol planning
>>
>> Hi James:
>>
>> I’m doing something similar on the service discovery end, but it’s a work
>> in progress, so take this with the appropriate amount of salt ;-)
>>
>> It seems a good idea to minimize state as much as possible, especially
>> distributed state, so I have so far avoided the central “registrar”,
>> preferring to distribute that functionality out to the nodes, and to
>> delegate as much functionality as possible to ZeroMQ itself.
>>
>> I’ve got a single well-known endpoint, which is a process running
>> zmq_proxy (actually multiple processes, but let’s keep it simple).  Nodes
>> use PUB/SUB messaging to exchange discovery messages with the proxy, and
>> use the discovery messages to establish direct PUB/SUB connections to peer
>> nodes over a second socket pair.  I let ZeroMQ deal with the filtering by
>> topic.  I also let ZeroMQ deal with ignoring multiple connection attempts
>> to the same endpoint, which  greatly simplifies the discovery protocol.
>>  (If you decide to do something like that, you probably want to make sure
>> you are working with a relatively recent version of ZeroMQ — there  have
>> been some recent changes in that functionality:
>> https://github.com/zeromq/libzmq/pull/2879).
>>
>> The result of this is a fully-connected network, with each node having
>> direct PUB/SUB connections to every other node.  That may or may not work
>> for your application, but for mine it is fine (~100 nodes total).
>>
>> As mentioned, there’s a somewhat complicated protocol that ensures that
>> every node gets to see all the discovery messages, but without flooding the
>> network.  That part is still a work-in-progress, but it’s looking pretty
>> reliable so far.
>>
>> If you decide to do something similar, let me suggest you take a look at
>> the excellent ZMQ_XPUB_WELCOME_MSG socket option contributed by Doron
>> Somech (https://somdoron.com/2015/09/reliable-pubsub/).  I use this to
>> get a notification when the discovery SUB socket is connected to the
>> zmq_proxy, which triggers publication of discovery messages on the
>> discovery PUB socket.
>>
>> Hope this helps...
>>
>> Regards,
>>
>> Bill
>>
>> On Jun 23, 2018, at 12:13 AM, James Addison <mailto:add...@gmail.com>
>> wrote:
>>
>> Looking for a little guidance/advice on ZMQ implementation.
>>
>> The following demonstrates the simplistic architecture that I'm
>> considering. It doesn't take into consideration redundancy, load balancing
>> at all levels (yet). The general flow of request/response traffic would be:
>>
>> -> HTTP request from internet
>> -> nginx (1 node)
>> -> aiohttp + zmq-based frontend (1 or more nodes depending on system
>> demands)
>> -> zmq-based router (1 node)
>> -> zmq-based worker (n nodes; scalable depending on dynamic demand)
>>
>> I want my system to work in environments where multicast/broadcast is not
>> available (ie. AWS EC2 VPC) - so I believe a well-known node for service
>> discovery is needed.
>>
>> With that in mind, all zmq-based nodes would:
>>
>> - register with the 'central' service discovery (SD) node on startup to
>> make other nodes aware of its presence
>> - separately SUBscribe to the service discovery node's PUB endpoint to
>> receive topics of pertinent peer nodes' connection details
>>
>> In the nginx config, I plan to have an 'upstream' defined in a separate
>> file that is updated by a zmq-based process that also SUBscribes to the
>> service discovery node.
>>
>> ZMQ-based processes, and their relation to other ZMQ-based processes:
>>
>> - service discovery (SD)
>> - zmq-based nginx upstream backend updater; registers with SD, SUBs to
>> frontend node topic (to automatically add frontend node connection details
>> to nginx config and reload nginx)
>> - frontend does some request validation and caching; registers with SD,
>> SUBS to router node topic (to auto connect to the router's endpoint)
>> - router is the standard zmq DEALER/ROUTER pattern; registers with SD
>> - worker is the bit that handles the heavy lifting; registers with SD,
>> SUBS to router node topic (to auto connect to the router's endpoint)
>>
>> The whole point of this is that each node only ever needs to know the
>> well-known service discovery node endpoint - and each node can
>> auto-discover and hopefully recover in most downtime scenarios (excluding
>> mainly if the SD node goes down, but that's outside of scope at the moment).
>> Questions!
>>
>> 1. Does this architecture make sense? In particular, the single
>> well-known service discovery node and every other node doin PUB/SUB with it
>> for relevant endpoint topics?
>> 2. Who should heartbeat to who? PING/PONG? ie. when a given node
>> registers with the SD node, should the registering node start heartbeating
>> on the same connection to the SD node, or should the SD node open a
>> separate new socket to the registering node? The SD node is the one that
>> will need to know if registered nodes drop off the earth, I think?
>>
>> I'll likely have followup questions - hope that's ok!
>>
>> Thanks,
>> James
>> _______________________________________________
>> zeromq-dev mailing list
>> mailto:zeromq-dev@lists.zeromq.org
>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>> _______________________________________________
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>
>
> --
> James Addison
> email: add...@gmail.com
> twitter: @jamesaddison
>
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev@lists.zeromq.org
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev@lists.zeromq.org
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>


-- 
James Addison
email: add...@gmail.com
twitter: @jamesaddison
_______________________________________________
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to