如何在Storm中编写关于Storm和Thrift使用的c ++ spout/bolt

wei*_*ima 10 c++ thrift apache-storm

这里开始:Storm从一开始就被设计为与多种语言兼容.Nimbus是一种Thrift服务,拓扑被定义为Thrift结构.Thrift的使用允许使用任何语言的Storm.

我看到在java中创建的拓扑通过将拓扑(spouts,bolt,ComponentCommon)序列化为Thrift数据类型然后部署在Nimbus上来部署.在Java中,使用其方法和数据很容易地序列化对象.所以在另一方面,Nimbus只需要创建对象并调用它们.(我可能在这里缺少细节,但我希望我能正确理解这一点)

但我想知道如何用C++编写拓扑并以相同的方式部署它.thrift是否有助于序列化基于c ++的拓扑,而Nimbus以与Java相同的方式部署/执行拓扑?

在这方面我看到链接link1 link2,唯一的解决方案似乎是使用Shelbolt.它调用进程并通过标准i/o与之通信.

为了使用Thrift方式,我们是否还需要在C++中重写storm核心?另外,为什么在仅支持JVM语言时使用Thrift?对于像python/c ++这样的语言,似乎根本没有使用Thrift.

Uli*_*ler 4

我不确定我是否正确理解你的问题——根据我的理解,你在问Is it possible [without the Shebolt hack] to use Storm [with Thrift as comm protocol] with C++-written bolts and with C++ as the language that creates the topology

由于这个问题缺乏其他答案,并且根据我自己的研究,我认为您的问题没有完成的、可用的实现。

因此,如果你确实必须使用 Storm(它的常见用例是 JVM,因此即使理论上它可以与任何语言一起工作,但这并不意味着存在其他语言的生态系统)和 C++,你别无选择,只能使用Shebolt 破解或您自己修改 Thrift。

如您所知,thrift 本身也已移植到 C++。因此可以用 C++ 重新构建 API 调用。基本上,您需要移植JavaTopologyBuilder . 在 C++ 方面,您可以从 Thrift C++ 教程开始。

这也是某种黑客攻击,因为您基本上只重建了一半的堆栈(在本例中是在 Thrift 之上),但一般来说,对于像 Storm 这样的系统设计,您几乎没有其他选择。例如,MySQL二进制协议已从-scr重建

除非有人为你完成了这项工作(我在研究中完全错过了这一点),否则我看不到除了自己做之外别无选择(也许甚至 Storm 也不是适合你的用例的最佳工具!?)

如果除了 ShellBolt 之外的另一种 hack(可能更复杂,甚至更慢)对您来说足够好,您可以尝试从 C++ 内部启动 JVM,例如参见这篇 SO post。我不会推荐这个。

如果你需要一个替代的分布式任务队列,我在Python环境中使用Celery有很好的经验,但是我没有直接在C++中使用它的经验(我通常使用ZeroMQ控制Python,或者在必要时编写我自己的基于ZeroMQ的队列,但这不是通用的解决方案)。