Как ConcurrentUpdateSorrClient обрабатывает запрос на обновление?

Мое приложение намерено регулярно вставлять документы в Solr. Есть два соображения:

  1. Отправка запроса на обновление в Solr является ключевым фактором, влияющим на производительность.
  2. Потокобезопасная транзакция. Коммит SolrClient не является потокобезопасным (укажите это, если я ошибаюсь), это может вызвать серьезную проблему, когда несколько пользователей вводят документ в Solr.

Я обнаружил, что ConcurrentUpdateSolrClient является решением-кандидатом, поскольку оно является потокобезопасным и имеет очередь для буферизации и сброса множества документов за одно соединение. Но я смущен, когда я проверяю это. Мой вопрос,

  1. Если я установлю размер очереди, нужно ли мне еще делать коммит?
  2. Если я фиксирую, даже если в очереди есть только один документ, он все равно отправляет HTTP-запрос в Solr. Могу ли я заставить его работать как очередь сообщений?

person BurnetZhong    schedule 25.04.2017    source источник


Ответы (1)


SolrClient является потокобезопасным, и вы можете совместно использовать экземпляр SolrClient в нескольких потоках, если ваша вставка/обновление/удаление привязаны к одной коллекции или ядру в экземпляре Solr.

Но у Solr нет транзакций, которые вы могли бы себе представить в классической СУБД.

Вы должны знать, что если у вас есть более SolrClient экземпляров (в одном приложении или в разных приложениях и серверах), которые одновременно обновляют коллекцию/ядро, первый клиент, который отправляет фиксацию в эту коллекцию/ядро, фиксирует все обновления, сделанные до этот момент каждым клиентом.

С другой стороны, если экземпляр SolrClient отправляет откат, он откатывает все обновления, выполненные (даже другими клиентами SolrClient).

Существует множество стратегий для одновременного обновления документов в Solr, и чтобы понять, как работает фиксация в Solr, я настоятельно рекомендую прочитать

И если вы пишете свое собственное многопоточное приложение, я просто рекомендую централизовать коммиты и откаты в одной точке.

ConcurrentUpdateSolrClient буферизует все добавленные документы и записывает их в открытые HTTP-соединения. Этот класс является потокобезопасным.

Хотя с этой реализацией можно выполнить любой запрос SolrClient, рекомендуется использовать ConcurrentUpdateSolrClient только с запросами /update. Класс HttpSolrClient лучше подходит для интерфейса запросов.

person freedev    schedule 26.04.2017
comment
Большое спасибо за хорошую ссылку. Я понимаю, что такое softcommit и hardcommit. Самая важная идея — не делать никаких коммитов от клиента — Эрика Эриксона. - person BurnetZhong; 27.04.2017
comment
Я рад, что мой ответ полезен :) - person freedev; 27.04.2017