Storm Bolt数据库连接

时间:2014-01-03 11:35:56

标签: cassandra connection apache-storm

我正在使用Storm(java)和Cassandra。

我的一个Bolts将数据插入到Cassandra中。有没有办法在这个螺栓的实例之间保持与Cassandra的连接?

我的应用程序的写入速度很快。螺栓需要每秒运行几次,并且每次连接到Cassandra的事实都会阻碍性能。

如果我可以保持打开的静态连接,它会运行得更快,但我不确定在风暴中实现这一点。

澄清问题:

风暴拓扑中静态连接的范围是什么?

与其他具有工作的消息系统不同,其中“工作”在循环或回调中进行,可以在此循环外部使用变量(可能是静态连接),每次调用时,风暴螺栓似乎都会被实例化并且不能将参数传递给它们,那么如何使用与cassandra相同的连接?

1 个答案:

答案 0 :(得分:9)

与其他具有工作的消息系统不同,循环或回调中的“工作”可以在此循环之外使用变量(可能是静态连接),风暴螺栓似乎每次都被实例化它们被调用,并且不能将参数传递给它们

说他们打电话给instantiated each time风暴螺栓并不完全正确。例如,prepare方法仅在初始化阶段被调用,即仅一次。从文档中说出当在群集上的worker中初始化此组件的任务时调​​用它。它为螺栓提供螺栓执行的环境。

所以最好的办法是将初始化代码放在准备或打开(如果是spouts)方法,因为它们将在任务启动时被调用。但是你需要使它成为线程安全的,因为它将在它自己的线程中同时被每个任务调用。

另一方面,execute(Tuple tuple)方法实际上负责处理逻辑,并且每次从相应的喷口或螺栓接收元组时都会调用它。(所以这实际上就是所谓的每个单次螺栓运行)

IBolt将要关闭时调用cleanup方法,文档说

  

没有保证会调用清理,因为   supervisor kill -9在集群上的工作进程。一个上下文   清除保证被调用的地方是拓扑被杀死的时候   当 以本地模式运行Storm时

因此,您无法将变量传递给它,您可以使用prepare方法实例化任何实例变量,然后在处理过程中使用它。

关于数据库连接,我不完全确定您的用例,因为您没有放任何代码,但维护资源池听起来对我来说是一个不错的选择。