标签: grpc-python

grpc 异步双向服务器(Java/Python)

这是我的场景。grpc 服务器是一个异步服务器,它从其他源订阅数据。它还为其客户端提供了订阅功能,因此一旦从其他来源接收到数据,它就可以将数据推送到 grpc 客户端。服务器是用Java 实现的。

@Override
public StreamObserver<Message> subscribe (
        StreamObserver<Message> responseObserver) {
    return new StreamObserver<Message>() {

        @Override
        public void onNext(Message message) {
            api.subscribe(message.value, Message -> {
                synchronized (responseObserver) {
                    ...
                    ...
                    // get data from other source

                    responseObserver.onNext(Converter.create().toProtobuf(Message.class, data));
                }
            });
        }

        @Override
        public void onError(Throwable t) {
            log.warn("Encountered error in sub", t);
        }

        @Override
        public void onCompleted() {
            responseObserver.onCompleted();
        }
    };
}
Run Code Online (Sandbox Code Playgroud)

我想使用 python 实现 grpc 客户端来订阅该服务器。然而,奇怪的是,Python一旦订阅数据,就立即关闭,而不等待Java服务器的异步返回。然而,Java 客户端可以永远运行并等待来自服务器的异步数据。

原型

message Message{
    string value = 1;
}
service test …
Run Code Online (Sandbox Code Playgroud)

python java grpc grpc-java grpc-python

5
推荐指数
1
解决办法
1302
查看次数

protobuf消息中的最大字段数

Protocol buffers 的官方文档https://developers.google.com/protocol-buffers/docs/proto3说 protobuf 消息中字段的最大字段数是 2^29-1。但为什么会有这个限制呢?请问谁能详细解释一下吗?我对此是新手。

我阅读了这个问题的答案,即Why 2^29-1 is the Maximum key in protocol buffers。但我并没有澄清

protocol-buffers grpc-python

5
推荐指数
1
解决办法
6874
查看次数

性能问题:使用 Gunicorn + Tornado 的异步 gRPC

背景:

我们正在尝试将我们的 API 网关从 REST 迁移到 gRPC。API Gateway 将由 Backend Team 使用REST 使用,API Gateway 与微服务的通信将使用gRPC。我们的 API 网关使用Tornado Python 框架Gunicorn构建,并tornado.curl_httpclient.CurlAsyncHTTPClient用于为每个端点启用 Async/Future。每个端点将使用一元 RPC调用微服务,gRPC 存根将返回Future

因此,在完全迁移到 gRPC 之前,我们尝试比较 gRPC 与 REST 的性能。以下是您可能需要了解的详细信息:

  1. 我们有 3 个端点要测试。/0, /1, 和/2单个字符串负载。有效载荷大小为 100KB、1MB 和 4MB。这些消息在实例刚启动时就已经创建好了,所以端点只需要检索它。
  2. 每个端点的并发性 = 1、4、10。
  3. gRPC 线程池最大工人数 = 1 和 Gunicorn 的工人数 = 16。
  4. 我们使用 APIB 进行负载测试。
  5. 所有负载测试都是使用 GCP 虚拟机实例完成的。机器规格为:Intel Broadwell,n1-standard-1(1 个 vCPU,3.75 GB 内存),操作系统:Debian 9 …

performance tornado gunicorn grpc grpc-python

5
推荐指数
1
解决办法
823
查看次数

Python grpc-tools 在我安装后立即被声明丢失

我正在使用最新的 Ubuntu 21.04 for aarch64。为了试验 gRPC,我安装了 grpc 东西:

python3 -m pip install grpc
python3 -m pip install grpcio-tools
Run Code Online (Sandbox Code Playgroud)

我也尝试过:

pip3 install grpc
pip3 install grpcio-tools
Run Code Online (Sandbox Code Playgroud)

这些似乎很成功,但是当我尝试从 .proto 文件生成 gRPC Python 代码时,系统告诉我没有安装 grpcio-tools。

如何解决这个问题?Ubuntu for aarch64 刚刚坏了吗?

python ubuntu grpc grpc-python

5
推荐指数
1
解决办法
8240
查看次数

使用 protoc 生成的 pb2.py 的逆向工程 .proto 文件

是否可以使用 protoc 从生成的 pb2.py 中获取 proto 文件?gRPC 是否可以进行相同的逆向工程?

protocol-buffers grpc protoc grpc-python protobuf-python

5
推荐指数
1
解决办法
3294
查看次数

如何在没有客户端 SSL 证书的情况下在 python gRPC 客户端中打开安全通道

我有一个 grpc 服务器(在 Go 中),它具有有效的 TLS 证书,并且不需要客户端 TLS。由于某种原因,我无法在 Python 中实现没有 mTLS 的客户端,尽管我可以在 Golang 中实现。

在Python中我有

os.environ["GRPC_VERBOSITY"] = "DEBUG"
# os.environ["GRPC_DEFAULT_SSL_ROOTS_FILE_PATH"] = "/etc/ssl/certs/ca-bundle.crt"

channel = grpc.secure_channel(ADDR, grpc.ssl_channel_credentials())
grpc.channel_ready_future(channel).result(timeout=10)
Run Code Online (Sandbox Code Playgroud)

这给了我以下错误

D0513 08:02:08.147319164   21092 security_handshaker.cc:181] Security handshake failed: {"created":"@1652446928.147311309","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":377,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
Run Code Online (Sandbox Code Playgroud)

如果我通过取消注释行来使用 SSL 证书,我可以让它工作。我知道我的服务器不会请求、要求或验证客户端证书,因为以下 Go 代码可以完美运行

D0513 08:02:08.147319164   21092 security_handshaker.cc:181] Security handshake failed: {"created":"@1652446928.147311309","description":"Handshake failed","file":"src/core/lib/security/transport/security_handshaker.cc","file_line":377,"tsi_code":10,"tsi_error":"TSI_PROTOCOL_FAILURE"}
Run Code Online (Sandbox Code Playgroud)

python ssl grpc grpc-python grpc-go

5
推荐指数
1
解决办法
2万
查看次数

没有gRPC可以使用protocol buffer吗?

大家好,我正在接触 gRPC 和协议缓冲区,并且发现了一篇文章,其中提到消息的二进制 protobuf 文件比 Json 对应文件小 5 倍,但在那篇文章中提到这种级别的压缩可以只有通过 gRPC 传输才能实现。这个特定的评论“通过 gRPC 传输时可能进行压缩”,我似乎无法理解,因为我理解协议缓冲区是一种序列化格式,可以与 gRPC 无关地工作,或者这种理解是否有缺陷?这意味着什么?这是文章和屏幕截图的链接。 https://www.datascienceblog.net/post/programming/essential-protobuf-guide-python/ 在此输入图像描述

protocol-buffers grpc grpc-python

5
推荐指数
1
解决办法
2208
查看次数

在 grpc python 中处理异步流请求

我试图了解如何使用双向流处理 grpc api(使用 Python API)。

假设我有以下简单的服务器定义:

syntax = "proto3";
package simple;

service TestService {
  rpc Translate(stream Msg) returns (stream Msg){}
}

message Msg
{
 string msg = 1;
}
Run Code Online (Sandbox Code Playgroud)

假设将从客户端发送的消息异步发送(由于用户选择了一些 ui 元素)。

为客户端生成的 python 存根将包含一个方法Translate,该方法将接受生成器函数并返回一个迭代器。

我不清楚的是我将如何编写生成器函数来返回用户创建的消息。在等待消息时睡在线程上听起来不是最好的解决方案。

python python-asyncio grpc grpc-python

4
推荐指数
1
解决办法
3382
查看次数

python grpc客户端如何管理连接?

grpc 客户端何时创建和关闭连接?
我以以下方式开始代码:

channel = grpc.insecure_channel('localhost:8888')
stub = myservice_pb2_grpc.MyServiceStub(channel)
Run Code Online (Sandbox Code Playgroud)

声明 a 是否会channel在进程的整个生命周期内创建一个套接字?
因为即使我提供了无效的地址,insecure_channel()在发出第一个请求之前我也看不到任何错误。

或者,套接字仅在发出请求时创建并随后关闭?

python sockets connection grpc grpc-python

4
推荐指数
1
解决办法
7100
查看次数

python gRPC 错误:“错误”:“13 内部:无法序列化响应!” 当尝试返回重复消息而不是列表请求中的流时

我有 django REST API,我正在尝试将其转换为 gRPC。我遵循Django grpc 框架指南并创建了以下文件:

模型.py
class Organization(models.Model):
    Org_name = models.CharField(max_length=100, unique=True, primary_key=True, db_index=True)
    Address = models.CharField(max_length=100)
    Description = models.CharField(max_length=500)
    Number_of_emp = models.IntegerField()
Run Code Online (Sandbox Code Playgroud)
org.proto

package org;

import "google/protobuf/empty.proto";

service OrganizationController {
    rpc List(OrganizationListRequest) returns (Organizations) {}
    rpc Create(Organization) returns (Organization) {}
    rpc Retrieve(OrganizationRetrieveRequest) returns (Organization) {}
    rpc Update(Organization) returns (Organization) {}
    rpc Destroy(Organization) returns (google.protobuf.Empty) {}
}

message Organization {
    string Org_name = 1;
    string Address = 2;
    string Description = 3;
    int32 Number_of_emp = 4; …
Run Code Online (Sandbox Code Playgroud)

python django django-serializer grpc grpc-python

4
推荐指数
1
解决办法
9981
查看次数