2016-12-24 22 views
2

私は簡単なgrpcサービスディスカバリを実装しています。私がやりたいことの1つは、現在サービスにどれくらいのクライアントがいるかを追跡することです。サービスはそれをサービスレジストリに報告します。 grpcサーバAPIはそのような情報を提供しますか?私はここで幾分似たような質問に出くわしました。 https://github.com/grpc/grpc-java/issues/779grpcアクティブなクライアント/チャネルの数

応答のポイント1では、ストリーミングAPI経由で受信したすべてのrpcを追跡することが記載されていました。どのように私はそれを正確に行うのですか?

私が実装したいrpcの例は、RegisterInstanceは "pinger"として動作し、サーバはetcdのttlを使ってサービスの有効性をチェックします。レジストリは、を使用して、レジストリに登録されている同じサービスタイプが複数ある場合にどのサービスをクライアントに返すかを決定します。私の問題は、サービス側から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呼び出しをインターセプトすることは可能だということを発見しました。このようにして、最後の1秒間に着信接続数を報告することができます。私はそれがワークロードのプロキシとして役立つと思う。

答えて

2

ServerBuilderにはaddTransportFilter()があり、ServerTransportFilterをインストールして、接続(トランスポート)の作成および終了時に通知を受け取ることができます。

+0

この機能はすべての言語で利用できますか?いずれにしても、それを行う方法は異なる言語では同じではないようです。接続ごとまたはrpcコールごとに通知を出しますか?たとえば、Pythonでは 'add_generic_rpc_handlers'とgolang' UnaryInterceptor'はrpc呼び出しごとに通知できますが、接続ごとに通知することはできません。 –

+0

他の言語についてはわかりません。 Javaの 'ServerTransportFilter'は接続ごとに通知されます。 –

関連する問題