用协议缓冲区和高级节俭划线?

时间:2010-01-21 01:31:34

标签: logging protocol-buffers thrift scribe-server

我在这里有两个问题:

问题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:

- 可以轻松地使用协议缓冲区作为内部数据表示吗? (没有太多的代码修改)

- 如果上述问题的答案为“否”,谷歌是否开源其贿赂实施?

1 个答案:

答案 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是另一种选择。