Как обеспечить консистентность данных между БД и поисковым движком?
Мне нужно индексировать данные в реальном времени, т.е. одновременно внести изменения и в базу данных (например, PostgreSQL) и в поисковый движок (например, ElasticSearch). Но если во время выполнения скрипта что-то случится (например, отключение электричества), то в каком то из узлов данных будет не хватать (в зависимости от того куда первее запишем данные). Как этого можно избежать?
В любой информационной системе я-бы выделял single-source-of-truth (типа главный источник правды) и этот главный источник должен быть согласован сам с собой всегда. Будет ли это дисковый файл. Kafka, или база PG - неважно. Важно что он будет арбитром в спорных ситуациях.
В ситуации с потерей электричества что вы описали - совершенно невозможно правильно восстановить обе системы. Одна из ник полюбому будет опережать другую. В high-load системах она будет опережать не на 1 на на сотню транзакций например. Честно я даже не могу придумать алгоритм восстановления. Особенно если часы где-то разошлись на милисекунду и одна из систем сделала update на уже вставленные данные.
Мне нравится вариант когда мы сразу пишем информацию в Postgres и делаем commit (по правилам которые нужны бизнесу) и дальше уже индексируем содержимое базы эластиком. После аварийного ребута я будут знать что PG содержит именно то что было закоммичено. То что нужно тоесть. Эластик будет просто догонять.