私は簡単なgrpcサービスディスカバリを実装しています。私がやりたいことの1つは、現在サービスにどれくらいのクライアントがいるかを追跡することです。サービスはそれをサービスレジストリに報告します。 grpcサーバAPIはそのような情報を提供しますか?私はここで幾分似たような質問に出くわしました。 https://github.com/grpc/grpc-java/issues/779。grpcアクティブなクライアント/チャネルの数
応答のポイント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秒間に着信接続数を報告することができます。私はそれがワークロードのプロキシとして役立つと思う。
この機能はすべての言語で利用できますか?いずれにしても、それを行う方法は異なる言語では同じではないようです。接続ごとまたはrpcコールごとに通知を出しますか?たとえば、Pythonでは 'add_generic_rpc_handlers'とgolang' UnaryInterceptor'はrpc呼び出しごとに通知できますが、接続ごとに通知することはできません。 –
他の言語についてはわかりません。 Javaの 'ServerTransportFilter'は接続ごとに通知されます。 –