Ich betreibe eine Gutscheinseite mit 50-70 Anfragen pro Sekunde, wenn wir unsere Angebote starten (wir starten mehr als 20 Angebote gleichzeitig mehrmals am Tag). Wenn die Deals live gehen, drücken unsere Nutzer einen Button, um einen Coupon für ein bestimmtes Produkt zu erhalten, der über eine Ajax-https-Anfrage einen einzigartigen Couponcode anbietet. Jeder Gutschein kann nur einmal eingelöst werden.So verteilen Sie einzigartige Gutscheincodes mit 70 Anfragen/Sek. Mit Node.js
Mein Problem ist, dass mit so hohen Verkehrsaufkommen zu diesen Zeiten der gleiche Gutschein an mehrere Benutzer verteilt werden kann. Dies ist schlecht, da nur einer von ihnen in der Lage sein wird, den Coupon tatsächlich einzulösen, was zu einer schlechten Benutzererfahrung für den anderen führt.
Ich speichere alle Couponinformationen in Objekten im Speicher auf einem node.js-Server, der von IBM Bluemix gehostet wird. Ich dachte, dies würde mir erlauben, die Anfragen schnell zu bearbeiten.
Wie ich den Gutschein Informationen speichern:
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;
}
Griff Coupon anfordern:
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;
}
Ich habe nicht eine Tonne Verständnis von node.js Server und wie sie funktionieren.
Wie immer, danke für die Hilfe!
Node.js ist nur single-threaded, daher sollte es kein Problem sein, eindeutige Coupons zu generieren, um sicherzustellen, dass sie sich von den bisherigen Werten unterscheiden. Das Problem wäre, diesen Vergleich schnell zu machen, da die angesammelten vergangenen Coupons nur mit der Zeit wachsen würden. Ich spucke nur hier, aber ich denke, dass das Aktualisieren eines Hash mit dem neuen Wert jedes Mal die Einzigartigkeit des neueren Hashes garantieren sollte? – laggingreflex
@laggingreflex Die Coupons werden nicht auf dem Server generiert. Die Gutscheine werden von Amazon generiert und dann in einem Array in meiner Datenbank gespeichert. Das Problem besteht einfach darin, sicherzustellen, dass ich einen Coupon nur einmal aus dem global.coupons-Objekt ergreife. Der Grund warum ich anfing Node.js zu benutzen war, weil es single threaded ist, also dachte ich, dass ich nicht auf dieses Problem stoßen würde, aber ich habe mich als falsch erwiesen. – cgauss