В настоящее время оркестратор может потреблять 5-10 микросервисов, живущих на разных хостах, таких как localhost: 444 , localhost: 445 ,. .. Итак, в оркестраторе, я думаю, нужно иметь n -каналы и n gtubs (потому что я не могу делиться причинами каналов хостов). < /p>
Используя ASYNC API, я создал Один очередь завершения для всех клиентов, а также потока, которая будет постоянно ждать следующего результата: < /p>
auto AsyncRpcEngine::start_completion_queue_loop_thread() -> void
{
std::thread{&AsyncRpcEngine::completion_queue_loop, this}.detach();
}
auto AsyncRpcEngine::retrieve_completion_queue() -> grpc::CompletionQueue&
{
return completion_queue_;
}
auto AsyncRpcEngine::completion_queue_loop() -> void
{
void* function_tag;
bool ok = false;
while (completion_queue_.Next(&function_tag, &ok))
{
auto function_call = static_cast< std::function* >(function_tag);
(*function_call)();
delete function_call;
}
}
< /code>
Так что у меня есть несколько вопросов: < /p>
- - мой подход использования одной очереди завершения для n gtubs /клиенты-хорошее решение? > будет ли большие накладные расходы для создания нескольких каналов?
- Я выбрал Async API, потому что он позволил мне иметь больше контроля над потоками/асинхронными операциями, и у меня уже есть некоторые функции, чтобы сделать некоторые обратные вызовы и ожидаемые задачи GRP 'М не обдумываю оптимизацию или лучший подход к моей проблеме, пожалуйста, дайте мне знать, как я могу сделать свою программу более эффективной.
Подробнее здесь: https://stackoverflow.com/questions/794 ... mpletion-q
Мобильная версия