有没有一种干净的方法来使用节俭来定义事件?
Is there a clean way to define events using thrift?
在我的应用程序中,有几个组件将生成各种不同类型的特定于应用程序的事件。这些事件将发布给经纪人并传递给 N 个客户。其中一些客户端是我的服务器端应用程序中的其他 Java classes,但主要消费者是我的 java 基于脚本的 WebUI。
到目前为止,我目前的方法是定义一个抽象事件库 class 来封装一些公共字段,然后为每个事件实现一个特定的事件 class。
这一直工作正常,除了现在我需要在 java 脚本和 java 端维护事件,以便任何一方都可以对其他事件做出反应。
我今天早上想到我可以利用 Thrift(该项目已经大量使用它)来定义事件数据结构并在任何一侧自动生成 classes。这不仅解决了编写 class 文件的繁琐工作,而且确保了一致性。
我的问题是,由于 thrifts 中的数据对象是结构体(无法扩展),我无法封装公共字段,也无法使用单个基础来传递事件 class .
到目前为止我想出的解决方法是在 thrift IDL 中定义一个结构作为 'base' class,每个事件类型都有一个可选字段我定义。这仍然会让我有一个 class 来一般地引用事件,同时也让我在生成事件时捕获相关数据。
也许这只是我对 thrift 不是很熟悉,但这感觉像是 hack。我离得远了,还是这是一种好的方法?有没有更好的方法来完成这个?
Thrift 作为一种序列化和RPC 机制只允许一对一连接,因此并不能真正解决问题。但你没有迷路。
如果你想做一对多,你应该使用一些消息系统。 Thrift 可以很容易地与各种级别的消息传递系统相结合。源代码树的 /contrib
folder 提供了一些关于如何实现这一点的示例。
使用 Thrift union
作为信封来保存你所有的各种数据结构是一个有效的解决方案,因为它允许最小化序列化和反序列化代码 - 你只需要一对函数来处理总是相同的 Envelope
结构(当然可能有不同的内容)。
struct Foo { ... some member fields ... }
struct Bar { ... some member fields ... }
struct Baz { ... some member fields ... }
union Envelope {
1: Foo foo
2: Bar bar
3: Baz baz
}
在我的应用程序中,有几个组件将生成各种不同类型的特定于应用程序的事件。这些事件将发布给经纪人并传递给 N 个客户。其中一些客户端是我的服务器端应用程序中的其他 Java classes,但主要消费者是我的 java 基于脚本的 WebUI。
到目前为止,我目前的方法是定义一个抽象事件库 class 来封装一些公共字段,然后为每个事件实现一个特定的事件 class。
这一直工作正常,除了现在我需要在 java 脚本和 java 端维护事件,以便任何一方都可以对其他事件做出反应。
我今天早上想到我可以利用 Thrift(该项目已经大量使用它)来定义事件数据结构并在任何一侧自动生成 classes。这不仅解决了编写 class 文件的繁琐工作,而且确保了一致性。
我的问题是,由于 thrifts 中的数据对象是结构体(无法扩展),我无法封装公共字段,也无法使用单个基础来传递事件 class .
到目前为止我想出的解决方法是在 thrift IDL 中定义一个结构作为 'base' class,每个事件类型都有一个可选字段我定义。这仍然会让我有一个 class 来一般地引用事件,同时也让我在生成事件时捕获相关数据。
也许这只是我对 thrift 不是很熟悉,但这感觉像是 hack。我离得远了,还是这是一种好的方法?有没有更好的方法来完成这个?
Thrift 作为一种序列化和RPC 机制只允许一对一连接,因此并不能真正解决问题。但你没有迷路。
如果你想做一对多,你应该使用一些消息系统。 Thrift 可以很容易地与各种级别的消息传递系统相结合。源代码树的 /contrib
folder 提供了一些关于如何实现这一点的示例。
使用 Thrift union
作为信封来保存你所有的各种数据结构是一个有效的解决方案,因为它允许最小化序列化和反序列化代码 - 你只需要一对函数来处理总是相同的 Envelope
结构(当然可能有不同的内容)。
struct Foo { ... some member fields ... }
struct Bar { ... some member fields ... }
struct Baz { ... some member fields ... }
union Envelope {
1: Foo foo
2: Bar bar
3: Baz baz
}