Programlama Genel
Bir Sürü Farklı Yerden Tek Apiye İstek Atmak Ve Request Limiti
Bir Sürü Farklı Yerden Tek Apiye İstek Atmak Ve Request Limiti
-
başlık anlaşılmaz oldu da anlatayım:
şimdi aynı anda çalışan 5000 tane cron jobum var. bazıları google sheets apiye istek atıyor. lakin bir sürü istek aynı anda gidince benim hesabın dakika başı request kotası doluyor.
nasıl bir çözüm uygulasam sizce? bunun best practice i nedir?
aklıma bir kaç şey geldi:
1. hata aldığımda random bi süre bekleyip (2-10 sn) tekrar istek atmak. her task random bi sürede tekrar istek atarsa denk gelmez heralde
2. google isteklerini kendi yazdığım bi mikroservis üstünden yapmak, o serviste de gelen istekleri gerekirse bekletip google limitlerini aşmadan google a iletip gelen response u proxy etmek
-
5000 tane cronjobun çalışıyor ve hep statik bir request ile mi post ediyor ?
ne post edeceğini nerden biliyor database'den mi okuyor rabbitmq'dan mı okuyor ?
random süre atmak risk. pratikte yarısından fazlası 4 saniye altı delay verse bile limite takılma ihtimali var.
ben olsam lastrundate gibi bişey tutarım. lastrundate'i 1 dakikadan az olan 300 tane job varsa while'ı 1 saniye bekletirim.
299'a düştüğü anda bir tane daha jobu çalıştırıp 300e tamamlarım.
benzer şeyleri çok yaptım bir sürü yöntemi var. eğer rabbitmq kullanıyorsan bu delayi rabbitmqda da verebiliyordun.
while true çalışan serviste 1 saniye bekleterek son 1 dakika içinde çalışan jobları saymak daha kolay ve zahmetsiz tabi.
-
manglerman bunu yazdı
5000 tane cronjobun çalışıyor ve hep statik bir request ile mi post ediyor ?
ne post edeceğini nerden biliyor database'den mi okuyor rabbitmq'dan mı okuyor ?
random süre atmak risk. pratikte yarısından fazlası 4 saniye altı delay verse bile limite takılma ihtimali var.
ben olsam lastrundate gibi bişey tutarım. lastrundate'i 1 dakikadan az olan 300 tane job varsa while'ı 1 saniye bekletirim.
299'a düştüğü anda bir tane daha jobu çalıştırıp 300e tamamlarım.
benzer şeyleri çok yaptım bir sürü yöntemi var. eğer rabbitmq kullanıyorsan bu delayi rabbitmqda da verebiliyordun.
while true çalışan serviste 1 saniye bekleterek son 1 dakika içinde çalışan jobları saymak daha kolay ve zahmetsiz tabi.
ya joblar bir sürü iş yapıyor bu işlerden biri ya da bir kaçı sheetten veri okumak. farklı sheetler, farklı veriler vs bu yüzden cache edemiyorum.
random süre atınca : "çok istek attın" hatası almayana kadar süreyi arttırıp devam ederim diyodum.
atıyorum 3sn bekledi, hata aldı, 6 sn beklesin, hata alırsa 12sn. bi de hard limit koyarım, 45sn den fazla beklemen gerekirse öl diye atıyorum. o jobu iptal ederim
-
eğer structure hale getiremediğin joblarsa en mantıklısı şu anda senin yaptığın. ben olsam ben de benzer şekilde random süre arttırarak apiden hata alana kadar devam ederdim.
pinterest işi yaparken çok uğraştım cronjoblarla. delay, api,request limit vb :)
özel işlerimde ise lastrundate mekanizması baya işimi görüyor. panelim var hangi jobun ne sıklıkla çalışacağına ordan da karar verebiliyorum. baız jobların öncelikleri var hiç durmadan çalışıyor ama diğer jobların bekleme kabiliyeti var vb.
senin işin biraz dah spesifik tabi.
-
bi tane job gateway gibi bir sey yapsan, tüm joblar ona gitse, o gerekirse cacheler gerekirse sıraya koyar vs
-
coonjoblara delay ekleseen nasıl olur hocam, ilk başta 100 tanesi çalışsın, 10 saniye sonra 100 tane daha çalışsın gibi.
yada delay süresini, random olarak 1 le 50 arası diyeceksin her cronjoub için rastgele. sonra yaradana sığınıp bekleyeceksin;)
-
Laravel de joblara unique id ekleyerek kuyrukta aynı isteğin çift oluşmasını engelleyebiliyoruz. Aynı dosyaya istek atılmasını bu şekilde engelleyerek istek sayısını azaltabiliriz.
Google sheet e istek atacak işlemleri kuyruğa eklerken queue name (onQueue) aynı ekleyerek, bu kuyruktaki her işten sonra sleep koyarak job u uzatabiliriz. 1. iş başladı ve tamamlanınca 4 sn sleep koyduk. sleep sonrası diğer job a geçecek. Her job ortlama 1 sn sürse, 4 sn de sleep olsa dakika da yaklaşık 20 iş yapması beklenir. Böyle birşey geldi aklıma.
-
rakkoc bunu yazdı
bi tane job gateway gibi bir sey yapsan, tüm joblar ona gitse, o gerekirse cacheler gerekirse sıraya koyar vs
bunu düşündüm işte ben de, ama belki başka çözümü vardır diye sorayım dedim
-
manglerman bunu yazdı
eğer structure hale getiremediğin joblarsa en mantıklısı şu anda senin yaptığın. ben olsam ben de benzer şekilde random süre arttırarak apiden hata alana kadar devam ederdim.
pinterest işi yaparken çok uğraştım cronjoblarla. delay, api,request limit vb :)
özel işlerimde ise lastrundate mekanizması baya işimi görüyor. panelim var hangi jobun ne sıklıkla çalışacağına ordan da karar verebiliyorum. baız jobların öncelikleri var hiç durmadan çalışıyor ama diğer jobların bekleme kabiliyeti var vb.
senin işin biraz dah spesifik tabi.
bu şekil yaptım şimdi çalışıyor gibi :D dün geceden beri hata almadım
-
Arlong bunu yazdı
coonjoblara delay ekleseen nasıl olur hocam, ilk başta 100 tanesi çalışsın, 10 saniye sonra 100 tane daha çalışsın gibi.
yada delay süresini, random olarak 1 le 50 arası diyeceksin her cronjoub için rastgele. sonra yaradana sığınıp bekleyeceksin;)
onu yapamıyorum ya, bütün işimiz bunun üstüne kurulu