Ƙimar Ƙayyadaddun API a Node: Abin da Ya Fashe Lokacin da Haƙiƙan Ciniki ya Karu
API ɗin mu na jama’a ba shi da iyakancewa kwata-kwata na shekara ta farko, kuma ya ɗauki haɗin kai mara kyau guda ɗaya daga wani kamfani na abokin tarayya, yana sake gwada kiran gidan yanar gizon da ya gaza a kowane miliyon 100 maimakon daƙiƙa goma da aka yi niyya, don buga uwar garken API ɗin gaba ɗaya, kafin kowa ya kula da ƙimar iyakance kamar fiye da aikin wata rana akan bayanan baya.
Sigar ƙwaƙwalwar ajiyar cikin butulci na fara jigilar kaya, kuma me yasa ba daidai ba a cikin kwana ɗaya
Aiwatar da na farko ta yi amfani da maɓallin ƙwaƙwalwar ajiya mai sauƙi a kowane maɓallin API, sake saita kowane minti, wanda yayi aiki daidai a cikin gwajin gida kuma gaba ɗaya ya faɗi sau ɗaya an tura shi, saboda muna gudanar da lokuta da yawa a bayan ma’aunin nauyi, kuma kowane misali yana riƙe nasa mai zaman kansa, ma’ana abokin ciniki zai iya samun ingantaccen iyakar ninki uku da aka yi niyya kawai ta hanyar samun buƙatun rarraba a cikin kwafin mu uku.
// broken: works per-instance, not globally
const counts = new Map();
function rateLimited(apiKey) {
const count = counts.get(apiKey) || 0;
if (count >= 100) return true;
counts.set(apiKey, count + 1);
return false;
}
Matsar da ma’auni zuwa Redis ya gyara matsalar misali da yawa
Redis, wanda aka raba a kowane yanayi, ya ba mu tushen gaskiya guda ɗaya don ƙidayar ƙidayar ƙima ba tare da la’akari da abin da aka yi amfani da buƙatun da aka bayar ba, ta amfani daINCRtare da maɓalli mai ƙarewa azaman aikin atomatik wanda ya guje wa tseren karanta-sannan-rubutu da tuni an ƙone ni a cikin sabis na daban.
async function rateLimited(apiKey) {
const key = `ratelimit:${apiKey}`;
const count = await redis.incr(key);
if (count === 1) await redis.expire(key, 60);
return count > 100;
}
Kafaffen tagogi sun ƙirƙiri akwati na gefen su wanda ainihin abokin ciniki ya buge
Madaidaicin taga na minti ɗaya yana nufin abokin ciniki zai iya aika buƙatun 100 a cikin na biyu na ƙarshe na taga ɗaya da kuma wani 100 a cikin farkon daƙiƙa na gaba na gaba, buƙatun 200 daidai a cikin kusan daƙiƙa biyu yayin da suke kasancewa a zahiri a ƙarƙashin iyakar tagar ɗaya, fashe tsarin da abokin haɗin gwiwa na gaske ya samo kuma ya yi amfani da shi a cikin makonnin da muka tura sigar tagar.
Canjawa zuwa madaidaicin rajistan taga mai zamewa don ingantaccen saƙon ƙimar
Na matsa zuwa hanyar taga mai zamewa ta amfani da saitin Redis da aka jera, tana adana tambarin lokaci akan buƙatu da ƙirga abubuwan shigarwa kawai a cikin daƙiƙa sittin, wanda daidai ya hana fashe iyaka da ƙayyadaddun taga ya bari.
async function rateLimited(apiKey) {
const key = `ratelimit:${apiKey}`;
const now = Date.now();
const windowStart = now - 60000;
await redis.zremrangebyscore(key, 0, windowStart);
const count = await redis.zcard(key);
if (count >= 100) return true;
await redis.zadd(key, now, `${now}-${Math.random()}`);
await redis.expire(key, 60);
return false;
}
Mayar da kanun labarai da suka dace ya fi mahimmanci fiye da tunanin farko
Siffar mu ta farko ta dawo da matsayin 429 mara kyau ba tare da ƙarin bayani ba, wanda ke nufin masu amfani da API masu kyau ba su da wata hanyar sanin tsawon lokacin da za su jira kafin sake gwadawa, kuma haɗin gwiwar abokan hulɗa da yawa suna sake gwadawa nan da nan a cikin madaidaicin madauki, yana sanya ƙimar iyakance matsalar mafi muni maimakon mafi kyau. Ƙara misaliRetry-Afterda sauran masu rubutun ra’ayin mazan jiya sun kwantar da hankalin sake gwada halayen abokan hulɗa waɗanda a zahiri suna mutunta su.
res.set({
'X-RateLimit-Limit': 100,
'X-RateLimit-Remaining': Math.max(0, 100 - count),
'Retry-After': 60
});
Iyakoki daban-daban don wuraren ƙarewa daban-daban, waɗanda ba mu shirya ba tun farko
Ƙididdiga mai ƙayyadadden ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun ƙayyadaddun amfani na ƙarshen karantawa mai arha a matsayin aiki mai tsada kamar yadda ake yin rubutu mai tsada, kuma a ƙarshe muna raba iyaka ta hanyar ƙimar ƙarshen ƙarshen, matsayi mai nauyi-duba ƙarshen samun izni mafi girma fiye da ƙarshen ƙarshen rahoton-ƙarni wanda ya yi aikin tattara bayanai na gaske.
Abin da ƙetare na asali ya koya mana
Ƙayyadaddun ƙima ba kyakkyawan yanayin tsaro ba ne da za ku ƙara da zarar kun isa buƙatunsa, kariya ce daga al’ada, gaskiya mara kyau cewa duk wani kwaro na sake gwadawa na abokin haɗin gwiwa ya zama lokacin da ba a taɓa tsayawa tsakanin abokin cinikin su da ba daidai ba da ainihin ƙarfin sabar ku. Kamata ya yi mu aika da ƙayyadaddun ƙimar asali a cikin mako ɗaya, ba bayan madauki na sake gwadawa abokin tarayya ya riga ya ɗauke mu ba.











