Prowadzę stronę z kuponami, która widzi 50-70 żądań/sekundę, gdy uruchamiamy nasze oferty (uruchamiamy ponad 20 transakcji jednocześnie kilka razy dziennie). Gdy transakcje zostaną opublikowane, nasi użytkownicy naciskają przycisk, aby odebrać kupon na konkretny produkt, który wyświetla unikalny kod kuponu za pomocą żądania ajax https. Każdy kupon można wykorzystać tylko raz.Jak rozpowszechniać unikalne kody kuponów z 70 żądaniami na sekundę przy użyciu Node.js
Mój problem polega na tym, że przy tak dużym natężeniu ruchu w tym czasie ten sam kupon może być dystrybuowany do wielu użytkowników. Jest to złe, ponieważ tylko jeden z nich będzie w stanie zrealizować kupon pozostawiając słabe wrażenia użytkownika dla drugiego.
Przechowuję wszystkie informacje o kuponach w obiektach w pamięci na serwerze node.js obsługiwanym przez IBM Bluemix. Pomyślałem, że to pozwoli mi szybko obsłużyć wnioski.
Jak przechowywać informacje Kupon:
global.coupons = {};
//the number of coupons given for each product
global.given = {};
/* Setting the coupon information */
//....I query my database for the products to be given today
for(var i = 0; i < results.length; i++){
var product = results[i];
//add only the coupons to give today to the array
var originalCoups = product.get('coupons');
var numToTake = product.get('toGivePerDay');
if(product.get('givenToday') > 0){
numToTake = numToTake - product.get('givenToday');
}
// Example coupon array [["VVXM-Q577J2-XRGHCC","VVLE-JJR364-5G5Q6B"]]
var couponArray = originalCoups[0].splice(product.get('given'), numToTake);
//set promo info
global.coupons[product.id] = couponArray;
global.given[product.id] = 0;
}
Uchwyt kupon żądanie:
app.post('/getCoupon', urlencodedParser, function(req, res){
if (!req.body) return res.status(400).send("Bad Request");
if (!req.body.category) return res.status(200).send("Please Refresh the Page.");
//Go grab a coupon
var coupon = getUserACoupon(req.body.objectId);
res.type('text/plain');
res.status(200).send(coupon);
if(coupon != "Sold Out!" && coupon != "Bad Request: Object does not exist."){
//Update user & product analytics
setStatsAfterCouponsSent(req.body.objectId, req.body.sellerProduct, req.body.userEmail, req.body.purchaseProfileId, coupon, req.body.category);
}
});
//getCoupon logic
function getUserACoupon(objectId){
var coupToReturn;
// coupon array for the requseted product
var coupsArray = global.coupons[objectId];
if(typeof coupsArray != 'undefined'){
// grab the number of coupons already given for this product and increase by one
var num = global.given[objectId];
global.given[objectId] = num+1;
if(num < coupsArray.length){
if(coupsArray[num] != '' && typeof coupsArray[num] != 'undefined' && coupsArray[num] != 'undefined'){
coupToReturn = coupsArray[num];
}else{
console.log("Error with the coupon for "+objectId + " the num is " + num);
coupToReturn = "Sold Out!";
wasSoldOut(objectId);
}
}else{
console.log("Sold out "+objectId+" with num " + num);
coupToReturn = "Sold Out!";
wasSoldOut(objectId);
}
}else{
coupToReturn = "Bad Request: Object does not exist.";
wasSoldOut(objectId);
}
return coupToReturn;
}
nie mam mnóstwo zrozumienia serwerów node.js i jak funkcjonują.
Jak zawsze, dziękuję za pomoc!
Node.js ma tylko jeden wątek, więc generowanie niepowtarzalnych kuponów nie powinno stanowić problemu, ponieważ różni się od poprzednich wartości. Problem polegałby na szybkim porównaniu, ponieważ skumulowane przeszłe kupony rosłyby z czasem. Tylko spitballing tutaj, ale myślę, że aktualizowanie Hash z nową wartością za każdym razem powinno zagwarantować wyjątkowość nowszego hasha? – laggingreflex
@laggingreflex Kupony nie są generowane na serwerze. Kupony są generowane przez Amazon, a następnie przechowywane w tablicy w mojej bazie danych. Problem polega tylko na upewnieniu się, że łapię kupon z obiektu global.coupons tylko raz. Powodem, dla którego zacząłem używać Node.js, było to, że jest to pojedynczy wątek, więc pomyślałem, że nie napotkam na ten problem, ale udowodniono mi, że nie. – cgauss