用于Storm拓扑的Mongo连接池

时间:2014-12-17 09:07:16

标签: java mongodb apache-storm

要连接到mongo数据库,在我们的非风暴应用程序中,我们将创建Mongo类的单例实例并在整个应用程序中共享它
想知道在风暴框架中实现Mongo连接池的正确方法是什么?
我们尝试的选项:
我们有一个从Mongo数据库读取的spout。我们只是将单例Mongo类放在spout中并在open方法中初始化它? - 但是这种方法使得如果需要的话就不可能将Mongo实例共享到一个螺栓上 我想对正确的做法有一些指示。

2 个答案:

答案 0 :(得分:1)

风暴中的连接池有点复杂,因为你需要考虑几件事情:

  1. 您正在群集环境中运行 - >多台机器需要自己的连接
  2. 每个Storm worker 在单独的JVM中运行 - >很可能执行者没有在同一个工作者中运行......这意味着没有共享连接
  3. 所以,不要过分担心它。像往常一样继续在你的Spouts和Bolts中使用你班级的Singleton实例(比如@ bridiver'答案)。如果他们碰巧共享同一个JVM,那么他们将共享同一个池,你就可以了!

    关于初始化,这是我的工作:

    1. 通过构造函数
    2. 将配置信息传递到spout / bolt中
    3. open(针对鲸鱼嘴)或prepare(针对弩)方法中初始化您的连接
    4. 在spout和bolt
    5. 之间共享连接

答案 1 :(得分:1)

缺少拓扑初始化方法可能会有问题。我们所做的是在单例上调用一个方法,该方法在使用它的任何螺栓的prepare方法(获取配置)中初始化连接池。我们使用带有标志的synchronized方法来确保实际初始化仅执行一次。调用同步方法会有很小的性能损失,但在大多数情况下,它不是问题。

Mongo.create_connection_pool(conf)

和方法

public static synchronized void create_connection_pool(Config conf) {
  if (connected)
     return;
  else {
    initialize connection...
    connected = true;
  }
}