Как справиться с состоянием гонки в Кассандре? - PullRequest
0 голосов
/ 14 января 2019

Я разрабатываю простой микросервис Spring Boot с помощью Cassandra db.

Основная сущность на моем сервере в Subscription классе ниже:

public final class Subscription {

    private String id;

    private String firstUser;

    private String secondUser;

    private String firstUserStatus;

    private String secondUserStatus;

}

Мой репозиторий использует объект подписки и сохраняет его. Но прежде чем продолжать, я должен проверить наличие некоторых ограничений, и главное, что не должно быть другой подписки с такими же firstUser и secondUser. Случай, когда он может потерпеть неудачу, довольно прост:

  1. одна подписка будет сохранена
  2. таблица проверяется на наличие другой подписки с те же пользователи
  3. теперь можно сохранить еще одну подписку с теми же пользователями и сделать предыдущую проверку устаревшей
  4. подписка сохраняется.

Как правильно ее решить?

Стоит упомянуть: порядок пользователей не имеет значения. Если подписка с пользователями «1» и «2» будет сохраняться, никакая другая подписка с пользователями «1» и «2» или «2» и «1» не должна существовать.

UPD: учитывая ответ @bhspencer, я мог бы предложить другой случай (мне также нужно, чтобы статусы были согласованными):

  1. одна подписка будет сохранена с firstUserStatus="ISSUED" и secondUserStatus="WAITING_ACTION"
  2. таблица проверяется на наличие другой подписки с теми же пользователями
  3. другая подписка с тем же идентификатором (пользователи) и firstUserStatus="WAITING_ACTION" и secondUserStatus="ISSUED" может быть сохранена сейчас и сделает предыдущую проверку устаревшей
  4. первоначальная подписка сохраняется и переопределяет уже существующую -> secondUserStatus="ISSUED" потеряна

1 Ответ

0 голосов
/ 14 января 2019

Сделать идентификатор объекта конкатенацией firstUser + secondUser. Сделайте id первичным ключом, который обеспечит уникальность ваших подписок.

Из-за ваших требований к порядку вы должны сначала отсортировать firstUser и secondUser и объединить их в порядке сортировки. Это означает, что generateId ("1", "2") и generateId ("2". "1") будут генерировать один и тот же идентификатор "1-2".

public String generateId(String firstUser, String secondUser) {
  List<String> ids = new ArrayList<>();
  ids.add(firstUser);
  ids.add(secondUser);
  Collections.sort(ids);
  String result = ids.get(0) + "-" + ids.get(1);
  return result;
}
...