Xsank's Blog

如果你也不想用flume-client

开题

工作中遇到了一种场景,需要使用多语言版本客户端,而其中java的版本使用到了flume的二方包,考虑到其他语言开发的便捷性,准备移除flume二方包依赖

改造

其实很多场景下使用flume二方包仅仅是为了连接flume并且往里面灌点数据,没有太多复杂的用法,那么需要解决的核心问题就是通信了。

要支持多语言,有很多方案可以选择:jsonxmlprotobufthrift等。考虑到性能及易用,这里使用的是thrift

flume使用thrift的描述文件是:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
namespace java org.apache.flume.thrift
struct ThriftFlumeEvent {
1: required map <string, string> headers,
2: required binary body,
}
enum Status {
OK,
FAILED,
ERROR,
UNKNOWN
}
service ThriftSourceProtocol {
Status append(1: ThriftFlumeEvent event),
Status appendBatch(1: list<ThriftFlumeEvent> events),
}

那接下来就简单多了:
通过thrift工具生成指定语言版本所需的类,稍微包装下通信的client的,就可以剔除flume二方包了

最后

关于二方包,真是要吐个大槽。
考虑到你是为很多开发人员使用,所以应该尽可能的考虑灵活性,通用性,而不应该弄一个大而全的杂货铺:

你没必要为了用一个gcd方法就把commons-math包引入进来
你没必要为了用Lists,Maps初始化就把guava引入进来
你没必要…

真的,如果你有幸写一个二方包,考虑下开发者的感受