#grpc #grpc-java
Вопрос:
Я пишу ClientInterceptor
для проекта Java, который реализует кэш, чтобы обойти выполнение запроса сервера, если у нас есть ответ в кэше.
Я сильно смоделировал его на основе этого примера в базе grpc-java
кода
Моя реализация соответствует этому
public void sendMessage(ReqT message) {
Cache cache = cacheManager.getCache(methodDescriptor.getFullMethodName());
requestKey = new Key(methodDescriptor.getFullMethodName(), (GeneratedMessageV3) message);
ValueWrapper cachedResponse = cache.get(requestKey);
if (Objects.nonNull(cachedResponse)) {
// already cached
listener.setPutInCache(false);
Value responseValue = (Value) cachedResponse.get();
listener.onMessage(responseValue.response);
listener.onClose(Status.OK, new Metadata());
return;
}
// not in cache
listener.setRequestKey(requestKey);
listener.setPutInCache(true);
super.sendMessage(message);
}
Моя проблема в том, что для каждого кэшированного ответа, который я использую, вместо сообщения grpc_client_status=OK
я вместо этого получаю grpc_client_status=Internal
сообщение Half-closed without a request
. Я предполагаю, что это исходит от сервера, сообщающего нам, что мы начали вызов, но затем закрыли его рано.
Есть ли правильный способ закрыть этот запрос, чтобы сервер не отправил нам это сообщение об ошибке? Прямо сейчас моя статистика клиентов grpc показывает, что подавляющее число наших клиентских запросов не выполняется из-за внутренней ошибки, а не успешно.
Комментарии:
1. Если вы обходите запрос сервера (при обнаружении кэшированного ответа), возникает вопрос о том, что сервер отправляет сообщение об ошибке «полуприкрыто без запроса»? Убедитесь, что вы
listener
правильно сконструированы.