我有一个客户端和一个服务器的简单设置。客户端想要在服务器中执行一个使用 ZeroMQ 进行通信的方法。我将使用 REQ 和 REP 套接字,因为它们适用于这个用例。不过,我对 protobuf 的定义有疑问。我认为这两个选项可用于实现目标:
message ControlService{
string control = 1;
int32 serverId = 2;
bool block = 3;
double temperature = 4;
}
Run Code Online (Sandbox Code Playgroud)
其中“control”包含要远程执行的方法的名称。另一种选择可以是:
message InputParameters{
int32 serverId = 1;
bool block = 2;
double temperature = 3;
}
message Empty{
}
service ControlService{
rpc control (InputParameters) returns (Empty);
}
Run Code Online (Sandbox Code Playgroud)
最好的方法是什么?或者至少使用一种方法而不是另一种方法的权衡是什么?
我正在尝试使用grpc来实现pub sub模式,但是我对如何正确地做到这一点感到困惑。
我的原型: rpc call (google.protobuf.Empty) returns (stream Data);
客户:
asynStub.call(Empty.getDefaultInstance(), new StreamObserver<Data>() {
@Override
public void onNext(Data value) {
// process a data
@Override
public void onError(Throwable t) {
}
@Override
public void onCompleted() {
}
});
} catch (StatusRuntimeException e) {
LOG.warn("RPC failed: {}", e.getStatus());
}
Thread.currentThread().join();
Run Code Online (Sandbox Code Playgroud)
服务器服务:
public class Sender extends DataServiceGrpc.DataServiceImplBase implements Runnable {
private final BlockingQueue<Data> queue;
private final static HashSet<StreamObserver<Data>> observers = new LinkedHashSet<>();
public Sender(BlockingQueue<Data> queue) {
this.queue = queue;
}
@Override
public …Run Code Online (Sandbox Code Playgroud)