транзакций)
                  
                  
                  
                  
                  
                  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 раз), но хотелось бы избежать этого
не очень понятно тогда в чём основная проблема
Обсуждают сегодня