Я упрощаю свою проблему по следующему сценарию: 3 друга делят карту лояльности. Карта имеет два ограничения:
- может использоваться максимум 10 раз (не имеет значения, какая карта используется, т.е. friend_a может использовать ее 10 раз.
- максимальное количество денег на карте составляет200. Таким образом, при 1 «событии» со значением = 200 карта «завершена».
Я использую производителя kafka, который отправляет события в кластере kafka следующим образом:
{"name": "friend_1", "value": 10}
{"name": "friend_3", "value": 20}
событияопубликовано в теме, связанной с потоком кафки, который группируется по ключу и выполняет агрегацию для суммирования потраченных денег. Кажется, это работает, однако я сталкиваюсь с «проблемой параллелизма»
Давайте представим, что карта используется9 раз, так что остается использовать только 1 раз, а общее количество потраченных денег составляет 190, что означает, что осталось потратить 10 единиц.
Итак, friend_2 хочет купить что-то, что стоит 11 единиц (что не должно бытьразрешено) и friend_3 хочет купить что-то, что стоит 9 единиц, которые должны бытьllowed. Friend_3 изменит состояние, используя карту в 10-й раз. Все другие будущие попытки не должны что-либо изменять.
Поэтому пользователю карты разумно знать, изменило ли отправленное им событие максимальное использованное число и общее количество. Как я могу сделать это в Кафке? Используя агрегацию потоков, я всегда могу увеличить значения, но как мне узнать, изменило ли мое действие «изменение состояния» карты?
ОБНОВЛЕНИЕ: пользователь карты должен немедленно получить отрицательный отзыв, если транзакция подтверждаетсяправило.