I am using pub/Sub Socket and currently the server subscribe byte[0] (all topics) while client subscribe byte[16] - a specific header as topic
However, I cannot stop client to subscribe byte[0] which can receive all other messages.
My application is a like a app game which has one single server using ZMQ as connection and many clients have a ZMQ sockets to talk with server.
What pattern or socket I should use in this case?
Thanks
" ... cannot stop client to subscribe byte[0] which can receive all other messages."
Stopping a "subscribe to all" mode of the SUB client
For the ZMQ
PUB
/SUB
Formal Communication Pattern archetype, theSUB
client has to submit it's subscription request ( viazmq_setsockopt()
).PUB
-side ( a Game Server ) has got no option to do that from it's side.There is no-subscription state right on a creation of a new
SUB
socket, thus an absolutely restrictive filter, thas no message pass through. ( For furhter details on methods forSUBSCRIBE
/UNSUBSCRIBE
ref. below )ZeroMQ specification details setting for this:
ZMQ_SUBSCRIBE
: Establish message filterThe
ZMQ_SUBSCRIBE
option shall establish a new message filter on aZMQ_SUB
socket. Newly createdZMQ_SUB
sockets shall filter out all incoming messages, therefore you should call this option to establish an initial message filter.An empty
option_value
of length zero shall subscribe to all incoming messages.A non-empty
option_value
shall subscribe to all messages beginning with the specified prefix.Multiple filters may be attached to a single
ZMQ_SUB
socket, in which case a message shall be accepted if it matches at least one filter.ZMQ_UNSUBSCRIBE
: Remove message filterThe
ZMQ_UNSUBSCRIBE
option shall remove an existing message filter on aZMQ_SUB
socket. The filter specified must match an existing filter previously established with theZMQ_SUBSCRIBE
option. If the socket has several instances of the same filter attached theZMQ_UNSUBSCRIBE
option shall remove only one instance, leaving the rest in place and functional.How to enforce an ad-hoc, server-dictated, ZMQ_SUBSCRIBE restrictions?
This is possible via extending the messaging layer and adding a control-mode socket, that will carry server-initiated settings for the client
ZMQ_SUB
messages filtering.Upon receiving a new, the server-dictated,
ZMQ_SUBSCRIBE
/ZMQ_UNSUBSCRIBE
setting, theZMQ_SUB
client side code will simply handle that request and addzmq_setsockopt()
accordingly.FSA-driven grammars for this approach are rich of further possibilites, so will allow any Game Server / Game Community to smoothly go this way.
What pattern or socket I should use?
ZeroMQ is rather a library of LEGO-style elements to get assembled into a bigger picture.
Expecting such a smart library to have a one-size-fits-all ninja-element is on a closer look an oxymoron.
So, to avoid a "Never-ending-story" of adding "although this ... and also that ..."
Review all requirements and & list features for the end-to-end scaleable solution,
Design a messaging concept & validate it to meet all the listed requirements & cover all features in [1]
Implement [2]
Test [3] & correct it for meeting 1:1 the end-to-end specification [1]
Enjoy it. You have done it end-to-end right.