[zeromq-dev] TPubSub pattern
Michael Haberler
mail17 at mah.priv.at
Tue Jan 28 15:18:38 CET 2014
Am 28.01.2014 um 09:45 schrieb Doron Somech <somdoron at gmail.com>:
> Thanks Pieter,
>
> NetMQ doesn't have authentication yet, but once authentication is in place the token is not needed (and the credentials can be retrieved per message).
> What is do needed for me at least is a way for the publisher to decide if subscriber subscription request is accepted or not, or another way to say it the publisher is deciding on the subscriptions of each subscriber (mainly because of permission of each subscriber).
>
> Maybe using XPUB with special setting which doesn't automatically add the subscription to the trie, once the subscription message is read we can call set socket option with SUBSCRIBE and the subscription and the XPUB will know to attach the subscription to the last pipe message was received from (or we can implement the select feature).
actually I think XPUB/XSUB is so useful that with a bit more generalized input message processing for many task one would get away with a single socket solution; I found I frequently need a ROUTER besides XPUB really just to submit messages to the actor behind the XPUB
explicit tagging of a message as subscribe/unsubscribe/other and support for multipart would go a long way
- Michael
>
> Today in my company we are using DEALER-ROUTER and have a copy of the trie data structure outside netmq.
>
> Regards,
>
> Doron
>
>
>
>
>
> On Mon, Jan 27, 2014 at 11:08 PM, Pieter Hintjens <ph at imatix.com> wrote:
> Hi Doron.,
>
> Token-based pub-sub sounds interesting. I'm not sure how this fits
> into what we're already doing with authentication. There's a
> zeromq-dev thread on providing authentication credentials to the
> caller per message.
>
> -Pieter
>
> On Sat, Jan 25, 2014 at 6:52 AM, Doron Somech <somdoron at gmail.com> wrote:
> > Hi All,
> >
> > I created a new pattern in NetMQ which I think will also benefit ZeroMQ, the
> > pattern called TPubSub, the T is for Token, anyway if you have a better name
> > please do suggest.
> >
> > The idea is to create a pubsub where the publisher decide on the subscriber
> > subscriptions, this is to achieve permission based subscriptions.
> >
> > Instead of subscriptions the subscriber will send the publisher a token, the
> > publisher upon receiving the token will decide on the subscriber
> > subscriptions.
> > The token can be an x509 certificate or blob received by authorizing with
> > another service (can be a simple web service) and receiving an signed blob
> > with the client identity and maybe client permissions.
> >
> > The publisher receiving the blob will be able to make sure it's authentic
> > and to set the client permission according to the permissions.
> >
> > The TSub can set a token which will be send to any TPub the TSub is
> > connected to using zmq_setsockopt with option ZMQ_TSUB_TOKEN or send a
> > message prefixed with zero.
> >
> > The TPub will receive any messages send by the TSub, the first frame will be
> > the identity (as in router) and then the message send by the TSub, the TPub
> > can set TSub subscriptions with first call to zmq_setsockopt with
> > ZMQ_TPUB_SELECT and the peer identity and then call zmq_setsockopt with
> > ZMQ_TPUB_SUBSCRIBE or ZMQ_TPUB_UNSUBSCRIBE along with the subscription.
> >
> > You can take a look at the branch here:
> > https://github.com/somdoron/netmq/tree/fpubsub
> > Most of the magic happen at the TPub and TSub you can also take a look at
> > the unit testing to see how to use it:
> > https://github.com/somdoron/netmq/blob/fpubsub/src/NetMQ.Tests/TPubSubTests.cs.
> >
> > I will add a pull request to NetMQ soon, I need to add some more testing and
> > want to hear your thoughts.
> >
> > Also together with ZMTP 3.0 hopefully coming to all zeromq libraries we can
> > really have a secure pubsub.
> >
> > Small example in C#:
> >
> > using(NetMQContext context = NetMQContext.Create())
> > {
> > using (TPublisherSocket publisherSocket =
> > context.CreateTPublisherSocket())
> > {
> > publisherSocket.Bind("tcp://127.0.0.1:5557");
> >
> > using (TSubscriberSocket subscriberSocket =
> > context.CreateTSubscriberSocket())
> > {
> > subscriberSocket.SetToken("all");
> > subscriberSocket.Connect("tcp://127.0.0.1:5557");
> >
> > // first is the identity
> > byte[] identity = publisherSocket.Receive();
> >
> > // now is the token, token always start with zero
> > byte[] token = publisherSocket.Receive();
> >
> > Debug.Assert(token[0] == 0);
> >
> > string tokenString = Encoding.ASCII.GetString(token, 1,
> > token.Length - 1);
> >
> > if (tokenString == "all")
> > {
> > publisherSocket.SelectPeer(identity);
> >
> > // The peer will be subscribed to all messages
> > publisherSocket.SubscribePeer("");
> > }
> >
> > publisherSocket.Send("Hello");
> >
> > string messsage = subscriberSocket.ReceiveString();
> >
> > Debug.Assert("Hello" == messsage);
> > }
> > }
> > }
> >
> > Regards,
> >
> > Doron
> >
> >
> >
> > _______________________________________________
> > zeromq-dev mailing list
> > zeromq-dev at lists.zeromq.org
> > http://lists.zeromq.org/mailman/listinfo/zeromq-dev
> >
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
> _______________________________________________
> zeromq-dev mailing list
> zeromq-dev at lists.zeromq.org
> http://lists.zeromq.org/mailman/listinfo/zeromq-dev
More information about the zeromq-dev
mailing list