<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Jamal Ali</title>
    <description>The latest articles on DEV Community by Jamal Ali (@camal1o).</description>
    <link>https://dev.to/camal1o</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F4099976%2F7d0e149c-73d5-4e19-aac3-2ebf1e3cc686.png</url>
      <title>DEV Community: Jamal Ali</title>
      <link>https://dev.to/camal1o</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/camal1o"/>
    <language>en</language>
    <item>
      <title>Shopify flash sale zamanı yükü necə idarə edir?</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Wed, 02 Sep 2026 20:43:33 +0000</pubDate>
      <link>https://dev.to/camal1o/shopify-flash-sale-zamani-yuku-nec-idar-edir-3f86</link>
      <guid>https://dev.to/camal1o/shopify-flash-sale-zamani-yuku-nec-idar-edir-3f86</guid>
      <description>&lt;p&gt;Bir məhsul buraxılışı elan olunur, geri sayım bitir və minlərlə alıcı eyni saniyələrdə səhifəni yeniləyir. Bir qismi məhsula baxır, digərləri səbətə əlavə edir, ən bahalı qrup isə checkout və ödəniş axınına keçir. Flash sale zamanı sistemin dərdi trafik sayından çox onun formasıdır: yük qəfil gəlir və platformanın kiçik bir hissəsinə yığılır.&lt;/p&gt;

&lt;p&gt;Shopify kimi çox mağazalı platformada vəziyyət daha incədir. Bir məşhur mağazanın kampaniyası həmin mağazanı yavaşlada bilər, amma başqa satıcıların biznesini özü ilə aparmamalıdır. Sistem dizaynının əsas sualı buna görə “neçə request qəbul edə bilərik?” deyil. Daha faydalı sual budur: “bir mağazanın qeyri-adi yükünü necə məhdudlaşdırıb alış axınını işlək saxlaya bilərik?”&lt;/p&gt;

&lt;h2&gt;
  
  
  Flash sale niyə sistemi fərqli sıxır?
&lt;/h2&gt;

&lt;p&gt;Normal gündə baxış, axtarış və alış request-ləri vaxta və mağazalara yayılır. Flash sale isə yüzlərlə fərqli URL-ə bərabər paylanmış trafik yaratmır. Hamı eyni məhsulu istəyir. Keşlənən şəkil və CSS faylı ucuz başa gəlsə də, stok yoxlaması, səbətin dəyişdirilməsi, endirim hesablanması və sifarişin yazılması shared state üzərində işləyir.&lt;/p&gt;

&lt;p&gt;Bu fərq capacity planlamada tez gözdən qaçır. Shopify-ın &lt;a href="https://shopify.engineering/performance-testing-shopify" rel="noopener noreferrer"&gt;performans testləri haqqında texniki yazısında&lt;/a&gt; vurğulandığı kimi, bütün request-lər eyni xərcə malik deyil. Saniyədə yüz min statik fayl cavabı sistemin checkout-da saniyədə daha az sayda write əməliyyatına dözəcəyini sübut etmir. CPU boş görünə bilər, amma database connection pool, lock gözləməsi və ya üçüncü tərəf payment inteqrasiyası artıq boğulur.&lt;/p&gt;

&lt;p&gt;Üstəlik, son məhsulu almağa çalışan istifadəçi uğursuz cavabdan sonra sakitcə getmir. Səhifəni yeniləyir, düyməni yenidən basır, mobil tətbiqi açır. Retry nəzarətsizdirsə, ilkin pikdən yaranan problem öz yükünü artıran dövrəyə çevrilir. Ona görə backpressure, timeout və idempotency checkout-un kənar bəzəyi deyil, pik anının əsas müdafiəsidir.&lt;/p&gt;

&lt;p&gt;Məsələ burada qəlizləşir.&lt;/p&gt;

&lt;p&gt;Sistem bütün request-ləri növbəyə qəbul edib gec də olsa cavablandırmağa çalışsa, queue böyüdükcə istifadəçinin gözləmə müddəti də artır. Client timeout verdikdən sonra görülən iş hətta faydasız ola bilər. Məhdud queue, erkən overload cavabı və exponential backoff sistemi bərpa oluna bilən vəziyyətdə saxlayır; gözləmə otağı isə alıcı axınını checkout-un real tutumuna uyğun tempə sala bilər. Bu tədbirlər satışın biznes qaydaları ilə razılaşdırılmalıdır, çünki texniki baxımdan sağlam throttle ədalətsiz məhsul bölgüsü yarada bilər.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pod arxitekturası yükü platformadan ayırır
&lt;/h2&gt;

&lt;p&gt;Shopify əvvəl database-i shard-lara bölərək üfüqi miqyaslama qazandı. Təkcə sharding yetərli deyildi: hər hansı shard-a bağlı əməliyyat bütün shard-ları gəzməli olsaydı, bir nasazlıq platforma səviyyəli problemə çevrilə bilərdi. Bunun qarşısını almaq üçün runtime pod-lara bölündü. Buradakı pod Kubernetes pod-u deyil; müəyyən mağazaları ayrıca datastore dəstində saxlayan izolyasiya vahididir.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://shopify.engineering/a-pods-architecture-to-allow-shopify-to-scale" rel="noopener noreferrer"&gt;Shopify-ın pod arxitekturasında&lt;/a&gt; hər web request və delayed job bir pod-a aid edilir. Load balancer qarşısındakı routing məntiqi mağazanı tapır, request-ə uyğun pod məlumatını əlavə edir və onu həmin istiqamətə göndərir. Application server də yalnız seçilmiş pod-un datastore-ları ilə işləyir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/shopify-flash-sale-miqyaslama" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Diaqramdakı sərhəd vacibdir. Məşhur mağaza Pod 1-də ağır yük yaradırsa, onun database vaxtını Pod 2-dəki mağazalarla birbaşa bölüşmür. App server və load balancer kimi bəzi resurslar ortaq qala bilər, lakin bir iş vahidi eyni anda pod-lar arasında gəzişmir. Bu, həm failure blast radius-u kiçildir, həm də yeni pod əlavə etməklə capacity-ni böyütməyə imkan verir.&lt;/p&gt;

&lt;p&gt;İzolyasiya pulsuz gəlmir. Routing cədvəli düzgün və sürətli olmalı, background job da web request kimi mağaza kontekstini daşımalı, cross-pod əməliyyatlar isə dizayn səviyyəsində məhdudlaşdırılmalıdır. Əks halda shard var, amma nasazlıq sərhədi kağız üzərində qalır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Oxuma yolunu ucuzlaşdırmaq, yazma yolunu qorumaq
&lt;/h2&gt;

&lt;p&gt;Flash sale trafikinin böyük hissəsi əvvəlcə storefront-a dəyir. Statik asset-lərin CDN-dən verilməsi və təhlükəsiz oxuma cavablarının cache-də saxlanması origin yükünü azaldır. Lakin stok və qiymət kimi tez dəyişən məlumatı uzun müddət cache-də saxlamaq başqa problem yaradır: sürətli, amma köhnə cavab.&lt;/p&gt;

&lt;p&gt;Burada məqsəd hər şeyi cache etmək deyil. Məhsul şəkli ilə “son ədəd qalıb” məlumatının freshness tələbi eyni ola bilməz. Oxuma yolunda qısa TTL, düzgün invalidation və sorğuların birləşdirilməsi origin-i qoruyur; sifariş yaradılan yazma yolunda isə correctness üstün tutulur. Eyni son vahidi iki alıcıya satmamaq üçün stok dəyişikliyi atomik qərar tələb edir.&lt;/p&gt;

&lt;p&gt;Checkout da mümkün qədər dar saxlanmalıdır. Analytics, e-poçt və digər yan təsirlər sifarişin qəbul edilməsi üçün məcburi deyilsə, onları sinxron kritik yola yığmaq latency-ni və nasazlıq ehtimalını artırır. Queue bu işləri ayıra bilər, amma sifarişin özündə idempotency açarı lazımdır. İstifadəçi və ya gateway eyni əməliyyatı təkrarlayanda sistem ikinci sifariş yaratmamalıdır.&lt;/p&gt;

&lt;p&gt;Queue isə sonsuz anbar deyil. Consumer-lər producer-lərdən uzun müddət geri qalırsa, “sifarişi qəbul etdik” cavabının arxasında saatlarla gecikən əməliyyatlar qala bilər. Queue depth, ən köhnə mesajın yaşı və consumer throughput birlikdə izlənməlidir. Kritik sifariş hadisələri ilə aşağı prioritetli analytics mesajlarını eyni növbədə saxlamaq da təhlükəlidir; ikinci qrupun sıçrayışı birinci qrupun gecikməsini artırmamalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Pik gün məşq edilmədən idarə olunmur
&lt;/h2&gt;

&lt;p&gt;Capacity rəqəmi production-a yaxın workload olmadan az şey deyir. Bəzən heç nə demir. Load test məlum request səviyyəsinin müəyyən müddət saxlanmasını yoxlayır. Stress test isə yükü tədricən və ya qəfil artıraraq komponentin yuxarı həddini, doyma nöqtəsini, gecikmənin necə dəyişdiyini və hansı formada sıradan çıxdığını göstərir. Bunlar ayrı suallardır və Shopify hər ikisini istifadə edir.&lt;/p&gt;

&lt;p&gt;Test trafikinin şəkli də production-a bənzəməlidir. &lt;a href="https://shopify.engineering/scale-performance-testing" rel="noopener noreferrer"&gt;Shopify-ın miqyaslı test prosesində&lt;/a&gt; flash sale üçün ayrıca axın var: storefront aktivliyi qəfil artır və simulyasiya edilən istifadəçilər eyni məhsulu almağa çalışırlar. Başqa axınlar gəzinmə, admin əməliyyatları və Storefront API trafikini təkrarlayır. Beləcə bir “orta request” rəqəmi müxtəlif bottleneck-ləri gizlətmir.&lt;/p&gt;

&lt;p&gt;Sintetik test yenə production-un surəti deyil. Real istifadəçi retry edir, botlar fərqli davranır, payment provider gecikə bilər, cache hit nisbəti dəyişir. Buna görə testdən çıxan ən qiymətli məlumat rekord throughput yox, sistemin əyilməyə başladığı nöqtədir: hansı queue böyüyür, p95 latency nə vaxt sıçrayır, error budget harada sürətlə xərclənir və overload zamanı hansı funksiya əvvəl məhdudlaşdırılmalıdır.&lt;/p&gt;

&lt;p&gt;Flash sale üçün dayanıqlı dizayn bir “sehrli” komponentdən yaranmır. Shopify nümunəsində əsas fikir qatların birlikdə işləməsidir: routing request-i doğru pod-a bağlayır, pod nasazlıq və yük sərhədi yaradır, cache bahalı oxumaları azaldır, checkout correctness qaydalarını qoruyur, performans testləri isə bütün bu fərziyyələri trafik gəlməzdən əvvəl sıxır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tez-tez verilən suallar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Flash sale adi yüksək trafikdən nə ilə fərqlənir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Trafik qısa müddətdə kəskin artır, çoxlu alıcı eyni mağazaya, məhsula və checkout axınına yönəlir. Bu, orta yükü deyil, konkret resurslardakı sıxlığı kritik edir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Shopify pod arxitekturasından niyə istifadə edir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Pod mağazaların bir hissəsini ayrıca datastore dəsti daxilində saxlayır. Beləliklə, yük və nasazlıq bütün platformaya nəzarətsiz yayılmır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Flash sale üçün yalnız load test kifayətdirmi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xeyr. Load test məlum hədəfi yoxlayır, stress test isə sistemin yuxarı həddini və dağılma formasını göstərir. Real trafik forması və bahalı endpoint-lər də sınaqda təkrarlanmalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mənbələr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://shopify.engineering/a-pods-architecture-to-allow-shopify-to-scale" rel="noopener noreferrer"&gt;A Pods Architecture To Allow Shopify To Scale&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shopify.engineering/performance-testing-shopify" rel="noopener noreferrer"&gt;Pummelling the Platform, Performance Testing Shopify&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://shopify.engineering/scale-performance-testing" rel="noopener noreferrer"&gt;Performance Testing At Scale for BFCM and Beyond&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Bu yazı süni intellekt köməyi ilə yazılıb, faktları və mənbələri yoxlanılıb.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>casestudy</category>
      <category>architecture</category>
      <category>backend</category>
    </item>
    <item>
      <title>Açıq cloud API vendor lock-in problemini həll edirmi?</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Sat, 29 Aug 2026 22:39:57 +0000</pubDate>
      <link>https://dev.to/camal1o/aciq-cloud-api-vendor-lock-in-problemini-hll-edirmi-1i71</link>
      <guid>https://dev.to/camal1o/aciq-cloud-api-vendor-lock-in-problemini-hll-edirmi-1i71</guid>
      <description>&lt;p&gt;&lt;a href="https://camalali.com/bloq/cloud-computing-nedir" rel="noopener noreferrer"&gt;Cloud&lt;/a&gt; provayderinin API-ni açması ilk baxışda çox cəlbedici vəd verir: infrastrukturu kodla idarə et, istənilən alətdən qoşul, lazım gələndə də başqa yerə keç. İlk iki hissə doğrudur. Üçüncüsü isə bu qədər rahat deyil.&lt;/p&gt;

&lt;p&gt;Açıq cloud API xidmətlə danışığın qaydasını görünən edir. Hansı request göndərilir, hansı sahələr tələb olunur, cavab və xəta necə görünür, bunları bilmək üçün provayderin daxili koduna ehtiyac qalmır. &lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI Specification&lt;/a&gt; də HTTP API-ləri proqramlaşdırma dilindən asılı olmayan təsvirlə insan və proqram üçün anlaşılan etməyə xidmət edir. Bu, client generatoru, test, sənədləşmə və üçüncü tərəf alətləri üçün möhkəm başlanğıcdır.&lt;/p&gt;

&lt;p&gt;Amma açıq olmaqla eyni olmaq ayrı şeylərdir. İki provayder API sənədini hamıya göstərə bilər, hər ikisi virtual maşın yaratmağa imkan verər, yenə də image formatı, şəbəkə modeli, disk snapshot-ı, rol sistemi və xəta davranışı bir-birinə uyğun gəlməz. Müqaviləni oxumaq mümkündür, müqavilələr isə fərqlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Açıq API əslində nəyi açır?
&lt;/h2&gt;

&lt;p&gt;API müqaviləsi dörd əsas sualı cavablandırır: hansı əməliyyat mövcuddur, giriş məlumatı nədir, uğurlu cavab necə görünür və xəta hansı formada qaytarılır. Maşın tərəfindən oxunan təsvir bu müqaviləni alətlər üçün də işlək edir. İş bununla bitmir. OpenAPI HTTP endpoint-lərini, parametrləri, request və &lt;a href="https://camalali.com/bloq/partial-response-api" rel="noopener noreferrer"&gt;response&lt;/a&gt; strukturunu ifadə edir; spesifikasiya mənbə koduna və şəbəkə trafikini əl ilə araşdırmağa ehtiyac olmadan servisin imkanlarını anlamağı hədəfləyir.&lt;/p&gt;

&lt;p&gt;Bu səviyyədə açıqlıq real fayda verir. Provayderin öz SDK-sı yeganə giriş qapısı olmur. Komanda öz client-ini yarada, müqavilə testləri qura, dəyişiklikləri diff edə və idarəetməni mövcud automation alətlərinə bağlaya bilər. API versiyası və deprecation qaydası aydın yazılıbsa, upgrade zamanı sürpriz də azalır.&lt;/p&gt;

&lt;p&gt;Lakin API təsviri servisin davranışını tam standartlaşdırmır. Eyni adlı &lt;code&gt;createServer&lt;/code&gt; əməliyyatı bir sistemdə saniyələr içində hazır resurs qaytara, digərində isə sonradan izlənməli asinxron job yarada bilər. Rate limit, eventual consistency, retry təhlükəsizliyi və kvota modeli sxemdə qismən görünür, bəzən heç görünmür. Burada məsələ qəlizləşir: sintaksis uyğun olsa da semantika fərqli qala bilər.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portativlik bir neçə qatın birlikdə işləməsidir
&lt;/h2&gt;

&lt;p&gt;Tətbiqi daşımaq üçün təkcə API çağırışlarını dəyişmək kifayət etsəydi, migration layihələri xeyli darıxdırıcı olardı. Əsl yük aşağı qatlarda üzə çıxır. Tətbiqin topologiyası, komponentlər arasındakı əlaqələr, deployment artifact-ları və lifecycle əməliyyatları da təsvir olunmalıdır. &lt;a href="https://docs.oasis-open.org/tosca/TOSCA/v2.0/TOSCA-v2.0.html" rel="noopener noreferrer"&gt;TOSCA 2.0&lt;/a&gt; məhz komponentləri, onların əlaqələrini və yaradılma ilə dəyişdirilmə prosedurlarını service topology və orchestration vasitəsilə ifadə edir.&lt;/p&gt;

&lt;p&gt;Aşağıdakı sxemdə açıq API yalnız üst qapıdır. Request adapterdən keçib provayderin resurs modelinə çevrilir; workload həmin resurslarda işləyir, data isə ayrıca köçürülür. Identity və observability bütün bu axına toxunur. Buna görə hər yolun ortaq portability testindən keçməsi lazımdır.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/aciq-cloud-api-portativlik" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Provayder adapteri ortaq daxili model ilə konkret cloud API-si arasındakı tərcümə qatıdır. Compute, şəbəkə və storage modeli resursların nə demək olduğunu müəyyən edir. Workload və lifecycle hissəsi deploy, scale, patch və shutdown kimi əməliyyatları əhatə edir. Data ixracı və idxalı vəziyyətin yeni mühitə aparılmasıdır; identity rol və icazələrin, observability isə log, metric və tracing axınının yenidən qurulmasını tələb edir. Portability testi bunları birlikdə sınamırsa, kağız üzərindəki uyğunluq &lt;a href="https://camalali.com/bloq/production-veb-tetbiqinin-esas-komponentleri" rel="noopener noreferrer"&gt;production&lt;/a&gt; keçidini sübut etmir.&lt;/p&gt;

&lt;p&gt;TOSCA-nın model-driven yanaşması da bu boşluğu hədəfləyir: modeldəki dependency, connection və composition məlumatı avtomatlaşdırılmış prosesləri idarə edə bilir. Üstəlik CSAR adlı arxiv formatı service template ilə deployment və implementation artifact-larını eyni konteynerdə daşımağa imkan verir. Bu, hər cloud-un eyni davranacağı demək deyil. Standart təsvir olunan hissəni portativ edir; tətbiqin içindəki provayderə məxsus komponent ayrıca həll tələb edir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Vendor lock-in harada qalır?
&lt;/h2&gt;

&lt;p&gt;Ən görünən bağlılıq xüsusi API əməliyyatıdır. Məsələn, tətbiq yalnız bir provayderdə olan managed database funksiyasına söykənirsə, adapter yazmaq həmin funksiyanın alternativini yaratmır. Daha sakit bağlılıqlar da var: böyük həcmdə datanın çıxarılma vaxtı və qiyməti, IAM siyasətlərinin fərqli semantikası, region topologiyası, secret idarəetməsi, metric adları və incident zamanı komandanın istifadə etdiyi runbook-lar.&lt;/p&gt;

&lt;p&gt;Lock-in həmişə pis qərar deyil. Provayderə məxsus servis daha az əməliyyat yükü, daha yaxşı &lt;a href="https://camalali.com/bloq/latency-gizli-network-partition-kimi" rel="noopener noreferrer"&gt;latency&lt;/a&gt; və sürətli məhsul inkişafı verə bilər. Bağlılığı görməmək səhvdir. Həm də bahalı. Komanda qazancı ölçüb çıxış planının xərcini qəbul edirsə, bu şüurlu trade-off-dur; yalnız API açıqdır deyə çıxışın pulsuz olduğunu düşünürsə, hesab yarımçıqdır.&lt;/p&gt;

&lt;p&gt;API-nin lisenziyası da ayrıca məsələdir. Spesifikasiyanı oxumaq və client yaratmaq hüququ vacibdir, amma uyğun alternativ implementasiyanın bazarda mövcud olacağına zəmanət vermir. Kağız üzərində tam açıq interfeys ola bilər, onu eyni semantika ilə təqdim edən ikinci servis isə olmaya bilər. Bu halda hüquqi və texniki açıqlıq var, praktik çıxış yolu yoxdur.&lt;/p&gt;

&lt;p&gt;Fərq məhz budur.&lt;/p&gt;

&lt;p&gt;Ortaq abstraction qatının da qiyməti var. Bütün cloud-ları ən kiçik ortaq məxrəcə salanda fərqləndirici imkanlar itir. Həddindən artıq ümumi model isə xüsusi hallarla dolur və bir müddət sonra öz kiçik cloud platformanıza çevrilir. Adətən daha sağlam sərhəd tətbiqin istifadə etdiyi dar imkan dəstini abstraktlaşdırmaq, provayderə məxsus optimizasiyaları isə açıq şəkildə adapterin arxasında saxlamaqdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Portativliyi necə sınaqdan keçirmək olar?
&lt;/h2&gt;

&lt;p&gt;Yaxşı ölçü “ikinci provayder üçün kodumuz var” deyil. Eyni workload təmiz mühitdə qurula, lazımi data bərpa oluna, identity siyasətləri tətbiq edilə və observability siqnalları görünə bilirmi? Failover və rollback işləyirmi? Bunlar müntəzəm sınaqdan keçmirsə, alternativ deployment çox vaxt köhnəlmiş YAML və nikbin wiki səhifəsindən ibarət qalır.&lt;/p&gt;

&lt;p&gt;API contract testləri request və response uyğunluğunu yoxlayır. Integration testləri adapterin real provayder davranışını tutmalıdır. Sonra data restore testi, icazə testi və əməliyyat ssenariləri gəlir. TOSCA service lifecycle idarəetməsini yaradılma ilə məhdudlaşdırmır; model deploy-dan sonrakı dəyişiklikləri də ifadə edir. Portativlik də yalnız ilk deployment anı deyil, scale, patch, monitor və dayandırma kimi bütün ömür dövründə qorunmalıdır.&lt;/p&gt;

&lt;p&gt;Belə sınağın tezliyi biznesin həssaslığından asılıdır. İldə bir dəfə masa arxasında sənədə baxmaqla canlı migration məşqi eyni sübut deyil. Kritik sistemdə müvəqqəti ikinci mühit qurmaq baha görünə bilər, amma &lt;a href="https://camalali.com/bloq/dns-gecikmesi-ve-zencirvari-timeoutlar" rel="noopener noreferrer"&gt;DNS&lt;/a&gt; keçidi, sertifikatlar, queue-da qalan mesajlar və write zamanı yaranan data fərqi yalnız real axında üzə çıxır. Daha az kritik workload üçün isə periodik restore və smoke test kifayət edə bilər. Məqsəd multi-cloud nişanı toplamaq yox, qəbul edilmiş bərpa müddətinin texniki olaraq mümkün olduğunu görməkdir.&lt;/p&gt;

&lt;p&gt;Açıq cloud API buna görə son həll yox, yoxlanıla bilən sərhəddir. O, qapını və qapının dilini göstərir. Qapıdan keçəndən sonra resurs semantikası, data, identity və əməliyyat vərdişləri hələ də sizinlə gəlməlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tez-tez verilən suallar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Açıq API istifadə etmək vendor lock-in-i aradan qaldırır?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xeyr. Açıq müqavilə inteqrasiyanı və alternativ client yazmağı asanlaşdırır, lakin resurs semantikası, data köçürməsi, identifikasiya və əməliyyat davranışı yenə provayderə bağlı qala bilər.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;OpenAPI ilə cloud API eyni şeydir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xeyr. Cloud API xidməti idarə edən interfeysdir, OpenAPI isə HTTP API-nin əməliyyatlarını və strukturunu maşın tərəfindən oxuna bilən formada təsvir edən standartdır.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Multi-cloud üçün bütün provayderləri ortaq interfeys arxasında gizlətmək lazımdır?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Yalnız tətbiqin həqiqətən istifadə etdiyi sabit imkanlar üçün. Ən kiçik ortaq məxrəc yanaşması provayderlərin faydalı fərqli imkanlarını gizlədə və mürəkkəbliyi adapter qatına daşıya bilər.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mənbələr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://spec.openapis.org/oas/latest.html" rel="noopener noreferrer"&gt;OpenAPI Specification 3.2.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.oasis-open.org/tosca/TOSCA/v2.0/TOSCA-v2.0.html" rel="noopener noreferrer"&gt;TOSCA Version 2.0&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Bu yazı süni intellekt köməyi ilə yazılıb, faktları və mənbələri yoxlanılıb.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>cloud</category>
      <category>distributedsystems</category>
      <category>backend</category>
    </item>
    <item>
      <title>HTTP cache header-larını düzgün qurmaq</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Sat, 29 Aug 2026 12:47:48 +0000</pubDate>
      <link>https://dev.to/camal1o/http-cache-header-larini-duzgun-qurmaq-edm</link>
      <guid>https://dev.to/camal1o/http-cache-header-larini-duzgun-qurmaq-edm</guid>
      <description>&lt;p&gt;HTTP keşini “sürət düyməsi” kimi təsəvvür etmək rahatdır: max-age əlavə et, server yükü azalsın, səhifə də sürətlənsin. Problem ondadır ki, keş yanlış cavabı çox səmərəli şəkildə çoxalda da bilir. Bir istifadəçinin məlumatı başqasına görünəndə və ya köhnə HTML yeni JavaScript bundle-a işarə etməyəndə qazandığımız bir neçə millisaniyə artıq təsəlli vermir.&lt;/p&gt;

&lt;p&gt;Fərq vacibdir.&lt;/p&gt;

&lt;p&gt;Düzgün siyasət header adlarını əzbərləməklə qurulmur. Əvvəl hər resurs üçün üç suala cavab lazımdır: cavab nə qədər müddət dəyişmədən qala bilər, onu kimlər paylaşa bilər və köhnələndə origin serverlə yoxlanmalıdırmı? Üç sual. Qalan seçimlər onların cavabından çıxır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Keşin iki ayrı işi var
&lt;/h2&gt;

&lt;p&gt;HTTP cache cavabı saxlaya və sonrakı uyğun request-də yenidən istifadə edə bilər. Browser cache adətən bir istifadəçiyə xidmət edən private cache-dir. CDN və &lt;a href="https://camalali.com/bloq/reverse-proxy-api-gateway-load-balancer-ferqi" rel="noopener noreferrer"&gt;reverse&lt;/a&gt; proxy isə bir cavabı çox istifadəçiyə verən shared cache rolundadır. Eyni &lt;code&gt;Cache-Control&lt;/code&gt; sətri hər ikisinə təsir edə bilər, amma onların riskləri eyni deyil.&lt;/p&gt;

&lt;p&gt;Burada iki anlayış tez-tez qarışır: freshness və validation. Fresh cavabın müəyyən edilmiş ömrü hələ bitməyib, ona görə cache origin-ə getmədən onu işlədə bilər. Stale cavabın ömrü bitib. Bu, cavabın mütləq yararsız olması demək deyil; validator varsa cache kiçik conditional request göndərib nüsxəsinin hələ aktual olub-olmadığını soruşa bilər. &lt;a href="https://www.rfc-editor.org/rfc/rfc9111.html" rel="noopener noreferrer"&gt;RFC 9111&lt;/a&gt; HTTP cache davranışını məhz saxlama, freshness və validation qaydaları üzərindən müəyyənləşdirir.&lt;/p&gt;

&lt;p&gt;max-age=300 cavabın yaradıldığı və ya son uğurlu validation edildiyi andan beş dəqiqə sonra stale sayılacağını bildirir. Beş dəqiqə ərzində cache hit origin-ə request göndərməyə bilər. Bu müddəti yalnız trafikə baxıb seçmək yarımçıq yanaşmadır, çünki əsas ölçü biznesin həmin cavabın köhnəlməsinə nə qədər dözə bilməsi və yanlış məlumatın hansı əməliyyata təsir göstərməsidir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: public, max-age=300
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;public cavabı açıq şəkildə cacheable edir və shared cache üçün də istifadəyə imkan yaradır. Hər public resursa bu direktivi əlavə etmək məcburi deyil, çünki bəzi cavablar onsuz da cacheable olur; API və CDN konfiqurasiyasında niyyəti aydın göstərmək isə yenə faydalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  no-cache, no-store və private eyni şey deyil
&lt;/h2&gt;

&lt;p&gt;Adına görə ən çox çaşdıran direktiv no-cache-dir. Cavabı saxlamağı qadağan etmir. Cache saxlanmış cavabı yenidən verməzdən əvvəl origin serverdə uğurla validate etməlidir. Bu, tez-tez dəyişən HTML üçün yaxşı seçim ola bilər: browser nüsxəni saxlayır, ETag ilə soruşur, məzmun dəyişməyibsə server body əvəzinə 304 Not Modified qaytarır.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: no-cache
ETag: "page-v42"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;ETag cavab variantının identifikatorudur. Növbəti request If-None-Match header-ı ilə gedir. Serverdə təqdimat eynidirsə bütün body yenidən daşınmır, amma network gediş-gəlişi qalır; deməli validation bandwidth-i azalda bilər, latency-ni sıfırlamır.&lt;/p&gt;

&lt;p&gt;no-store daha sərtdir: cache request və response-u saxlamamalı, həmin response-u başqa request-i cavablandırmaq üçün istifadə etməməlidir. Bank çıxarışı, birdəfəlik token və həssas şəxsi məlumat kimi cavablarda məntiqlidir. Bununla belə, no-store şifrələmə və access control əvəzi deyil, komprometasiya edilmiş cache və ya şəbəkədə dinləmə riskini bu header təkbaşına həll etmir.&lt;/p&gt;

&lt;p&gt;private başqa sərhəd çəkir. Shared cache cavabı saxlamır, istifadəçinin private cache-i isə digər şərtlər imkan verirsə saxlaya bilər. Login olmuş istifadəçinin profil səhifəsi dəyişməz deyil, amma hər naviqasiyada bütün body-ni yenidən daşımaq da lazım olmaya bilər:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: private, no-cache
ETag: "profile-8d91"
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu kombinasiya browser-ə cavabı saxlamağa, hər istifadədən əvvəl isə yoxlamağa imkan verir. Təkcə Set-Cookie görüb response-un cache edilməyəcəyini düşünmək təhlükəlidir, çünki Set-Cookie özü caching-i dayandırmır və siyasət Cache-Control ilə açıq yazılmalıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Browser və CDN üçün ayrı ömür
&lt;/h2&gt;

&lt;p&gt;Bəzən browser-in cavabı qısa müddət saxlaması, CDN-in isə daha uzun saxlaması məqsədəuyğundur. s-maxage yalnız shared cache üçün maksimum yaşı müəyyən edir və həmin cache-də max-age və Expires dəyərini üstələyir.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: public, max-age=60, s-maxage=600
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bu nümunədə browser bir dəqiqəlik freshness görür, CDN isə cavabı on dəqiqə fresh saya bilər. Risk də böyüyür. Daha uzun CDN ömrü bütün istifadəçilərə köhnə məlumat yayır, buna görə endpoint-in cavabı regiona, dilə və ya başqa request header-ına görə dəyişirsə cache key həmin fərqi mütləq bilməlidir.&lt;/p&gt;

&lt;p&gt;Vary: Accept-Encoding cache-ə sıxılma variantlarını ayırmağı deyir. Vary: Accept-Language dilə görə ayrıca variant yaradır. Vary-də göstərilən request header-ları uyğun gəlmirsə saxlanmış cavab yoxlanmadan istifadə edilə bilməz. Hər şeyi Vary-yə əlavə etmək çıxış yolu deyil, variantların sayı artdıqca hit ratio düşür, cache-in faydası əriyir və xüsusən Vary: User-Agent çox geniş kombinasiya yarada bilər.&lt;/p&gt;

&lt;p&gt;İstifadəçiyə görə dəyişən cavabı shared cache-də saxlamaq istəyərkən məsələ daha qəlizdir. Cache key həqiqətən istifadəçini ayırmırsa, &lt;code&gt;public&lt;/code&gt; və uzun &lt;code&gt;s-maxage&lt;/code&gt; təhlükəli seçimdir. Belə cavabı &lt;code&gt;private&lt;/code&gt; saxlamaq və ya public hissə ilə fərdi hissəni ayrı endpoint-lərə bölmək daha aydın sərhəd yaradır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Statik asset və HTML fərqli ömür istəyir
&lt;/h2&gt;

&lt;p&gt;Content hash daşıyan &lt;code&gt;app.a81f3c.js&lt;/code&gt; faylının məzmunu dəyişəndə adı da dəyişir. Bu tip immutable &lt;a href="https://camalali.com/bloq/static-asset-servisi-nece-qurulur" rel="noopener noreferrer"&gt;asset&lt;/a&gt; üçün uzun freshness uyğundur:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;Cache-Control: public, max-age=31536000, immutable
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Köhnə faylı zorla invalidasiya etməyə ehtiyac qalmır. Yeni deploy yeni URL yaradır, HTML də həmin URL-ə işarə edir. Amma hash daşımayan /app.js üçün eyni birillik siyasət deploy-dan sonra köhnə kodun uzun müddət qalmasına səbəb ola bilər; cache busting query parametrindən istifadə edilirsə parametr hər məzmun dəyişikliyində sabit qayda ilə dəyişməlidir.&lt;/p&gt;

&lt;p&gt;HTML isə adətən qısa freshness və ya validation istəyir, çünki yeni asset ünvanlarını o daşıyır. HTML uzun müddət köhnə qalsa, serverdə artıq silinmiş bundle-a request gedə bilər. Release prosesi köhnə asset-ləri bir müddət saxlamaqla bu keçidi yumşalda bilər, lakin əsas siyasət yenə resursların dəyişmə modelinə uyğun olmalıdır.&lt;/p&gt;

&lt;p&gt;Expires eyni məqsəd üçün tarix verir, amma max-age olduqda recipient Expires-ı nəzərə almır. Müasir konfiqurasiyada nisbi saniyə dəyəri deploy və saat fərqləri baxımından daha rahatdır. Header ümumiyyətlə verilməyəndə bəzi cache-lər heuristic freshness hesablaya bilər; davranışı infrastruktura buraxmaqdansa niyyəti açıq yazmaq daha proqnozlaşdırılandır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Siyasəti production-da görmək
&lt;/h2&gt;

&lt;p&gt;Konfiqurasiya faylında düzgün görünən header yolun sonunda dəyişə bilər. CDN qaydası origin header-ını əvəz edir, framework middleware-i yalnız bəzi status kodlarına işləyir, reverse proxy isə &lt;code&gt;Vary&lt;/code&gt; sahəsini itirir. Ona görə yoxlama browser devtools ilə bitmir. Origin və CDN cavabları ayrıca izlənir, &lt;code&gt;Age&lt;/code&gt;, &lt;code&gt;Cache-Control&lt;/code&gt;, &lt;code&gt;ETag&lt;/code&gt;, &lt;code&gt;Vary&lt;/code&gt; və status kodu birlikdə oxunur.&lt;/p&gt;

&lt;p&gt;Age shared cache-də cavabın təxmini yaşını saniyə ilə göstərir. Ardıcıl request-lərdə artması cavabın origin-dən yox, aradakı cache-dən gəldiyinə işarə edə bilər. Validation baş verəndə 304, fresh hit zamanı isə çox vaxt normal status və cache vendor-una aid əlavə hit header-ı görünür.&lt;/p&gt;

&lt;p&gt;Keş siyasəti endpoint növünə görə sənədləşdiriləndə dəyişikliklər də təhlükəsiz olur: hashed asset uzunömürlüdür, HTML validate edilir, public kataloq cavabı qısa müddət shared cache-də qalır, şəxsi məlumat isə shared cache-dən uzaq tutulur. Eyni universal header daha az konfiqurasiya kimi görünür. Sonradan açdığı başağrısı isə xeyli universaldır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tez-tez verilən suallar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;no-cache cavabın saxlanmasını qadağan edirmi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xeyr. no-cache cavabın sonrakı request üçün istifadə edilməzdən əvvəl origin serverdə uğurla yoxlanmasını tələb edir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;no-store ilə private arasında fərq nədir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;no-store cavabın cache-də saxlanmasını qadağan edir. private isə shared cache-i kənarda saxlayır, amma istifadəçinin browser cache-inə saxlamağa icazə verə bilər.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dəyişməz statik fayllara uzun max-age vermək təhlükəlidirmi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Faylın URL-i content hash və ya versiya daşıyırsa təhlükə xeyli azalır, çünki məzmun dəyişəndə URL də dəyişir. Eyni URL altında məzmun dəyişəcəksə uzun ömür uyğun deyil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mənbələr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9111.html" rel="noopener noreferrer"&gt;RFC 9111 HTTP Caching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc9110.html" rel="noopener noreferrer"&gt;RFC 9110 HTTP Semantics&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Bu yazı süni intellekt köməyi ilə yazılıb, faktları və mənbələri yoxlanılıb.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>caching</category>
      <category>performance</category>
      <category>backend</category>
    </item>
    <item>
      <title>Cisco ACE load balancer-i idarə edərkən nəyə baxmaq lazımdır?</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Sat, 29 Aug 2026 09:34:53 +0000</pubDate>
      <link>https://dev.to/camal1o/cisco-ace-load-balancer-i-idar-edrkn-ny-baxmaq-lazimdir-4i57</link>
      <guid>https://dev.to/camal1o/cisco-ace-load-balancer-i-idar-edrkn-ny-baxmaq-lazimdir-4i57</guid>
      <description>&lt;p&gt;Cisco ACE ilə işləyən administratorun qarşısında qəribə vəziyyət dayanır: cihaz zəngin funksiyalara malikdir, trafik yolunun tam ortasındadır, amma özü artıq keçmiş nəsil platformadır. Buna görə konfiqurasiyaya yalnız “request hansı serverə getsin?” sualı ilə baxmaq kifayət etmir. Tətbiqin sağlamlığı, session davranışı, SSL sərhədi və cihaz sıradan çıxanda baş verəcək hadisələr eyni xəritədə görünməlidir.&lt;/p&gt;

&lt;p&gt;Problem də budur.&lt;/p&gt;

&lt;p&gt;ACE 4710 ayrıca appliance kimi, ACE modulları isə şəbəkə avadanlığının daxilində application delivery funksiyası verirdi. Cisco bu iki məhsulu data center üçün load balancing və application delivery həlli kimi təsvir edir. Bu sinif cihaz client ilə backend arasında &lt;a href="https://camalali.com/bloq/reverse-proxy-api-gateway-load-balancer-ferqi" rel="noopener noreferrer"&gt;reverse&lt;/a&gt; &lt;a href="https://camalali.com/bloq/proxy-ve-reverse-proxy-ferqi" rel="noopener noreferrer"&gt;proxy&lt;/a&gt; və ya Layer 4 load balancer rolunda dayanır; client virtual IP-yə qoşulur, ACE uyğun server farm-ı tapır, işlək real server seçir və bağlantını ora ötürür. Kağız üzərində sadədir. Production-da isə hər oxun öz state-i və nasazlıq ssenarisi var.&lt;/p&gt;

&lt;h2&gt;
  
  
  Trafik ACE-dən necə keçir?
&lt;/h2&gt;

&lt;p&gt;Konfiqurasiyanı oxumağın rahat yolu ayrı-ayrı komandaları əzbərləmək deyil, obyektlər arasındakı yolu izləməkdir. Virtual IP xidmətin xarici ünvanıdır. Class map trafiki tanıyır, policy map həmin trafikə load balancing davranışı bağlayır, server farm backend hovuzunu saxlayır, real server isə konkret tətbiq instansiyasıdır. Health probe real serverin rotasiyada qalıb-qalmayacağına qərar verir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/cisco-ace-load-balancer" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu axında class map və policy map giriş trafikinin hansı xidmətə aid olduğunu müəyyən edir. Server farm seçildikdən sonra predictor işlək real serverlər arasından birini seçir. Cavab client-ə ACE üzərindən qayıdırsa, cihaz connection state-i saxlayır; asimmetrik routing yaranarsa paketlərin bir hissəsi bu state-dən yan keçə və bağlantı qırıla bilər. Deməli, routing dizaynı load balancer konfiqurasiyasından ayrı məsələ deyil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Predictor serverin həqiqi yükünü həmişə bilmir
&lt;/h2&gt;

&lt;p&gt;ACE-də round-robin və least connections davranışları fərqli məqsədlərə xidmət edir. Weighted round-robin standart predictor-dur. Weight böyükdürsə, server daha çox yeni bağlantı alır; eyni gücdə və oxşar workload daşıyan backend-lər üçün bu, proqnozlaşdırılması asan seçimdir.&lt;/p&gt;

&lt;p&gt;Least connections açıq bağlantısı daha az olan serverə üstünlük verir. Uzunömürlü bağlantılar və qeyri-bərabər request müddətləri olan sistemdə bu, faydalı görünür, amma connection sayı CPU, yaddaş və ya queue dərinliyi deyil. On min yüngül keep-alive bağlantısı bəzən yüz ağır hesablama request-indən ucuz başa gəlir. Siqnal natamamdır.&lt;/p&gt;

&lt;p&gt;Yeni serveri bir anda tam trafikə salmaq da yaxşı fikir deyil. ACE-nin least-connections predictor-u üçün slow start mexanizmi yeni real serverə əvvəlcə az bağlantı göndərir, sonra yükü tədricən artırır. Bu, cache-i soyuq olan və ya connection pool-u yenicə qurulan instansiyanın ilk saniyələrdə boğulmasının qarşısını ala bilər.&lt;/p&gt;

&lt;p&gt;Hash əsaslı seçim başqa ehtiyacı həll edir. ACE ünvan, cookie, HTTP header və &lt;a href="https://camalali.com/bloq/url-komponentleri" rel="noopener noreferrer"&gt;URL&lt;/a&gt; əsasında server seçə bilir. Müəyyən açar eyni backend-ə düşür. Açarlar bərabər paylanmırsa isə serverlərdən biri həddindən artıq yüklənə bilər, buna görə qərarı alqoritmin adı yox, tətbiqin real trafik forması müəyyən edir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Health probe port yoxlamasından artıq olmalıdır
&lt;/h2&gt;

&lt;p&gt;Probe-un işi backend-in trafik qəbul edib-etmədiyini müəyyənləşdirməkdir. ACE ICMP, &lt;a href="https://camalali.com/bloq/tcp-timestamps-sondurmek-duzgundurmu" rel="noopener noreferrer"&gt;TCP&lt;/a&gt;, HTTP, HTTPS, DNS və başqa yoxlama növləri ilə konfiqurasiya oluna bilir. TCP probe portun bağlantı qəbul etdiyini göstərir, daha artığını yox. Tətbiq database-ə çata bilmirsə və bütün request-lərə xəta qaytarırsa, açıq portun çox təsəllisi yoxdur.&lt;/p&gt;

&lt;p&gt;HTTP probe üçün ayrıca, ucuz health endpoint seçmək daha düzgün siqnal verir. Endpoint tətbiqin trafik qəbul edə bildiyini yoxlamalıdır, amma hər probe-da bütün asılılıqlara ağır sorğu göndərməməlidir. Interval həddən artıq qısa, uğursuzluq həddi isə çox sərt seçiləndə qısa şəbəkə titrəyişi serverləri növbə ilə rotasiyadan çıxara bilər. Bu dəfə load balancer problemi azaltmır, özü trafik dalğası yaradır.&lt;/p&gt;

&lt;p&gt;Server probe-dan keçməyəndə mövcud bağlantıların taleyi əvvəlcədən məlum olmalıdır. Yeni bağlantıları dayandırmaqla aktiv connection-ları dərhal sıfırlamaq eyni davranış deyil. Fərq böyükdür. Uzun download, WebSocket və ya stateful transaction daşıyan sistemdə istifadəçi bunu dərhal görür; nasazlıq testi buna görə backend-i söndürüb bir yeni request yoxlamaqla bitməməli, aktiv bağlantını, bərpanı və serverin yenidən rotasiyaya qoşulmasını da əhatə etməlidir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Stickiness rahatlıq verir, sonra hesabını istəyir
&lt;/h2&gt;

&lt;p&gt;ACE eyni client-in sonrakı bağlantılarını eyni real serverə bağlamaq üçün source IP, cookie, HTTP header və SSL session ID kimi stickiness üsullarını dəstəkləyir. Lokal yaddaşda session saxlayan köhnə tətbiq üçün bu, zəruri ola bilər; backend dəyişəndə istifadəçi login vəziyyətini itirmir.&lt;/p&gt;

&lt;p&gt;Amma source IP stickiness &lt;a href="https://camalali.com/bloq/nat-ipv4-unvanlarini-nece-qorudu" rel="noopener noreferrer"&gt;NAT&lt;/a&gt; arxasındakı minlərlə istifadəçini bir serverə yığa bilər. Cookie əsaslı üsul daha dəqiqdir, bunun müqabilində cookie-nin müddəti, adı və təhlükəsizlik atributları idarə olunmalıdır. Server rotasiyadan çıxanda sticky qeydin hara yönələcəyi də ayrıca failover qərarıdır. Stateless tətbiq və ortaq session store mümkündürsə, load balancer-də yığılan bu gizli state-dən qurtulmaq sistemi xeyli sadələşdirir.&lt;/p&gt;

&lt;p&gt;SSL termination tətbiq serverlərindən kriptoqrafik işi götürür və HTTP səviyyəli routing imkanı açır. &lt;a href="https://www.rfc-editor.org/rfc/rfc7098.html" rel="noopener noreferrer"&gt;RFC 7098&lt;/a&gt; SSL reverse proxy-nin session boyu SSL, TCP və bəzən HTTP state-i saxladığını qeyd edir. State artır. Bunun əvəzində sertifikatın yenilənməsi, private key-in qorunması, cipher siyasəti və ACE-dən backend-ə gedən trafikin şifrələnib-şifrələnməməsi cihazın məsuliyyətinə çevrilir; load balancer trafik paylayan qutu olmaqdan çıxıb təhlükəsizlik sərhədinə çevrilir.&lt;/p&gt;

&lt;h2&gt;
  
  
  Əsas risk artıq cihazın yaşıdır
&lt;/h2&gt;

&lt;p&gt;Cisco ACE üçün köhnəlmə nəzəri risk deyil. ACE ailəsi artıq retired və dəstəksiz platformadır. Üstəlik, &lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2016-6399" rel="noopener noreferrer"&gt;CVE-2016-6399 qeydində&lt;/a&gt; ACE30 və ACE 4700 cihazlarında xüsusi SSL və ya TLS paketləri ilə uzaqdan denial-of-service yaradıb cihazı reload etməyin mümkün olduğu göstərilir. Bu ciddi fərqdir. İşlək cihaz dəstəklənən cihaz demək deyil.&lt;/p&gt;

&lt;p&gt;Legacy ACE saxlanılırsa, inventarda yalnız model və IP ünvanı olmamalıdır. Software versiyası, konfiqurasiya backup-ı, lisenziyalar, sertifikatlar, ehtiyat cihaz, failover nəticəsi və cihazı əvəz edə biləcək platformaya keçid planı birlikdə sənədləşdirilməlidir. Xüsusilə SSL termination aktivdirsə, dəstəklənməyən proqram təminatını internet trafikinin qarşısında saxlamaq təhlükəsizlik riskini böyüdür.&lt;/p&gt;

&lt;p&gt;Miqrasiyada ən asan hissə virtual IP yaratmaqdır. Çətin hissə illər ərzində yığılmış sticky qaydalarını, probe davranışını, timeout-ları, NAT siyasətini, SSL sertifikatlarını və qeyri-adi routing asılılıqlarını tapmaqdır. Mövcud konfiqurasiya obyekt-obyekt deyil, xidmət-xidmət xəritələnəndə boşluqlar daha tez görünür: hansı client gəlir, hansı qayda işə düşür, hansı backend seçilir, cavab hansı yolla qayıdır və nasazlıq zamanı aktiv bağlantı necə bağlanır.&lt;/p&gt;

&lt;p&gt;Cisco ACE-ni idarə etmək bu gün daha çox legacy sistem mühəndisliyidir. Cihazın predictor və probe imkanları hələ də load balancing məntiqini öyrətmək üçün yaxşı modeldir, amma production qərarında əsas ölçü funksiyaların sayı yox, təhlükəsiz yenilənmə və bərpa imkanının qalıb-qalmamasıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Tez-tez verilən suallar
&lt;/h2&gt;

&lt;p&gt;&lt;strong&gt;Cisco ACE hələ production mühitində istifadə oluna bilərmi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Texniki olaraq işlək cihaz mövcud trafiki daşıya bilər, lakin platforma rəsmi dəstəkdən çıxıb. Təhlükəsizlik yeniləmələri, ehtiyat hissə, vendor dəstəyi və bərpa müddəti nəzərə alınmadan onu production-da saxlamaq ciddi əməliyyat riskidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Round-robin ilə least connections arasında fərq nədir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Round-robin yeni bağlantıları serverlər arasında növbə ilə paylayır. Least connections isə mövcud açıq bağlantı sayını nəzərə alaraq daha az bağlantısı olan serverə üstünlük verir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Stickiness nə vaxt lazımdır?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tətbiq session vəziyyətini yalnız lokal yaddaşda saxlayırsa, eyni istifadəçinin ardıcıl bağlantılarını eyni backend-ə yönəltmək lazım gələ bilər. Stateless tətbiqdə isə stickiness çox vaxt yükün qeyri-bərabər paylanmasına səbəb olur.&lt;/p&gt;

&lt;h2&gt;
  
  
  Mənbələr
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://nvd.nist.gov/vuln/detail/CVE-2016-6399" rel="noopener noreferrer"&gt;NVD CVE-2016-6399 Detail&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7230.html" rel="noopener noreferrer"&gt;RFC 7230 HTTP Message Syntax and Routing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7098.html" rel="noopener noreferrer"&gt;RFC 7098 Using the IPv6 Flow Label for Load Balancing&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;&lt;em&gt;Bu yazı süni intellekt köməyi ilə yazılıb, faktları və mənbələri yoxlanılıb.&lt;/em&gt;&lt;/p&gt;

</description>
      <category>devops</category>
      <category>cicd</category>
    </item>
  </channel>
</rss>
