Наконец, мы заставили gRPC работать в #dstack после того, как провели целый день! Поскольку шлюз dstack может обернуть произвольный TCP в TLS, я предположил, что это просто сработает. Но этого не произошло.
Ключевая деталь: gRPC работает на HTTP/2. HTTP/2 обычно полагается на ALPN (Переговоры протокола на уровне приложений) во время TLS-рукопожатия.
Думайте о ALPN как о моменте, когда обе стороны согласны, какой протокол использовать (h2 для HTTP/2), прежде чем они обменяются какими-либо фактическими данными. Если этот шаг не удается, соединение переходит на HTTP/1.1 — который gRPC не может использовать.
Чтобы шлюз правильно обрабатывал gRPC, он должен: 1️⃣ Поддерживать HTTP/2 от конца до конца 2️⃣ Договориться о h2 с ALPN во время TLS-рукопожатия 3️⃣ Сохранять бинарное кадрирование и трейлеры gRPC Если что-то из этого не выполнено, вы увидите странные зависания, отсутствующие ошибки или поврежденные потоки.
680