CQRS с cockroachdb в настройке полиглота

Я рассматривал возможность использования cockroachdb для записи данных в 3-й нормальной форме с гарантиями ACID. Таким образом, все записи будут перенаправлены на cockroachdb.

Все чтения могут быть точечным поиском на основе ключа строки для Кассандры. Я считаю, что такая настройка чтения устранит необходимость в повторном кэшировании, поскольку Cassandra сама по себе выполняет быстрое чтение. Таким образом, таблицы Cassandra будут денормализованы на основе путей доступа.

Может быть синхронизация на основе событий от вставки / обновления / удаления внутри нормализованной схемы cockroachdb для вставки / обновления / удаления в денормализованную схему cassandra.

Вопрос 1:

Подходит ли такое разделение чтения и записи допустимому сценарию использования cockroachdb? Намерение состоит в том, чтобы уменьшить количество соединений и иметь быстрое чтение, а также запись. Cockroachdb становится единственным источником правды, получая также данные о происхождении событий. А другие базы данных, такие как cassandra и elasticsearch, становятся проекциями запросов, которые в конечном итоге синхронизируются.

Вопрос 2:

Подходит ли эта установка для финансовых транзакций, где N отчетов должны выполняться атомарно? Насколько я понимаю, предположим, что существует N операторов SQL, которые выполняются транзакционно внутри схемы 3NF cockroachdb. После этого чтения происходят из Cassandra / ElasticSearch, которые еще не будут синхронизированы из-за задержки синхронизации. В этом сценарии возможной согласованности, если пользователь отправляет другую команду для достижения такого же результата с другой машины параллельно, это перейдет к обработчику команд, который будет искать в cockroachdb. Я думаю, поскольку CockroachDb совместим с ACID, мы гарантированно аннулируем команду на этапе проверки команды после поиска в cockroachdb. Я верю, что этот таракан будет генерировать исключение оптимистичной блокировки, поскольку одна транзакция, записывающая в ту же таблицу, уже выполняется. Итак, вопрос в том, должны ли мы в таких сценариях также читать из CockroachDB вместо Cassandra / ElasticSearch?

Вопрос 3

Последний вариант использования, который я имел в виду, заключался в том, чтобы cockroachdb выполнял роль, которую искровый кластер будет делать с кассандрой в отношении агрегаций. Мы можем выполнять агрегацию внутри cockroachdb, в котором есть все данные, и хранить их в предварительно агрегированных таблицах в cassandra. Хотя ElasticSearch также может выполнять агрегацию, возникает вопрос - правильно ли этот вариант использования звучит при использовании для агрегации cockroachdb вместо elasticsearch?


person fortm    schedule 27.08.2017    source источник


Ответы (1)


В качестве общего правила я бы рекомендовал разрабатывать систему с нуля вместо того, чтобы начинать с такой сложной архитектуры. Если вы начнете с CockroachDB в качестве «единственного источника истины», как далеко вы сможете зайти только с CockroachDB? У вас есть требования к производительности, которые можно удовлетворить только с помощью уровня кэширования? Вам нужна отдельная система для агрегирования / отчетности? Если ответ «да», тогда вы можете начать думать о том, какую форму должны принять эти компоненты.

Может быть синхронизация на основе событий от вставки / обновления / удаления внутри нормализованной схемы cockroachdb для вставки / обновления / удаления в денормализованную схему cassandra.

Обратите внимание, что у CockroachDB пока нет хорошего способа потоковой передачи обновлений во внешнюю систему, поэтому сделать это будет непросто.

По вашим конкретным вопросам:

  1. Кэш чтения может быть ценным дополнением к системе, но он также значительно усложняет работу, поэтому не вводите его, пока не узнаете, что он вам нужен. Вы также можете денормализовать данные в базе данных SQL и такие функции, как чередующиеся таблицы CockroachDB. может уменьшить потребность в денормализации.

  2. У вас есть транзакционные гарантии только для операций чтения, которые поступают в CockroachDB в транзакции. Точное поведение здесь будет зависеть от того, как написана ваша транзакция. Например, две транзакции «добавить комментарий» могут применяться без конфликта друг с другом, в зависимости от вашей схемы. Возможно, вам придется защититься от этого, задав соответствующие уникальные идентификаторы или выполнив SELECT в начале транзакции, чтобы убедиться, что состояние базы данных такое, как вы ожидаете. (Кроме того, не делайте слишком много предположений об «оптимистичных исключениях блокировки». Параллелизм в CockroachDB представляет собой смесь оптимистичных и пессимистических моделей)

  3. Опять же, это зависит от обстоятельств. ElasticSearch может делать многое, чего не может CockroachDB, а CockroachDB (пока) не выполняет большую предварительную агрегацию. Но SQL - очень гибкий язык для агрегирования и отчетности, поэтому вы можете делать то, что вам нужно, в CockroachDB.

person Ben Darnell    schedule 27.08.2017
comment
Спасибо за подробный ответ. У меня все еще есть вопрос о полнотекстовом поиске, какие есть текущие параметры в cockroachdb для этого? - person fortm; 16.09.2017
comment
В настоящее время в CockroachDB нет полнотекстовой индексации. Это отслеживается в этой проблеме. Мы хотели бы сделать это когда-нибудь, но это еще не запланировано. - person Ben Darnell; 16.09.2017