Я использую Elasticsearch — Bonsai в одном из моих проектов Ruby on Rails. Итак, пока все шло очень гладко. Но в тот момент, когда мы запустили это приложение для конечных пользователей, и люди начали приходить, мы заметили, что ответ на один запрос elasticsearch занимает 5-7 секунд (действительно плохой опыт для нас). Тем не менее, у нас 8 -2x Web Dynos на месте.
Итак, мы решили обновить надстройку Bonsai до Bonsai 10, а также добавили надстройку NewRelic (чтобы следить за тем, сколько время, необходимое для ответа на один запрос)
Ниже приведены настройки нашей среды:
Ruby: 2.2.4
Rails: 4.2.0
elasticsearch: 1.0.15
elasticsearch-model: 0.1.8
Итак, мы снова импортировали данные в Elasticsearch, и вот состояние нашего кластера ElasticSearch:
pry(main)> Article.__elasticsearch__.client.cluster.health
=> {"cluster_name"=>"elasticsearch",
"status"=>"green",
"timed_out"=>false,
"number_of_nodes"=>3,
"number_of_data_nodes"=>3,
"active_primary_shards"=>1,
"active_shards"=>2,
"relocating_shards"=>0,
"initializing_shards"=>0,
"unassigned_shards"=>0,
"delayed_unassigned_shards"=>0,
"number_of_pending_tasks"=>0,
"number_of_in_flight_fetch"=>0}
а ниже данные NewRelic о вызовах ES
Что указывает на большую причину для беспокойства.
Моя модель article.rb ниже:
class Article < ActiveRecord::Base
include Elasticsearch::Model
after_commit on: [:create] do
begin
__elasticsearch__.index_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on create: #{ex.message}"
end
end
after_commit on: [:update] do
begin
Elasticsearch::Model.client.exists?(index: 'articles', type: 'article', id: self.id) ? __elasticsearch__.update_document : __elasticsearch__.index_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on update: #{ex.message}"
end
end
after_commit on: [:destroy] do
begin
__elasticsearch__.delete_document
rescue Exception => ex
logger.error "ElasticSearch after_commit error on delete: #{ex.message}"
end
end
def as_indexed_json(options={})
as_json({
only: [ :id, :article_number, :user_id, :article_type, :comments, :posts, :replies, :status, :fb_share, :google_share, :author, :contributor_id, :created_at, :updated_at ],
include: {
posts: { only: [ :id, :article_id, :post ] },
}
})
end
end
Теперь, если я смотрю на план BONSAI 10 Heroku, он дает мне 20 осколков, но с текущим состоянием кластера он использует только 1 активный основной осколок и 2 активных осколки. Внезапно у меня возникло несколько вопросов:
- Поможет ли здесь увеличение количества осколков до 20?
- Можно кэшировать запросы ES. Вы также предлагаете то же самое? -- Есть ли у него плюсы и минусы?
Пожалуйста, помогите мне найти способы, с помощью которых я могу сократить время и сделать работу ES более эффективной.
ОБНОВЛЕНИЕ
Вот небольшой фрагмент кода https://jsfiddle.net/puneetpandey/wpbohqrh/2/. , я создал (для справки), чтобы точно показать, почему мне нужно так много вызовов ElasticSearch
В приведенном выше примере я показываю несколько счетчиков (перед каждым элементом флажка). Чтобы показать эти подсчеты, мне нужно получить числа, которые я получаю, нажимая ES.
Итак, прочитав комментарии, я нашел здесь хорошую статью: Как настроить кластер elasticsearch на одном сервере, чтобы получить максимальную производительность при поиске Думаю, у меня достаточно информации для реструктуризации
Лучший,
Пунит