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

时间:2015-12-11 22:09:29

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

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

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

我在fork之后尝试了很多东西来重新打开连接,这是我能想到的最接近的:

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

BUT:

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

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

但我对这并不是百分之百的信心,大规模的谷歌搜索没有给我什么。任何人都可以确认基本上没有必要在分叉后重新打开连接吗?

我也很想知道:

  1. 在其他地方发生了某种连接池
  2. 我需要以某种方式配置它
  3. gem本身需要将池作为功能/拉取请求
  4. 如果性能问题,我应该使用嵌入式模式
  5. 我的表现并不是表现问题,但我想确保自己知道自己需要什么。感谢。

    其他配置:

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

2 个答案:

答案 0 :(得分:2)

我必须管理员我对连接池知之甚少,直到我昨天读完它们。我想我现在对这个概念有了更好的处理,我一直在考虑如何应用这个概念。

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

  def current
    @@current_session
  end

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

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

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

我认为我正确地想到了这一点,但如果没有,我肯定会告诉我。我意识到这是一个非常“回答”,但作为维护者之一,我正在回答你关于项目目前状态的问题;)

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

答案 1 :(得分:0)

我怀疑你会发现谷歌(正如你已经发现的那样)。最近,当我去Heroku部署一个Neo4j.rb应用程序时,我开始考虑这个问题。这是应用程序:

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

它正在Heroku上运行美洲狮。我决定不关心重新连接的那一刻,因为我很快就会遇到一个问题(我还没有到目前为止)。

至于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