gRPC:如何区分服务器端的双流客户端?
gRPC: How can I distinguish bi-streaming clients at server side?
在这个 tutorial and example code 中,服务器可以在每个流观察器上调用 onNext()
方法,这将 向所有客户端广播 消息服务器。但是没有办法识别哪个观察者对应哪个客户端。服务器如何将消息推送到特定客户端而不是广播?
根据 this answer,如果元数据提供客户端 ID,则可以映射每个观察者。似乎 const auto clientMetadata = context->client_metadata();
部分可以解决问题,但我正在使用 Java,而不是 C++。是否有任何 Java 等效于在服务器端获取元数据?
答案在一定程度上取决于如何识别客户。如果初始请求提供了句柄(如用户名,但未注册 ahead-of-time),那么您可以等待第一个 onNext()
:
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
return new StreamObserver<Chat.ChatMessage>() {
@Override
public void onNext(Chat.ChatMessage value) {
String userHandle = value.getHandle();
// observers would now be a map, not a set
observers.put(userHandle, responseObserver);
...
让我们假设所有用户都已登录,并在 headers 中提供令牌,例如 OAuth。然后,您将使用拦截器对用户进行身份验证,并使用 Context 将其传播到应用程序,如 https://whosebug.com/a/40113309/4690866 .
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
// USER_IDENTITY is a Context.Key, also used by the interceptor
User user = USER_IDENTITY.get();
observers.put(user.getName(), responseObserver);
return new StreamObserver<Chat.ChatMessage>() {
...
第一个是easier/nicer当标识只适用于这个RPC。第二个是easier/nicer当标识适用于很多RPC时
在这个 tutorial and example code 中,服务器可以在每个流观察器上调用 onNext()
方法,这将 向所有客户端广播 消息服务器。但是没有办法识别哪个观察者对应哪个客户端。服务器如何将消息推送到特定客户端而不是广播?
根据 this answer,如果元数据提供客户端 ID,则可以映射每个观察者。似乎 const auto clientMetadata = context->client_metadata();
部分可以解决问题,但我正在使用 Java,而不是 C++。是否有任何 Java 等效于在服务器端获取元数据?
答案在一定程度上取决于如何识别客户。如果初始请求提供了句柄(如用户名,但未注册 ahead-of-time),那么您可以等待第一个 onNext()
:
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
return new StreamObserver<Chat.ChatMessage>() {
@Override
public void onNext(Chat.ChatMessage value) {
String userHandle = value.getHandle();
// observers would now be a map, not a set
observers.put(userHandle, responseObserver);
...
让我们假设所有用户都已登录,并在 headers 中提供令牌,例如 OAuth。然后,您将使用拦截器对用户进行身份验证,并使用 Context 将其传播到应用程序,如 https://whosebug.com/a/40113309/4690866 .
public StreamObserver<Chat.ChatMessage> chat(StreamObserver<Chat.ChatMessageFromServer> responseObserver) {
// USER_IDENTITY is a Context.Key, also used by the interceptor
User user = USER_IDENTITY.get();
observers.put(user.getName(), responseObserver);
return new StreamObserver<Chat.ChatMessage>() {
...
第一个是easier/nicer当标识只适用于这个RPC。第二个是easier/nicer当标识适用于很多RPC时