Да, структуры Thrift могут включать в себя другие структуры, и ваше определение (повторяется далее) будет работать:
enum ResultCode { OK, TRY_LATER }
struct MyLogStructure {
1: string field_name;
2: string value;
}
struct LogEntry {
1: string category,
2: MyLogStructure message
}
service scribe extends fb303.FacebookService {
ResultCode Log(1: list messages);
}
Если вы переопределите интерфейсы Scribe таким образом, вам, вероятно, придется изменить код Scribe, чтобы он обрабатывал ваш новый тип в зависимости от того, что он делает внутренне с string message
.
Конечно, вы всегда можете сериализовать ваш MyLogStructure
объект в строку и полностью избежать этой проблемы.
Нет, я не думаю, что Scribe сможет легко использовать протоколные буферы для внутреннего представления данных. Весь код RPC был сгенерирован из этих определений, и вы можете переопределить метод Log
, чтобы получить произвольный объект (например, сделать его объектом Буфера протокола), но это будет так же сложно, как и выше.
Насколько мне известно, Google не имеет открытых источников ни одной распределенной системы ведения журналов. Chukwa от Yahoo / Hadoop - одна из альтернатив.