我在这里有两个问题:
问题1:
- thrift可以提供内部类功能吗? (见下一个例子)
- 如果可以,可以轻易地使用这些功能吗?
这是划线界面(scribe / if / scribe.thrift)。但它的消息字段只能是字符串,我认为不够灵活。
#!/usr/local/bin/thrift --cpp --php
## Copyright (c) 2007-2008 Facebook
...
...
## See accompanying file LICENSE or visit the Scribe site at:
## http://developers.facebook.com/scribe/
include "fb303/if/fb303.thrift"
namespace cpp scribe.thrift
enum ResultCode
{
OK,
TRY_LATER
}
struct LogEntry
{
1: string category,
2: string message
}
service scribe extends fb303.FacebookService
{
ResultCode Log(1: list<LogEntry> messages);
}
如果我可以做以下事情会很棒(我甚至不知道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<LogEntry> messages);
}
问题2:
- 可以轻松地使用协议缓冲区作为内部数据表示吗? (没有太多的代码修改)
- 如果上述问题的答案为“否”,谷歌是否开源其贿赂实施?
答案 0 :(得分:2)
是的,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可以轻松地使用Protocol Buffers作为其内部数据表示。所有RPC代码都是从这些定义生成的,你可以重新定义Log
方法来获取一个任意对象(比如说,它是一个Protocol Buffers对象),但这和上面的一样困难。
据我所知,谷歌尚未开源任何分布式日志记录系统。来自Yahoo / Hadoop的Chukwa是另一种选择。