Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Patrik Wenger
Ah right, I guess there will be a ZMQ-assigned identity if you don't set 
one. Wasn't able to find that in the docs right away though. I found it 
in the ZGuide now though. Seems like the ROUTER itself will invent those 
for each connected socket that doesn't announce its own identity.


Happy hacking!

Regards,
Patrik


On 14.02.2018 22:40, Jake wrote:
Ok, thanks for the explanation and doc reference. My A node spawns the 
B nodes in the
first place, so I guess I can either (1) assign the identity 
out-of-band at spawn time and
have the B use it, or (2) have B handshake once at start up to allow A 
to associate the
zmq-assigned identity.  After that B just receives and sends on 
DEALER; without other
sockets connected there is no load balancing on B's end.  Node A uses 
the identity association
to send to a particular B and to recognize which B is sending when it 
receives a message.


-Jake

On Wed, Feb 14, 2018 at 4:25 PM, Patrik Wenger > wrote:


Hi Jake

In fact, most ZMQ socket types do some sort of load balancing when
connected with multiple other sockets. See [1], especially the
"Outgoing routing strategy" and "Incoming routing strategy" in the
table for each socket type. TL;DR if the socket allows receiving
messages and is connected to multiple other sockets, it will try
to read from all of those sockets "fairly". If the socket allows
sending messages and is connected to multiple other sockets, it
will usually round-robin when sending.

Of course PUB (and RADIO) will not round-robin, but "fan out"
instead, meaning all connected sockets will receive every message.

And ROUTER is an exception too: When sending, it uses the first
message part (set by the application) to determine the correct
receiver. This allows you to send a message to one specific
connected socket. When receiving, it prepends a message part that
identifies the socket which sent the message. Your application
will have to inspect that first part to know who is its sender.
These two things will have to happen in your A node. The DEALER
sockets in your B nodes will have to set an identity to be
distinguishable in A's ROUTER socket.

Regards,
Patrik

[1] http://api.zeromq.org/4-2:zmq-socket



On 14.02.2018 20:17, Jake wrote:

Isn't ROUTER-DEALER load balancing though?  I've used it in a
REQ-ROUTER-DEALER-REP set up
but in that case the REQ -> ROUTER send does not target a
particular handler on the other side, it
just goes to an arbitrary one and the ROUTER makes sure the reply
goes back to the original sender.
How would my sender (an A node) target a particular B node to
receive a message?

-Jake

On Wed, Feb 14, 2018 at 12:34 PM, Justin Azoff
mailto:justin.az...@gmail.com>> wrote:

On Wed, Feb 14, 2018 at 12:28 PM, Patrik VV.
mailto:pad...@gmail.com>> wrote:
> Hi
>
> Not sure why Justin suggested using a ROUTER-Socket on each
side.

Ah yes, I misread the original message. For "one-to-many" you
would
use router-dealer.  router+router would be more for
many-to-many where
each node runs the same code and there is no obvious master node.


--
- Justin
___
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




___
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


___
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Jake
Ok, thanks for the explanation and doc reference.  My A node spawns the B
nodes in the
first place, so I guess I can either (1) assign the identity out-of-band at
spawn time and
have the B use it, or (2) have B handshake once at start up to allow A to
associate the
zmq-assigned identity.  After that B just receives and sends on DEALER;
without other
sockets connected there is no load balancing on B's end.  Node A uses the
identity association
to send to a particular B and to recognize which B is sending when it
receives a message.

-Jake

On Wed, Feb 14, 2018 at 4:25 PM, Patrik Wenger  wrote:

> Hi Jake
>
> In fact, most ZMQ socket types do some sort of load balancing when
> connected with multiple other sockets. See [1], especially the "Outgoing
> routing strategy" and "Incoming routing strategy" in the table for each
> socket type. TL;DR if the socket allows receiving messages and is connected
> to multiple other sockets, it will try to read from all of those sockets
> "fairly". If the socket allows sending messages and is connected to
> multiple other sockets, it will usually round-robin when sending.
>
> Of course PUB (and RADIO) will not round-robin, but "fan out" instead,
> meaning all connected sockets will receive every message.
>
> And ROUTER is an exception too: When sending, it uses the first message
> part (set by the application) to determine the correct receiver. This
> allows you to send a message to one specific connected socket. When
> receiving, it prepends a message part that identifies the socket which sent
> the message. Your application will have to inspect that first part to know
> who is its sender. These two things will have to happen in your A node. The
> DEALER sockets in your B nodes will have to set an identity to be
> distinguishable in A's ROUTER socket.
>
> Regards,
> Patrik
>
> [1] http://api.zeromq.org/4-2:zmq-socket
>
> On 14.02.2018 20:17, Jake wrote:
>
> Isn't ROUTER-DEALER load balancing though?  I've used it in a
> REQ-ROUTER-DEALER-REP set up
> but in that case the REQ -> ROUTER send does not target a particular
> handler on the other side, it
> just goes to an arbitrary one and the ROUTER makes sure the reply goes
> back to the original sender.
> How would my sender (an A node) target a particular B node to receive a
> message?
>
> -Jake
>
> On Wed, Feb 14, 2018 at 12:34 PM, Justin Azoff 
> wrote:
>
>> On Wed, Feb 14, 2018 at 12:28 PM, Patrik VV.  wrote:
>> > Hi
>> >
>> > Not sure why Justin suggested using a ROUTER-Socket on each side.
>>
>> Ah yes, I misread the original message. For "one-to-many" you would
>> use router-dealer.  router+router would be more for many-to-many where
>> each node runs the same code and there is no obvious master node.
>>
>>
>> --
>> - Justin
>> ___
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>
>
>
>
> ___
> zeromq-dev mailing 
> listzeromq-dev@lists.zeromq.orghttps://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
>
>
> ___
> 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


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Patrik Wenger

Hi Jake

In fact, most ZMQ socket types do some sort of load balancing when 
connected with multiple other sockets. See [1], especially the "Outgoing 
routing strategy" and "Incoming routing strategy" in the table for each 
socket type. TL;DR if the socket allows receiving messages and is 
connected to multiple other sockets, it will try to read from all of 
those sockets "fairly". If the socket allows sending messages and is 
connected to multiple other sockets, it will usually round-robin when 
sending.


Of course PUB (and RADIO) will not round-robin, but "fan out" instead, 
meaning all connected sockets will receive every message.


And ROUTER is an exception too: When sending, it uses the first message 
part (set by the application) to determine the correct receiver. This 
allows you to send a message to one specific connected socket. When 
receiving, it prepends a message part that identifies the socket which 
sent the message. Your application will have to inspect that first part 
to know who is its sender. These two things will have to happen in your 
A node. The DEALER sockets in your B nodes will have to set an identity 
to be distinguishable in A's ROUTER socket.


Regards,
Patrik

[1] http://api.zeromq.org/4-2:zmq-socket


On 14.02.2018 20:17, Jake wrote:
Isn't ROUTER-DEALER load balancing though?  I've used it in a 
REQ-ROUTER-DEALER-REP set up
but in that case the REQ -> ROUTER send does not target a particular 
handler on the other side, it
just goes to an arbitrary one and the ROUTER makes sure the reply goes 
back to the original sender.
How would my sender (an A node) target a particular B node to receive 
a message?


-Jake

On Wed, Feb 14, 2018 at 12:34 PM, Justin Azoff > wrote:


On Wed, Feb 14, 2018 at 12:28 PM, Patrik VV. mailto:pad...@gmail.com>> wrote:
> Hi
>
> Not sure why Justin suggested using a ROUTER-Socket on each side.

Ah yes, I misread the original message. For "one-to-many" you would
use router-dealer.  router+router would be more for many-to-many where
each node runs the same code and there is no obvious master node.


--
- Justin
___
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


___
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Jake
Isn't ROUTER-DEALER load balancing though?  I've used it in a
REQ-ROUTER-DEALER-REP set up
but in that case the REQ -> ROUTER send does not target a particular
handler on the other side, it
just goes to an arbitrary one and the ROUTER makes sure the reply goes back
to the original sender.
How would my sender (an A node) target a particular B node to receive a
message?

-Jake

On Wed, Feb 14, 2018 at 12:34 PM, Justin Azoff 
wrote:

> On Wed, Feb 14, 2018 at 12:28 PM, Patrik VV.  wrote:
> > Hi
> >
> > Not sure why Justin suggested using a ROUTER-Socket on each side.
>
> Ah yes, I misread the original message. For "one-to-many" you would
> use router-dealer.  router+router would be more for many-to-many where
> each node runs the same code and there is no obvious master node.
>
>
> --
> - Justin
> ___
> 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


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Justin Azoff
On Wed, Feb 14, 2018 at 12:28 PM, Patrik VV.  wrote:
> Hi
>
> Not sure why Justin suggested using a ROUTER-Socket on each side.

Ah yes, I misread the original message. For "one-to-many" you would
use router-dealer.  router+router would be more for many-to-many where
each node runs the same code and there is no obvious master node.


-- 
- Justin
___
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Patrik VV.
Hi

Not sure why Justin suggested using a ROUTER-Socket on each side. 

I think having the A node bind a ROUTER socket and each B node connect using a 
DEALER socket is enough. One single TCP port would have to be bound. The ROUTER 
socket on the A node is needed to distinguish between the different B nodes 
when receiving/sending messages. The B nodes don’t need to make that 
distinction because it’ll always be the A node implicitly. 

Regards,
Patrik

> On 14 Feb 2018, at 15:14, Justin Azoff  wrote:
> 
> You would most likely use a ZMQ_ROUTER socket on both ends:
> 
> Summary of ZMQ_ROUTER characteristics:
> Compatible peer sockets ZMQ_DEALER, ZMQ_REQ, ZMQ_ROUTER
> Direction Bidirectional
> 
> 
>> On Wed, Feb 14, 2018 at 9:08 AM, Jake  wrote:
>> What do would be an appropriate pattern to achieve bidirectional,
>> asynchronous messages between two nodes over TCP transport without binding
>> more than one TCP port?  The two nodes would be in different processes at
>> least and possibly on different machines.  I can imagine that a pair of
>> PUSH->PULL sockets would enable this, where Node A and Node B each bind a
>> TCP port with a PULL socket and connect to each other with a PUSH socket.
>> However, I will have a one-to-many relationship between an A node and
>> several B nodes, so needing a distinct port on A for each B limits the
>> design.  Ideally, only B nodes would bind a port for their A node to connect
>> to.
>> 
>> -Jake Cobb
>> 
>> ___
>> zeromq-dev mailing list
>> zeromq-dev@lists.zeromq.org
>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>> 
> 
> 
> 
> -- 
> - Justin
> ___
> 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


Re: [zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Justin Azoff
You would most likely use a ZMQ_ROUTER socket on both ends:

Summary of ZMQ_ROUTER characteristics:
Compatible peer sockets ZMQ_DEALER, ZMQ_REQ, ZMQ_ROUTER
Direction Bidirectional


On Wed, Feb 14, 2018 at 9:08 AM, Jake  wrote:
> What do would be an appropriate pattern to achieve bidirectional,
> asynchronous messages between two nodes over TCP transport without binding
> more than one TCP port?  The two nodes would be in different processes at
> least and possibly on different machines.  I can imagine that a pair of
> PUSH->PULL sockets would enable this, where Node A and Node B each bind a
> TCP port with a PULL socket and connect to each other with a PUSH socket.
> However, I will have a one-to-many relationship between an A node and
> several B nodes, so needing a distinct port on A for each B limits the
> design.  Ideally, only B nodes would bind a port for their A node to connect
> to.
>
> -Jake Cobb
>
> ___
> zeromq-dev mailing list
> zeromq-dev@lists.zeromq.org
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>



-- 
- Justin
___
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev


[zeromq-dev] Bidirectional Async Over TCP Without Multiple Binds

2018-02-14 Thread Jake
What do would be an appropriate pattern to achieve bidirectional,
asynchronous messages between two nodes over TCP transport without binding
more than one TCP port?  The two nodes would be in different processes at
least and possibly on different machines.  I can imagine that a pair of
PUSH->PULL sockets would enable this, where Node A and Node B each bind a
TCP port with a PULL socket and connect to each other with a PUSH socket.
However, I will have a one-to-many relationship between an A node and
several B nodes, so needing a distinct port on A for each B limits the
design.  Ideally, only B nodes would bind a port for their A node to
connect to.

-Jake Cobb
___
zeromq-dev mailing list
zeromq-dev@lists.zeromq.org
https://lists.zeromq.org/mailman/listinfo/zeromq-dev