【问题标题】:Reconnect Neo4jrb connections after puma fork with preload_app?在 puma fork 后使用 preload_app 重新连接 Neo4jrb 连接?
【发布时间】:2016-03-17 22:41:28
【问题描述】:

Heroku suggests using it,但是我在本地开发环境中看到了这些问题

  • 我将 MRI 2.2.3 和 neo4j.rb 6.0.0(ActiveNode 模型)与 HTTP 适配器一起使用
  • 我也在使用 Neo4j 2.2.5 和 jdk1.7.0_51-b53 的 OSX 10.11.2

我已经尝试了很多方法来在分叉后重新打开连接,这是我能想到的最接近的:

cfg = Rails.application.config.neo4j
Neo4j::Session.set_current(Neo4j::Session.open(cfg.session_type, cfg.session_path, cfg.session_options))

但是:

  • 当我确实像这样重新打开连接时,我一直遇到问题,好像法拉第两次返回请求的结果
    • 基本上neo4j.rb调用连接URL(http://localhost:7474/)获取数据URL,然后调用数据URL。但是其他工作人员的连接 URL 有时会返回来自数据 URL 的响应,然后当它尝试实际查询 Neo4j 时会爆炸。
  • 当我重新打开连接时,虽然我没有模拟足够的负载来确定,但似乎一切正常

我怀疑 neo4j-core 会话是限制:neo4j-core on github,我应该忘记在 fork 后重新打开会话,因为 gem 只有一个共享会话。

但我对此不是 100% 有信心,而且大量的谷歌搜索没有给我任何帮助。谁能确认分叉后基本上不需要重新打开连接?

我也很想知道:

  1. 在其他地方发生了某种连接池
  2. 我需要以某种方式对其进行配置
  3. gem 本身需要将池作为功能/拉取请求
  4. 如果性能有问题,我应该只使用嵌入式模式

我还没有达到性能是一个问题的程度,但我想确保我知道我需要什么。谢谢。

其他配置:

  • 这是在 MacBook pro 4 核 i7 = 8 处理器上
  • 我正在使用 foreman 启动 2 个 puma 服务器,一个到端口 80,一个在端口 443
    • 是的,我知道我应该通过 nginx 代理 :-) 这只是本地开发人员的快速设置
    • 每台服务器有 2 个工作线程和 5 个线程 = 10 个线程(即线程 > # 个处理器)

【问题讨论】:

标签: ruby-on-rails heroku neo4j puma neo4j.rb


【解决方案1】:

我怀疑您会通过 Google 找到很多信息(正如您已经发现的那样)。实际上,当我将 Neo4j.rb 应用程序部署到 Heroku 时,我最近开始考虑这个问题。这是应用程序:

https://github.com/neo4j-examples/graphgist_portal

它在 Heroku 上运行 puma。我决定暂时不用担心重新连接,因为我可能很快就会遇到问题(到目前为止我还没有)。

至于neo4j-core,管理会话的旧代码有点麻烦。我一直在为 Cypher 会话构建一个新的 API。这部分是为了拥有更简洁的代码库,同时也是为了支持适配器样式模式以支持 Neo4j 3.0 的新 Bolt 二进制套接字协议。希望这个新的 API 将使创建线程安全的应用程序变得更加简单和容易。

如果您对新 API 感到好奇,它实际上是在 6.0 中发布的,只是还没有推出,因为它还没有完全完成。它主要在这个目录下:

https://github.com/neo4jrb/neo4j-core/tree/master/lib/neo4j/core

我还在这里为它整理了一张图表:

http://i.imgur.com/g5FdPDn.png

【讨论】:

    【解决方案2】:

    我必须管理我对连接池知之甚少,直到我昨天阅读了它们。我想我现在对这个概念有了更好的把握,并且我一直在思考如何将它们应用于宝石。

    目前您通过Neo4j::Session.current 获得会话。该方法的代码是这样的:

      def current
        @@current_session
      end
    

    所以基本上它使用一个类变量。我很确定这不是线程安全的;)我认为我们应该做类似Thread.current[:neo4j_curr_session] 的事情,以便每个线程都有一个会话。类变量到目前为止没有引起任何问题,但可能是它引起了问题,我还没有识别出来。

    关于连接池:我认为典型的用例类似于 puma,其中每个 Web 服务器工作线程都有一个线程。如果每个人都有一个会话,那么您通常可能不会打开很多会话。也就是说,我可以理解某人可能想要什么:

    • 只运行一个 Ruby 脚本,它有很多线程,但不希望每个线程都有一个会话
    • 拥有大量 Web 工作线程,因为它们的负载太大,并且不希望每个线程都有会话

    我认为我的想法是正确的,但如果不是,请务必告诉我。我意识到这是一个“答案”,但作为维护者之一,我正在回答您关于项目当前状态的问题;)

    如果你想谈更多,请加入我们on Gitter

    【讨论】:

    • 我会说这回答了我的“gem 的当前状态是什么”的问题:不是线程安全的/需要修复你指出的那个位。谢谢 Brian,如果我还有更多问题,我也会在 Gitter 上查看。
    • 是的,确实如此。我认为这可能很容易。我提出了一个问题 (github.com/neo4jrb/neo4j-core/issues/241) 并在我的待办事项列表中标记了它
    • 我刚刚做了一个快速更改,我认为这将有助于使 neo4j-core 会话线程安全。刚刚发布为 5.1.13 和 6.0.2
    猜你喜欢
    • 2013-09-14
    • 1970-01-01
    • 2017-02-21
    • 1970-01-01
    • 2016-03-28
    • 2015-10-26
    • 1970-01-01
    • 2014-09-24
    • 2012-08-07
    相关资源
    最近更新 更多