I am designing a subscription API through gRPC in which:

   - Request is stream of subscription filters, updated as client sees fit
   - Response is stream of messages matching subscription filters

The goal is to have a single thread responsible for polling the 
subscriptions for updated filters, performing queries to create results 
sets for the filters, and publishing these results back out to the clients.

Currently, I have something like the following:

rpc Subscribe(stream Request) returns (stream Response);

def Subscribe(self, request_iterator, context):
    response_queue = Queue.Queue()
    subscription_manager.register_subscription(request_iterator, 
response_queue)
    while True:
        response = response_queue.get(timeout=0.5)
        yield response
    except Queue.Empty:
        return

The first issue is that exposure to the stream of requests is provided 
through an iterator interface which blocks on next(). In order to have a 
single thread responsible for pulling requests, I need to have access to a 
non-blocking way to check if any requests are present the subscription and 
advance to the next subscription if not. In order to ensure that a lack of 
requests on one subscription doesn't block consumption of requests on 
another, I currently have to dedicate a thread per subscription each 
blocking on iteration over the request_iterator and applying updates as 
they are received.

The second issue is that exposure to the stream of responses is such that 
the rpc implementation is expected to be a generator of the responses. My 
assumption is that the above code consumes a server worker thread for the 
duration of a subscription call.

Overall this translates to 1 thread per subscription for iterating 
requests, 1 thread per subscription for yielding responses, and 1 thread 
iterating over the subscription params, querying, and populating the 
queues. Is there any lower-level access to the streams, i.e. something that 
can be selected over for the requests, etc?

Thank you.

-- 
You received this message because you are subscribed to the Google Groups 
"grpc.io" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/grpc-io.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/grpc-io/cfbb6383-642b-4995-9c54-49b75c502fd2%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

Reply via email to