Недавно мы обнаружили производственную проблему, которая была вызвана двумя унарными вызовами RPC, запущенными в быстрой последовательности на разных RPC, которые часто принимались и обрабатывались вне очереди. Мы объединили эти два вызова в один RPC с новым полем дискриминатора в сообщении, чтобы указать, что должен делать вызов. Экспериментально это решило проблему на 100%, однако я не могу найти ничего явного, что унарные вызовы RPC будут доставляться в том порядке, в котором они вызываются (пока я игнорирую возможность сбоя сообщения и просто думаю о номинальном случай.)
Я знаю, что преобразование в потоковый RPC гарантирует упорядочение, но в данном конкретном случае это немного сложно по архитектурным причинам. Если я не могу гарантировать ожидаемый порядок получения, я, вероятно, просто добавлю третье значение к дискриминатору, который сообщит получателю сделать первое действие, а затем немедленно выполнить второе, чтобы порядок RPC не вступал в игру, но я Мне все еще интересно, существует ли эта гарантия.
И клиент, и сервер используют асинхронный API gRPC C++ с одним потоком, управляющим очередью завершения, если это имеет какое-либо значение.Спасибо
Подробнее здесь: https://stackoverflow.com/questions/791 ... guaranteed