Go 返回消息列表

Go 返回消息列表,go,protocol-buffers,grpc,Go,Protocol Buffers,Grpc,考虑到我有多个模型,每个模型都需要有自己的创建/获取/获取列表API。 我是否需要为每个型号添加两种不同类型的消息(单一和列表)? 例如: 如果我有学生类型- message Student{ string name = 1; } 和rpc: rpc CreateStudent(Student) returns (google.protobuf.Empty){ .............. } 如果我想添加一个rpc来创建一个学生列表,或者获取一个学生列表

考虑到我有多个模型,每个模型都需要有自己的创建/获取/获取列表API。 我是否需要为每个型号添加两种不同类型的消息(单一和列表)?
例如: 如果我有学生类型-

message Student{
    string name = 1;
}
和rpc:

rpc CreateStudent(Student) returns (google.protobuf.Empty){
         ..............    
}
如果我想添加一个rpc来创建一个学生列表,或者获取一个学生列表

rpc CreateStudends(??????) returns (google.protobuf.Empty){
             ..............    
}

rpc GetAllStudents() returns (??????){
         ..............    
}
我还需要定义吗

message StudentList{
   repeated Student students = 1;
}

或者有没有办法直接在消息输入/输出中使用列表类型?

您只需将
关键字添加到您的RPC中即可。无需将消息字段定义为重复,
将发送或接收多条独立消息

message Student {
    string name = 1;
}
使用RPC:

rpc CreateStudent(Student) returns (google.protobuf.Empty) {
         ..............    
}

rpc CreateStudents(stream Student) returns (google.protobuf.Empty) {
             ..............    
}

rpc GetAllStudents() returns (stream Student) {
         ..............    
}

发送/传输响应对象而不是空对象是一种很好的做法。否则,您只有gRPC响应代码来指示问题,并且需要引用日志进行调试。

您只需将
关键字添加到您的RPC中即可。无需将消息字段定义为重复,
将发送或接收多条独立消息

message Student {
    string name = 1;
}
使用RPC:

rpc CreateStudent(Student) returns (google.protobuf.Empty) {
         ..............    
}

rpc CreateStudents(stream Student) returns (google.protobuf.Empty) {
             ..............    
}

rpc GetAllStudents() returns (stream Student) {
         ..............    
}

发送/传输响应对象而不是空对象是一种很好的做法。否则,您只有gRPC响应代码来指示问题,并且需要引用日志进行调试。

是的,基本上-您希望每个元素类型有不同的消息类型,或者可能是一个带有
样式内容之一的单一根类型。原始protobuf不包括泛型或模板的概念


有些库会这样做,但是:这超出了规范。

基本上是的-您可能希望每个元素类型有不同的消息类型,或者可能是一个带有
样式内容之一的单一根类型。原始protobuf不包括泛型或模板的概念


有些库可以,但是:这超出了规范。

IMO这是个坏主意。流在语义上与具有重复元素的消息分离,这可能导致非常低效的实现。流用于多个单独的响应帧,而不是模拟重复的响应帧。我认为这在很大程度上取决于应用程序和实现。如果希望批量上传100k条记录,则包含重复字段的消息将占用大量内存,一个错误可能导致整个批被拒绝;更糟糕的是,它在处理过程中中途失败了。流式处理允许您发送单个记录并接收独立响应。唯一需要考虑的是流式响应可能与流式输入的顺序不一致。IMO这是个坏主意。流在语义上与具有重复元素的消息分离,这可能导致非常低效的实现。流用于多个单独的响应帧,而不是模拟重复的响应帧。我认为这在很大程度上取决于应用程序和实现。如果希望批量上传100k条记录,则包含重复字段的消息将占用大量内存,一个错误可能导致整个批被拒绝;更糟糕的是,它在处理过程中中途失败了。流式处理允许您发送单个记录并接收独立响应。唯一需要考虑的是,流式响应可能与流式输入的顺序不一致。这有多大的可伸缩性?这个问题有一个非常简单的信息,但在现实中,学生的记录会大得多,而且可能有大量的记录。如果这是一个RESTAPI,您是否希望使用一种方法将整个数据集上载到单个JSON对象中?这种方法的可伸缩性如何?这个问题有一个非常简单的信息,但在现实中,学生的记录会大得多,而且可能有大量的记录。如果这是一个RESTAPI,您是否希望在一个JSON对象中上载整个数据集?