Eseguo un sito di coupon che visualizza 50-70 richieste/sec al momento del lancio delle nostre offerte (lanciamo più di 20 offerte contemporaneamente più volte al giorno). Quando gli affari vengono pubblicati, i nostri utenti premono un pulsante per richiedere un coupon per un prodotto specifico, che serve un codice coupon univoco tramite una richiesta https di ajax. Ogni coupon può essere riscattato solo una volta.Come distribuire codici coupon univoci con 70 richieste/sec utilizzando Node.js
Il mio problema è che con un volume di traffico così elevato in questi orari, lo stesso coupon può essere distribuito a più utenti. Questo è un problema dato che solo uno di questi sarà in grado di riscattare il coupon in partenza per una scarsa esperienza utente per l'altro.
Sto memorizzando tutte le informazioni sul coupon in oggetti in memoria su un server node.js ospitato da IBM Bluemix. Ho pensato che questo mi avrebbe permesso di gestire le richieste rapidamente.
Come devo conservare informazioni coupon:
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;
}
Maniglia Coupon Richiesta:
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;
}
non ho una tonnellata di comprensione dei server Node.js e il loro funzionamento.
Come sempre, grazie per l'aiuto!
Node.js è solo a thread singolo, quindi non dovrebbe essere un problema generare coupon univoci assicurandosi che siano diversi da qualsiasi valore passato. Il problema sarebbe quello di rendere il confronto rapido in quanto i cedolini passati accumulati sarebbero cresciuti solo nel tempo. Solo spitballing qui, ma penso che l'aggiornamento di un hash con il nuovo valore ogni volta dovrebbe garantire l'unicità del nuovo hash? – laggingreflex
@laggingreflex I coupon non vengono generati sul server. I coupon sono generati da Amazon e quindi memorizzati in un array nel mio database. Il problema consiste semplicemente nel fare in modo che io stia afferrando un coupon dall'oggetto global.coupons solo una volta. Il motivo per cui ho iniziato a utilizzare Node.js era perché è a thread singolo, quindi ho pensato che non avrei incontrato questo problema, ma mi sono dimostrato sbagliato. – cgauss