Асинхронные вставки в кассандру с сохранением порядка вставок на ключ

#java #asynchronous #cassandra #spring-webflux #spring-data-cassandra

Вопрос:

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

Если я правильно понимаю, то асинхронные вставки не могут гарантировать согласованность данных в этом случае, поскольку асинхронные выполнения подразумевают порядок выполнения асинхронных операций в программе, что не подразумевает гарантии последовательности асинхронных операций, но я не смог реализовать пример в java, где порядок асинхронных вставок не соответствует порядку. И я также не смог найти информацию об этом ни в одной документации, связанной с асинхронными вставками с драйвером Cassandra(datastax-java-драйвер).

Должен ли я позаботиться о дедупликации данных на своей стороне перед асинхронной вставкой, чтобы обеспечить согласованность данных в этом случае?

Если вам нужен пример кода того, что я делаю :

 @Autowired
private ReactiveCassandraRepository repository;

...

Flux.from(eventsList)
.flatMap(value -> repository.save(value))
.subscribe()
 

Комментарии:

1. зачем вам нужен порядок?

2. @AlexOtt мои данные-это изменения состояния сущности(например, пакеты из кафки), и я хочу иметь возможность получить их последнее фактическое состояние по ключу. Но я боюсь нарушения порядка вставки, что в будущем даст мне нерелевантное состояние по ключу. Идея дедупликации : Если я получу две вставки с одним и тем же ключом в пакете, я могу пропустить вставку с меньшим смещением(аналог метки времени события). Но это усложняет разработку решения, а также приводит к временным затратам на дедупликацию данных, поэтому я хочу знать, насколько правильны мои сомнения и нужно ли мне это реализовывать.

3. Можете ли вы иметь метку времени как часть события. Само событие должно иметь временную метку генерации события. Я чувствую, что это облегчает использование.

Ответ №1:

На самом деле это не проблема, и вы определенно можете максимизировать пропускную способность, используя асинхронную запись.

Важно отметить, что «порядок» не определяется тем, когда асинхронный запрос попадает в кластер. По умолчанию драйвер Java (v3.0 ) назначает метку времени на стороне клиента, которая будет временем записи для запроса.

При чтении данных возвращается только последняя версия на основе метки времени, поэтому дублирования нет. Ваше здоровье!