使用 preload_app 在 puma fork 后重新连接 Neo4jrb 连接?

Reconnect Neo4jrb connections after puma fork with preload_app?

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

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

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

但是:

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

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

我也很想知道是否:

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

我不认为性能是一个问题,但我想确保我知道当我需要什么时。谢谢。

其他配置:

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

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

它是 Heroku 上的 运行ning 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

我不得不说,在昨天阅读连接池之前,我对连接池知之甚少。我想我现在对这个概念有了更好的理解,我一直在考虑如何将它们应用于 gem.

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

  def current
    @@current_session
  end

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

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

  • 只是 运行 一个 Ruby 脚本,它会有很多线程,但不希望每个线程都有一个会话
  • 要有很多网络工作线程,因为它们有那么多负载并且不希望每个线程都有一个会话

我认为我的思考是正确的,但如果不正确请务必告诉我。我意识到这很重要 "answer",但作为维护者之一,我正在回答你关于项目当前状态的问题 ;)

如果您想了解更多,请加入我们on Gitter