从here:
Storm从一开始就设计为与多种语言兼容。 Nimbus是Thrift服务,拓扑被定义为Thrift结构。使用Thrift可以从任何语言使用Storm。
我看到在Java中创建的拓扑是通过将拓扑(喷口, bolt ,ComponentCommon)序列化为Thrift数据类型而部署的,然后部署在Nimbus上。在Java中,使用对象的方法和数据来序列化对象很容易。因此,另一方面,Nimbus只需要创建对象并调用它们即可。 (我可能在这里缺少细节,但我希望我正确理解了这一点)
但是我不知道如何用C++编写拓扑并以相同的方式部署它。 Thrift 是否有助于序列化基于c++的拓扑,并且Nimbus以与Java相同的方式部署/执行拓扑?
在这方面,我已经看到了link1链接link2,唯一的解决方案似乎是使用Shelbolt。它调用该过程并通过标准I/O与之通信。
为了使用Thrift方式,我们是否还需要用C++重写Storm核心?当仅支持JVM语言时,为什么还要使用Thrift? Thrift似乎根本没有用于python/c++之类的语言。
最佳答案
我不确定我是否正确理解了您的问题-就我的理解而言,您是在询问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调用。基本上,您需要移植the Java TopologyBuilder
。在C++方面,您可以启动with the Thrift C++ tutorial。
这也是一种hack,因为您基本上只重建一半的堆栈(在这种情况下,是在Thrift的顶部),但是通常来说,对于像Storm这样的系统设计,您几乎没有其他选择。
例如,MySQL二进制协议(protocol)已从-scr重建
除非有人为您完成工作(在研究中我会完全错过),否则我只能选择自己做(也许 Storm 不是您的用例的最佳工具!?)
如果除了ShellBolt之外的另一种技巧(可能更复杂,甚至更慢)对您足够好,您可以尝试从C++内部启动JVM,例如参见this SO post。我不会推荐这个。
如果您需要其他分布式任务队列,那么我在Python环境中拥有Celery方面的丰富经验,但是我没有直接在C++中使用它的经验(我通常使用ZeroMQ控制Python,或者在必要时编写自己的基于ZeroMQ的队列,但这不是通用解决方案)。
关于c++ - 如何在Storm中的Storm和Thrift使用上编写c++ spout/bolt,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19108769/