Elasticsearch оптимистическая блокировка - PullRequest
2 голосов
/ 23 июня 2019

У меня есть приложение, которое получает события в разных потоках, каждое событие обрабатывается, форматируется в разные атрибуты и сохраняется в ElasticSearch. Я хотел бы добавить новую запись в мою БД, когда определенное значение атрибута впервые появляется в любом событии (каждое событие читает все предыдущие события и проверяет, что значение еще не появилось). Из-за многопоточной природы приложения мне нужен какой-то способ проверки того, что я добавляю запись, когда впервые сталкиваюсь с атрибутом, и только один раз. Лучшее решение, которое приходит мне в голову, - это какая-то оптимистическая блокировка (убедитесь, что ни один другой поток не добавил запись для этого атрибута, прежде чем я его зафиксирую). Есть ли какая-либо поддержка ElasticSearch для этого?

1 Ответ

1 голос
/ 24 июня 2019

Да, Elasticsearch предоставляет поддержку для разрешения конфликтов, и вы можете прочитать официальные документы Elasticsearch https://www.elastic.co/guide/en/elasticsearch/guide/master/version-control.html, в которых это подробно объясняется.

Если мы должным образом не справимся с конфликтами, это может привести к проблеме потерянного обновления и способам их устранения, объясненным ниже

В мире баз данных обычно используются два подхода, чтобы гарантировать, что изменения не будут потеряны при одновременном обновлении:

Пессимистический контроль параллелизма : Широко используемый реляционными базами данных, этот подход предполагает, что вероятны конфликтующие изменения, и поэтому блокирует доступ к ресурсу для предотвращения конфликтов. Типичный пример - блокировка строки перед чтением ее данных, гарантирующая, что только поток, который установил блокировку, может вносить изменения в данные в этой строке.

Оптимистический контроль параллелизма Используемый Elasticsearch, этот подход предполагает, что конфликты маловероятны, и не блокирует попытки выполнения операций. Однако, если базовые данные были изменены между чтением и записью, обновление завершится неудачно. Затем приложение должно решить, как оно должно разрешить конфликт. Например, он может повторить попытку обновления, используя свежие данные, или он может сообщить о ситуации пользователю.

Хорошей новостью для вас является то, что Elasticsearch поддерживает оптимистическую блокировку, следовательно, не блокирует все документы и обеспечивает лучшую производительность. Вы можете прочитать их официальный документ https://www.elastic.co/guide/en/elasticsearch/guide/master/optimistic-concurrency-control.html о том, как этого добиться.

Дайте мне знать, если вам ясно и у вас есть какие-либо сомнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...