我有一个用 C++ 编写的 gRPC 服务器和一个用 Java 编写的客户端。使用阻塞存根一切工作正常。然后我决定将其中一个调用更改为异步,因此我在客户端中创建了一个额外的存根,该存根是使用 newStub(channel) 而不是 newBlockingStub(channel) 创建的。我没有在服务器端进行任何更改。这是一个简单的一元 RPC 调用。
所以我改变了
Empty response = blockingStub.callMethod(request);
Run Code Online (Sandbox Code Playgroud)
到
asyncStub.callMethod(request, new StreamObserver<Empty>() {
@Override
public void onNext(Empty response) {
logInfo("asyncStub.callMethod.onNext");
}
@Override
public void onError(Throwable throwable) {
logError("asyncStub.callMethod.onError " + throwable.getMessage());
}
@Override
public void onCompleted() {
logInfo("asyncStub.callMethod.onCompleted");
}
});
Run Code Online (Sandbox Code Playgroud)
从那时起,当我使用这个 RPC 时(大多数时候),onError 就会被调用,它给出的错误是“CANCELLED: io.grpc.Context was cancelled without error”。我读到过有关在 RPC 调用中进行 RPC 调用时分叉 Context 对象的内容,但这里的情况并非如此。另外,上下文似乎是一个服务器端对象,我不明白它与客户端有何关系。这是传播回客户端的服务器端错误吗?在服务器端,一切似乎都成功完成,所以我不知道为什么会发生这种情况。在调用 asyncStub.callMethod 之后插入 1ms 睡眠似乎可以使这个问题消失,但达不到目的。任何有助于理解这一点的帮助将不胜感激。
一些注意事项:
service EventHandler {
rpc callMethod(Msg) …Run Code Online (Sandbox Code Playgroud) 我需要在c ++ 11中生成加密安全的随机数据,我担心对所有数据使用random_device会严重限制性能(参见Stephan T. Lavavej的" rand()Considered Harmful "第23页,他说当他测试它(在他的系统上)时,random_device是1.93 MB/s而mt19937是499 MB/s)因为这个代码将在移动设备上运行(Android通过JNI和iOS),这可能比上面的数字慢.
另外我知道mt19937不是加密安全的,来自维基百科:"观察足够数量的迭代(在MT19937的情况下为624,因为这是生成未来迭代的状态向量的大小)允许一个预测所有未来的迭代".
考虑到上述所有信息,我是否可以通过mt19937的每624次迭代从random_device生成一个新的随机种子来生成加密安全的随机数据?或者(可能)更好,每X次迭代,其中X是1到624之间的随机数(来自random_device或者random_device播种的mt19937)?