Почему я не могу получить ответ, отличный от nil, и ошибку от grpc

Я работаю над сервисом grpc с использованием golang, я заметил, что если есть ошибка rpc, я получаю

response = nil 
err = some error

даже если я возвращаю ненулевой ответ вместе с ошибкой.

Однако я также вижу в своем файле pb.go:

err := c.cc.Invoke(ctx, "/proto.MyService/Hello", in, out, opts...)
    if err != nil {
        return nil, err
    }
    return out, nil

Если err не равно нулю, они делают ответ равным нулю, я думаю, это причина, по которой я получаю такой ответ.

Я не думаю, что имеет смысл получать ответ при возникновении ошибки, но тем не менее, есть ли способ получить как ответ, отличный от nil, так и ошибку err от grpc?


person Aman Patel    schedule 22.05.2020    source источник
comment
Есть два типа ошибок при использовании чего-то вроде grpc. Ошибки, возвращаемые вашим кодом обработки, и ошибки, возвращаемые подсистемой grpc (которые не следует игнорировать). В первом случае вы можете выполнить индивидуальную обработку, не распространяя ошибку обычным способом, вместо этого помещая информацию об ошибке в сам ответ.   -  person Marc    schedule 22.05.2020
comment
Спасибо @Marc. Это то, чем я сейчас занимаюсь   -  person Aman Patel    schedule 24.05.2020


Ответы (2)


Причина проста. gRPC - это конкретная реализация концепции RPC (удаленных вызовов процедур), в которой другой процесс вызывается так, как если бы он был частью вашей системы. gRPC выполняет кросс-компиляцию с другими языками, включая те, которые не поддерживают несколько возвращаемых значений (например, C ++, Java). Вместо того, чтобы возвращать ошибку, сгенерированный клиент генерирует исключение. Следовательно, любой ответ, который вы вернете в дополнение к ошибке, будет проигнорирован, что сделает вашу реализацию менее переносимой.

Хотя go поддерживает и то, и другое, мы не хотим, чтобы RPC давал разные результаты в зависимости от конкретного языка, на котором был реализован клиент. Что еще должен делать файл pb.go, кроме: если произошла ошибка, вся информация должно быть в ошибке, если нет, ответ должен быть возвращен?

Обогатите возвращаемые вами ошибки, если вам по-прежнему нужны и то, и другое.

person Elias Van Ootegem    schedule 22.05.2020
comment
Спасибо @Elias. Это действительно помогло лучше понять это - person Aman Patel; 24.05.2020
comment
@AmanPatel Не беспокойтесь. Если ответ полезен, способ поблагодарить людей - это проголосовать за или пометить ответ как принятый, а не оставлять благодарственный комментарий. Спасибо - person Elias Van Ootegem; 24.05.2020

Как объясняется в официальной документации, стандартная ошибка gRPC - это код и дополнительная строка ошибки.

Если вам нужно получить какой-то ответ, используйте вместо этого расширенную модель ошибок, чтобы включить в него ответ. В качестве примера проверьте Шаблон для расширенной обработки ошибок в gRPC

person Damien Leroux    schedule 22.05.2020