У меня есть служба GRPC, определенная как:
message SendEventRequest {
string producer = 1;
google.protobuf.Any event = 2;
}
message SendEventResponse {
string event_name = 1;
string status = 2;
}
service EventService {
rpc Send(SendEventRequest) returns (SendEventResponse);
}
Я также определил настраиваемый параметр сообщения:
extend google.protobuf.MessageOptions {
// event_name is the unique name of the event sent by the clients
string event_name = 50000;
}
Чего я хочу добиться, так это того, чтобы клиенты создавали собственные прото-сообщения, в которых опция event_name
устанавливалась на константу. Например:
message SomeCustomEvent {
option (mypackage.event_name) = "some_custom_event";
string data = 1;
...
}
Таким образом, служба может отслеживать, какие события отправляются. Когда я делаю что-то подобное, я могу получить значение параметра из определенного proto.Message
:
_, md := descriptor.MessageDescriptorProto(SomeCustomEvent)
mOpts := md.GetOptions()
eventName := proto.GetExtension(mOpts, mypackage.E_EventName)
Однако, когда сообщение имеет тип github.com/golang/protobuf/ptypes/any.Any
, параметры равны нулю. Как я могу получить event_name
из сообщения? Я столкнулся с protoregistry.MessageTypeResolver
, похоже, это может помочь, но мне нужно найти способ динамически обновлять определения прототипов событий при интеграции клиентов.