#searchkick
#searchkick
Вопрос:
При запуске мое приложение устанавливает мой (? глобальный?) Клиент searchkick так, чтобы он указывал на мой кластер elasticsearch по умолчанию.
Searchkick.client = Elasticsearch::Client.new(
hosts: default_cluster, # this is the list of hosts in my default cluster
retry_on_failure: true,
)
Тем не менее, я обновляю свой кластер (снова), и хотя я хотел бы, чтобы мое приложение могло читать / искать из этого кластера по умолчанию,
/search?q="some term"
# =>
Model.search("some term")
продолжайте работать с default_cluster
Где это начинает становиться немного сложнее, так это:
- Я бы также хотел (через какие-то конкретные фоновые задания sidekiq?) чтобы заполнить индекс альтернативного (альтернативного) кластера, что-то вроде:
Model.connect_to(alternate_cluster) {|client|
Searchkick.client = client
Model.reindex
}
Не заставляя все другие фоновые задания взаимодействовать с альтернативным кластером.
И, конечно:
- Я хотел бы каким-то образом проверить, что alternate_cluster работает хорошо (т. Е. Для поиска), прежде чем сделать его моим default_cluster . И, предположительно, через какой-либо маршрут администратора:
/admin/search?q="some search term"amp;cluster=alternate
# =>
Model.connect_to(alternate_cluster) {|client|
Searchkick.client = client
Model.search("some term")
}
И, наконец,:
- Я бы хотел избежать необходимости повторного подключения перед каждым действием поиска / переиндексации, т. Е. Я бы предпочел не иметь накладных расходов на изменение (также потому, что это, вероятно, подразумевает, что длительные задачи, которые продолжают повторно подключаться к searchkick, будут переключаться с одного кластера на другой):
Model.search("some term")
# =>
Model.connect_to(alternate_cluster) {|client|
Searchkick.client = client
Model.search("some term")
}
^ Я этого не хочу
FWIW, лучшее, что я смог придумать до сих пор, это что-то вроде:
def self.connect_to(current_cluster, amp;block)
previous_es_client = Searchkick.client
current_es_client = Elasticsearch::Client.new(
hosts: current_cluster,
retry_on_failure: true,
)
block.call(current_es_client)
rescue Exception => e
logger.warn(e)
ensure
Searchkick.client = previous_es_client
end
Но я подозреваю, что это приведет к тому, что любое другое взаимодействие в моей системе (через тот же веб-рабочий или другие фоновые задания, выполняемые в том же экземпляре background-worker) (временно) укажет на альтернативный кластер.
Заранее спасибо за вашу помощь…