транзакций)
const dataProduct = await Product.findOneAndUpdate(
{ _id: productId },
{ $inc: { countActivate: 1 } },
{ session, new: true }
);
if (countActivate >= 5000) {
// пользователь не может купить продукт, т.к. его уже купили 5 тысяч раз
// аборт транзакции и завершении сессии
// говорим пользователю что товар раскупили
}
// Если все в порядке, то пользователь купил продукт
await ProductBuy.create(
[
{
userId,
productId
}
],
{ session }
);
// говорим что пользователь успешно купил товар
товары быстро разбирают, максимально быстро
около 200-300 RPS
пользователи встречают writeConflict (здесь все понятно), можно повторить транзакцию N раз
вопрос
как можно увеличить скорость покупки товара?
может есть иные решения?
сейчас при 200-300 RPS около 10 пользователей купят, остальные получат writeConflict
хотелось бы избежать повтора транзакций и ускорить процесс покупки
я искал разные решения 1. менял местами 1) productBuy 2) и далее инкремент количества товара 2. через каунтинг документов не дает гарантию
есть подозрения, что мне надо будет редис подрубить для каунтинга и проверки 😁
да, делать retry это наиболее корректное решение вашей проблемы при таких условиях
Т.е. нет варианта ускорить мою конструкцию? Есть конечно вариант, использовать редис для инкремента и проверок числа Конечно, понятно, что документ лочится транзакцией и другая транзакция не может ничего сделать и поможет только retry (бесконечный или N раз), но хотелось бы избежать этого
не очень понятно тогда в чём основная проблема
Обсуждают сегодня