#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 ) назначает метку времени на стороне клиента, которая будет временем записи для запроса.
При чтении данных возвращается только последняя версия на основе метки времени, поэтому дублирования нет. Ваше здоровье!