This is great information, James - thank you for taking the time to share.

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

> Yes that’s possible, you can also use/store the round trip time from
> subscribe to reply.
>  That should give some idea of the network distance/congestion/load on
> each publisher.
>
> Basically your client can build up a map of all possible options about
> where is the best place to get X from.
>
> James Harvey
>
> On 25 Jun 2018, at 17:47, James Addison <add...@gmail.com> wrote:
>
> 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
>
> _______________________________________________
> 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