Я использую gRPC для разбивки вызова на страницы и пытаюсь выяснить варианты его выполнения/приближения для него. Это разумный вопрос? Какие ресурсы я могу использовать для этого?
Пагинация в gRPC
Ответы (3)
Этот вопрос довольно старый, но я чувствую, что в ответе чего-то не хватает.
Хотя потоковая передача ИМХО предпочтительнее, у меня есть случаи, когда «традиционная» нумерация страниц весьма полезна. Давайте представим службу user, которая обеспечивает доступ CRUD к пользовательскому хранилищу и имеет ListUsers и SearchUsers rpc. Разбить результат на страницы здесь гораздо удобнее.
Я лично использую для этого подход Google: https://github.com/googleapis/googleapis/blob/master/google/cloud/resourcemanager/v2/folders.proto
Разбивка на страницы очень похожа на разбиение бинарных полезных данных на фрагменты. Мой ответ в gRPC + загрузка изображения, вероятно, стоит прочитать.
Тем не менее, у разбиения на страницы могут быть разные компромиссы, поскольку обычно это гораздо более низкая пропускная способность, а иногда не так сложно использовать отдельные запросы. Низкая пропускная способность может помешать управлению потоком сработать достаточно быстро, чтобы оно стало полезным. Использование отдельных запросов сложнее для полностью динамических результатов, таких как результаты поиска, но может не быть большой проблемой для более статических данных, таких как дочерние элементы ресурса.
Поскольку управление потоком gRPC может буферизовать слишком много, дополнительным вариантом является использование потоковой передачи, но введение управления потоком на уровне приложения. С управлением потоком на уровне приложения вы будете использовать сообщения в потоке, запрашивая, сколько ответов вы хотите, что не так уж сложно использовать или реализовать. Ходили разговоры о встроенной поддержке точного управления потоком на основе сообщений в gRPC (что в данном случае дало бы аналогичные результаты), но неясно, произойдет ли это и когда.
Google сами написали хороший документ по этому поводу: https://cloud.google.com/apis/design/design_patterns#list_pagination
- определить поле
stringpage_tokenв сообщении запроса методаList. Клиент использует это поле для запроса конкретной страницы результатов списка. - определить поле
int32page_sizeв сообщении запроса методаList. Клиенты используют это поле, чтобы указать максимальное количество результатов, возвращаемых сервером. Сервер может дополнительно ограничивать максимальное количество результатов, возвращаемых на одной странице. Если page_size равен 0, сервер определит количество возвращаемых результатов. - определите поле
stringnext_page_tokenв ответном сообщении методаList. Это поле представляет токен разбиения на страницы для получения следующей страницы результатов. Если значение равно , это означает отсутствие дальнейших результатов для запроса.
Часть об использовании FieldMask для частичных ответов также стоит прочитать, поскольку это распространенный шаблон проектирования API.