2010-01-21 5 views
1

J'ai deux questions ici:scribe avec tampon de protocole et épargne avancée?

Question 1:

- Thrift peut fournir une fonctionnalité de classe interne? (voir mon exemple suivant)

- si cela est possible, l'économie d'énergie peut-elle facilement utiliser ces fonctionnalités?

Voici l'interface de scribe (scribe/if/scribe.thrift). Mais son champ de message ne peut être que de la chaîne, ce que je ne crois pas assez flexible.

#!/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); 
} 

Ce serait génial si je peux faire la chose suivante (je ne sais même pas si Thrift lui-même fournit la fonctionnalité de classe interne en fonction de son tampon document-- mais le protocole peut certainement).

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); 
} 

Question 2:

- Peut tracer utiliser le tampon de protocole que la représentation interne des données facilement? (sans trop modifier le code)

- Si la réponse à la question précédente est "non", Google a-t-il ouvert sa mise en œuvre sribe?

Répondre

2

Oui, Thrift struct peuvent inclure d'autres struct, et votre définition (actes répétés) travaillerait:

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); 
} 

Si vous redéfinissez les interfaces de Scribe comme celui-ci, vous auriez probablement modifier le code de Scribe pour gérer votre nouvelle tapez en fonction de ce qu'il fait en interne avec string message.

Bien sûr, vous pouvez toujours sérialiser votre objet MyLogStructure en une chaîne et éviter complètement ce problème. Non, je n'imagine pas que Scribe serait capable d'utiliser les tampons de protocole comme sa représentation de données interne facilement. Tout le code RPC a été généré à partir de ces définitions, et vous pourriez redéfinir la méthode Log pour prendre un objet arbitraire (par exemple, un objet Protocol Buffers) mais ce serait tout aussi difficile que ce qui précède. À ma connaissance, Google n'a ouvert aucun système de journalisation distribué à l'insu de tous. Chukwa de Yahoo/Hadoop est une alternative.

Questions connexes