2016-12-24 2 views
2

Я реализую простое обнаружение сервиса grpc. Одна из вещей, которые я хотел бы сделать, - это отслеживать, сколько клиентов в настоящее время относится к этой услуге, и служба сообщит об этом в реестр служб. Предоставляет ли сервер grpc api такую ​​информацию? Я столкнулся с несколько похожим вопросом. https://github.com/grpc/grpc-java/issues/779.grpc количество активных клиентов/каналов

В пункте 1 ответа было упомянуто, что отслеживать все входящие rpc с помощью потокового api. Как именно я это делаю?

Вот пример rpc, который я хочу реализовать, RegisterInstance будет действовать как «пингер», а сервер будет использовать ttl и т. Д., Чтобы проверить работоспособность службы. И реестр будет использовать connected_client, чтобы определить, какой IP-адрес службы будет отправлен обратно клиенту, если в реестре зарегистрировано более одного типа услуг. Моя проблема заключается в том, как я могу получить connected_clients со стороны службы?

syntax = "proto3"; 

package registry_grpc; 

service ServiceRegistry{ 
    rpc GetInstance(ServiceRequest) returns(ServiceInstance) {} 
    rpc RegisterInstance(ServiceInstance) returns(ServiceInstance) {} 
} 


message ServiceRequest{ 
    string service_type = 1; 
} 

message ServiceInstance{ 
    int32 id = 1; 
    int32 connected_clients = 2; 
    string service_type = 3; 
    string host_address = 4; 
    int32 port = 5; 
} 

редактировать

Я обнаружил, что это возможно, чтобы перехватить все входящие вызовы RPC. Таким образом, я могу сообщить, например, количество входящих соединений за последнюю секунду. Я предполагаю, что это может служить прокси для рабочей нагрузки.

ответ

2

ServerBuilder имеет addTransportFilter(), который позволяет установить ServerTransportFilter, где вы получите уведомление, когда соединение (т.е. транспорт) создается и завершается.

+0

Какова доступность этой функции на всех языках? В любом случае, похоже, что это не так для разных языков. Предоставляет ли это уведомление для каждого соединения или для вызова rpc? Например, в python 'add_generic_rpc_handlers' и в golang' UnaryInterceptor' могут выдавать уведомление за вызов rpc, но не за соединение. –

+0

Не уверен, что касается других языков. Java-сервер «ServerTransportFilter» уведомляется о каждом соединении. –

Смежные вопросы