Skip to content

[💡 FEATURE REQUEST]: Add support for streaming RPCs #1906

@onyn

Description

@onyn

Plugin

GRPC

I have an idea!

In GRPC there are four kinds of service methods:

service HelloService {

  // Unary RPC. This is most common and familiar "request-response" scheme.
  rpc SayHello(HelloRequest) returns (HelloResponse);

  // Server streaming RPC. Client emit single request and receive sequence
  // of messages from server. This is useful for "server push" notifications.
  //
  // Example: chat service in which client subscribes to some room and
  // eventually receive chat messages from there.
  //
  // Example 2: client subscribes for market stock quotes and receives price
  // updates on interested shares.
  rpc LotsOfReplies(HelloRequest) returns (stream HelloResponse);

  // Client streaming RPC. Client send to to server sequence of messages.
  //
  // Example: client send log events which server collects in memory. Once
  // required number of messages have been collected, server flush them into
  // database using single effective bulk operation.
  rpc LotsOfGreetings(stream HelloRequest) returns (HelloResponse);
  
  // Bidirectional streaming RPC. Combination of previous two.
  rpc BidiHello(stream HelloRequest) returns (stream HelloResponse);
}

Currently roadrunner supports just unary one. If there was streams in proto definition, they turns into unary in the generated interface:

Reveal HelloServiceInterface
<?php
# Generated by the protocol buffer compiler (roadrunner-server/grpc). DO NOT EDIT!
# source: hello.proto

namespace GRPC\Hello;

use Spiral\RoadRunner\GRPC;

interface HelloServiceInterface extends GRPC\ServiceInterface
{
    // GRPC specific service name.
    public const NAME = "hello.HelloService";

    /**
    * @param GRPC\ContextInterface $ctx
    * @param HelloRequest $in
    * @return HelloResponse
    *
    * @throws GRPC\Exception\InvokeException
    */
    public function SayHello(GRPC\ContextInterface $ctx, HelloRequest $in): HelloResponse;

    /**
    * @param GRPC\ContextInterface $ctx
    * @param HelloRequest $in
    * @return HelloResponse
    *
    * @throws GRPC\Exception\InvokeException
    */
    public function LotsOfReplies(GRPC\ContextInterface $ctx, HelloRequest $in): HelloResponse;

    /**
    * @param GRPC\ContextInterface $ctx
    * @param HelloRequest $in
    * @return HelloResponse
    *
    * @throws GRPC\Exception\InvokeException
    */
    public function LotsOfGreetings(GRPC\ContextInterface $ctx, HelloRequest $in): HelloResponse;

    /**
    * @param GRPC\ContextInterface $ctx
    * @param HelloRequest $in
    * @return HelloResponse
    *
    * @throws GRPC\Exception\InvokeException
    */
    public function BidiHello(GRPC\ContextInterface $ctx, HelloRequest $in): HelloResponse;
}

Requested functionality is very similar to one offered by centrifugo.

I also found #923, but that seems about streaming large body of single request or response. Not about RPC streams.

Metadata

Metadata

Assignees

Labels

C-feature-acceptedCategory: Feature discussed and accepted

Type

No type

Projects

Status

📋 Backlog

Milestone

No milestone

Relationships

None yet

Development

No branches or pull requests

Issue actions