Heroku建议使用它,但我在本地开发环境中看到了这些问题
- 我使用的是带有HTTP适配器的MRI 2.2.3和neo4j.rb 6.0.0(ActiveNode型号)
- 我也在OSX 10.11.2上使用Neo4j 2.2.5和jdk1.7.0_51-b53
我尝试了很多方法来在分叉后重新打开连接,这是我能想到的最接近的:
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时,数据URL就会爆炸
- 当我不重新打开连接时,尽管我还没有模拟足够的负载来确定,但一切似乎都能正常工作
我怀疑neo4j核心会话是极限:github上的neo4j核心,我应该忘记在fork之后重新打开会话,因为gem只有一个共享会话。
但我对此并不是100%有信心,大量的谷歌搜索也没有给我任何帮助。有人能确认分叉后基本上没有必要重新打开连接吗?
我也想知道是否:
- 在其他地方发生了某种连接池
- 我需要以某种方式配置它
- gem本身需要将池化作为一个特性/拉取请求
- 如果性能有问题,我应该只使用嵌入式模式
我还没有达到性能是个问题的程度,但我想确保我知道我需要什么。谢谢。
其他配置:
- 这是在MacBook pro 4核i7=8处理器上
- 我正在使用foreman启动2台puma服务器,一台到80端口,一台在443端口
- 是的,我知道我应该通过nginx代理:-)这只是本地开发的一个快速设置
- 每个服务器有2个工作线程和5个线程=10个线程(即线程>#处理器)
我必须管理我对连接池了解不多,直到昨天读到它们。我想我现在对这个概念有了更好的理解,我一直在思考它们如何应用于宝石。
当前您通过Neo4j::Session.current
获取会话。该方法的代码如下:
def current
@@current_session
end
所以基本上它使用了一个类变量。我确信这不是线程安全的;)我认为我们应该做一些类似Thread.current[:neo4j_curr_session]
的事情,这样每个线程都有一个会话。到目前为止,类变量还没有引起任何问题,但可能是它引起了问题,我还没有认识到它们。
关于连接池:我认为,典型的用例类似于puma,每个web服务器工作人员都有一个线程。如果每一个都有一个会话,那么你可能通常不会有很多会话打开。也就是说,我可以理解有人可能想要什么:
- 只运行一个Ruby脚本,它会有很多线程,但不希望每个线程都有一个会话
- 有很多web工作线程,因为它们有那么多负载,并且不希望每个线程都有一个会话
我认为我想得很对,但如果不是,一定要告诉我。我意识到这是一个"答案",但作为维护人员之一,我正在回答您关于项目当前状态的问题;)
如果您想了解更多信息,请在Gitter 上加入我们
我怀疑你会在谷歌上找到很多(正如你已经发现的)。事实上,我最近在Heroku部署Neo4j.rb应用程序时就开始考虑这个问题。这是应用程序:
https://github.com/neo4j-examples/graphgist_portal
它在赫罗库上奔跑。我决定暂时不担心重新连接,因为我可能很快就会遇到问题(到目前为止我还没有)。
至于neo4j-core
,用于管理会话的旧代码有点麻烦。我一直致力于为Cypher会话构建一个新的API。这在一定程度上是为了拥有更干净的代码库,但也为了支持适配器样式的模式,以支持Neo4j 3.0的新Bolt二进制套接字协议。希望这个新的API将使创建线程安全的应用程序变得更简单、更容易。
如果你对新的API很好奇,它实际上是在6.0中发布的,只是还没有推出,因为它还没有完全完成。它主要在这个目录下:
https://github.com/neo4jrb/neo4j-core/tree/master/lib/neo4j/core
我还在这里为它整理了一张图表:
https://i.stack.imgur.com/oZz95.png