gRPC 流处理 - 第一个丢失后的消息

时间:2021-03-30 05:25:54

标签: go grpc-go

有:

我有一个 gRPC 服务可以在一个流中传输任意数量的字符串。

行为:

服务器上只打印第一行/消息

期望:

打印所有行

代码:

原型定义

/// Defines simple messages to run the logsink server and client
syntax = "proto3";

package logsink;
option csharp_namespace = "Serilog.GoLogsinkSink";

/// LogTransfer service defines the method(s) used to send
/// messages from client to server
service LogTransfer {
  /// SendLine sends a log line to the server
  rpc SendLine(stream LineMessage) returns (LineResult) {}
}

/// The single line message
message LineMessage {
  string line = 1;
    int32 priority = 2;
    int64 sequence = 3;
}

/// Result of the log send
message LineResult {
    bool result = 1;
}

服务器端实现:

//SendLine implements logsink.SendLine
func (s *server) SendLine(stream logsink.LogTransfer_SendLineServer) error {
    for {
        in, err := stream.Recv()
        if err != nil {
            logrus.Warnf("error reading request: %s", err)
            return stream.SendAndClose(&logsink.LineResult{
                Result: true,
            })
        }
        logrus.Println(in.Line) // prints only the first message
    }
    return stream.SendAndClose(&logsink.LineResult{
        Result: true,
    })
}

客户端使用:

//lineSender emits the passed lines over gRPC
func lineSender(in <-chan string) {
    // Set up a connection to the server.
    conn, err := grpc.Dial(viper.GetString("connect.address"), grpc.WithInsecure())
    defer func() {
        err := conn.Close()
    }()
    c := pb.NewLogTransferClient(conn)
    client, err := c.SendLine(context.Background())
    defer func() {
        res, err := client.CloseAndRecv()
    }()
    priority := int32(viper.GetInt("connect.priority"))
    for line := range in {
        logrus.Println(line) // all lines printed
        err = client.Send(&pb.LineMessage{Line: line, Priority: priority})
    }
}

应用程序遵循管道模式,in 获取任意数量的预处理字符串。现在,当发送 10 行时,客户端会打印出所有 10 行,而服务器只打印第一行。

我没有找到为什么服务器只收到第一条消息的线索。我使用示例 gRPC 代码作为指导。

0 个答案:

没有答案
相关问题