Rails 3 ThinkingSphinx多租户

时间:2014-01-24 21:07:59

标签: ruby-on-rails ruby-on-rails-3 sphinx thinking-sphinx

我们正在进行一次大的升级:

  • Rails 2.3至Rails 3.2
  • ThinkingSphinx 1.4.1至ThinkingSphinx 3.0.6
  • Sphinx 0.9.9至Sphinx 2.0.8

现在我们的ThinkingSphinx配置已损坏。我们有一个多租户设置,所以我们连接的方式有点复杂。每次触发搜索操作时都会调用我们的方法set_sphinx_connection。以下是我们过去的做法:

def set_sphinx_connection
  Thread.current[:thinking_sphinx_environment] = "tenant_#{Tenant::active.id}"
  ThinkingSphinx::Configuration.instance.reset
end

以下是我们现在尝试的方法:

def set_sphinx_connection
  framework = ThinkingSphinx::Frameworks::Plain.new
  framework.environment = "tenant_#{Tenant::active.id}"
  ThinkingSphinx::Configuration.instance.framework = framework
end

每个租户都有自己的sphinx配置文件,每个都在自己的端口上搜索。我们的thinking_sphinx.yml的摘录如下:

tenant_1:
  mysql41: 9312
  enable_star: true
  min_infix_len: 1
tenant_2:
  mysql41: 9313
  enable_star: true
  min_infix_len: 1
tenant_3:
  mysql41: 9314
  enable_star: true
  min_infix_len: 1

如果你只搜索一个租户,它就可以了。但是,当您搜索一个然后另一个时,会发生以下两个错误之一:

  • 第二个租户上陈旧的ID错误
  • 搜索从第一个租户返回到第二个租户

有没有人有办法让这个工作?如果你在外面可以帮忙吗?

更新:我们认为它与Passenger有关。当第一个实例启动时,它一直适用于该租户。但是,从那时起乘客实例无法搜索任何其他租户。

2 个答案:

答案 0 :(得分:1)

我认为这是因为Thinking Sphinx v3在搜索之间持续存在Sphinx连接。这可以被禁用,但该功能出现在TS v3.1.0中,这将意味着一些更多的调整。

# in an initializer:
ThinkingSphinx::Connection.persistent = false

如果您坚持使用Sphinx 2.0.8(而不是2.1.4),请确保您阅读了TS v3.1.0发行说明(无论如何都值得阅读):{{3} }

答案 1 :(得分:0)

将此放在此处,以防其他人遇到同样的问题。这就是最终的工作。

def set_sphinx_connection
  framework = ThinkingSphinx::Frameworks::Plain.new
  framework.environment = "tenant_#{Tenant::active.id}"
  ThinkingSphinx::Configuration.instance.framework = framework
  ThinkingSphinx::Connection.pool.clear
end