<?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>Yüksək trafikli AI inference servisi necə qurulur?</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:37:08 +0000</pubDate>
      <link>https://dev.to/camal1o/yuksk-trafikli-ai-inference-servisi-nec-qurulur-3clm</link>
      <guid>https://dev.to/camal1o/yuksk-trafikli-ai-inference-servisi-nec-qurulur-3clm</guid>
      <description>&lt;p&gt;AI modeli lokal testdə 200 millisaniyəyə cavab verir. Production-a çıxandan sonra isə eyni endpoint bəzən iki saniyə gözlədir, GPU boş görünür, queue böyüyür və autoscaler gec ayılır. Tanış mənzərədir. Modelin sürətli olması, onu təqdim edən sistemin də sürətli olması demək deyil.&lt;/p&gt;

&lt;p&gt;Yüksək trafikli AI inference servisində əsas sual budur: dəyişkən yükü qəbul edib GPU-nu səmərəli işlədərkən latency-ni necə nəzarətdə saxlamaq olar? Cavab bir komponentdə deyil. Trafikin girişindən model cavabına qədər bütün yol eyni latency büdcəsini bölüşür.&lt;/p&gt;

&lt;h2&gt;
  
  
  Request yolu əvvəlcədən məhdudlaşdırılmalıdır
&lt;/h2&gt;

&lt;p&gt;İstifadəçi request-i əvvəlcə gateway-ə çatır. Burada autentifikasiya, request ölçüsü, rate limit və ümumi deadline yoxlanır. Sonra sorğu modelə uyğun queue-ya düşür, scheduler uyğun request-ləri batch edir, inference instance hesablamanı aparır, nəticə post-processing mərhələsindən keçib geri qayıdır.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/yuksek-trafikli-ai-inference-servisi" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Bu axında API gateway həddən artıq böyük input-u və icazəsiz trafiki erkən kəsir. Model queue ani sıçrayışı yumşaldır, amma sonsuz anbar deyil. Batch scheduler eyni modelə gedən uyğun sorğuları qruplaşdırır. Deadline bitibsə, artıq istifadəçiyə faydası qalmayan işi GPU-ya ötürmək əvəzinə timeout cavabı qaytarılır.&lt;/p&gt;

&lt;p&gt;Queue üçün həm maksimum uzunluq, həm də maksimum gözləmə vaxtı təyin edilməlidir, çünki əks halda servis overload zamanı cavab vermək əvəzinə köhnə request-ləri yığır. GPU yüz faiz işləyə bilər, lakin istifadəçilər çoxdan cavab gözləməkdən vaz keçiblər.&lt;/p&gt;

&lt;p&gt;Bu, faydalı iş deyil.&lt;/p&gt;

&lt;h2&gt;
  
  
  Batching throughput verir, pulsuz deyil
&lt;/h2&gt;

&lt;p&gt;GPU bir neçə input-u birlikdə emal edəndə çox vaxt resursdan daha yaxşı istifadə edir. &lt;a href="https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/tutorials/Conceptual_Guide/Part_2-improving_resource_utilization/README.html" rel="noopener noreferrer"&gt;NVIDIA Triton-un dynamic batching mexanizmi&lt;/a&gt; ayrı inference request-lərini serverdə bir batch daxilində birləşdirir. Burada iki tənzimləmə bir-birinə qarşı işləyir: böyük batch throughput-u yüksəldə bilər, batch-in dolmasını gözləmək isə latency-yə əlavə olunur.&lt;/p&gt;

&lt;p&gt;Ona görə &lt;code&gt;max_batch_size&lt;/code&gt; rəqəmi GPU yaddaşına sığan ən böyük ədəd kimi seçilmir. Real input ölçüləri ilə sınaq aparılır, sonra p95 və p99 latency büdcəsi aşılmadan ən yaxşı throughput verən nöqtə götürülür. Mətn generasiyasında prompt uzunluqlarının kəskin fərqlənməsi işi daha da qəlizləşdirir. Qısa request uzun request-in arxasında ilişə bilər; uzunluğa görə ayrı queue-lar və ya scheduler siyasəti burada kömək edir.&lt;/p&gt;

&lt;p&gt;Batching stateless modellərdə daha rahatdır. Request-lər arasında vəziyyət saxlayan modeldə ardıcıllıq və eyni instance-a yönləndirmə ayrıca qorunmalıdır; hər modeli eyni queue və batch konfiqurasiyasına salmaq rahat görünsə də workload-lar eyni davranmır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Autoscaling hansı siqnalı görməlidir?
&lt;/h2&gt;

&lt;p&gt;CPU əsasında autoscaling klassik web tətbiqində məntiqli başlanğıcdır. GPU inference servisində isə CPU aşağı olduğu halda queue sürətlə böyüyə bilər. &lt;a href="https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/" rel="noopener noreferrer"&gt;Kubernetes Horizontal Pod Autoscaler&lt;/a&gt; resource metric-lərlə yanaşı custom və external metric-lərdən də istifadə edə bilir. Bu imkan queue dərinliyi, queue-da gözləmə müddəti və aktiv inference sayı kimi siqnalları scaling qərarına qatmağa şərait yaradır.&lt;/p&gt;

&lt;p&gt;Tək GPU utilization da yetərli deyil. Yüz faiz utilization yaxşı batching nəticəsi ola bilər; eyni göstərici boğulmuş sistem də göstərə bilər. Fərqi queue açır. Queue yaşı və p99 latency artırsa, əlavə capacity lazımdır, queue boş və latency normaldırsa yüksək utilization öz-özlüyündə qəza siqnalı sayılmır.&lt;/p&gt;

&lt;p&gt;Yeni replica saniyələr içində hazır olmaya bilər. Yol uzundur: image çəkilir, model faylı endirilir, çəkilər CPU və ya GPU yaddaşına yerləşdirilir, bəzən warmup inference işləyir. Scaling siyasəti bu başlanğıc vaxtından daha gec reaksiya verirsə, pik yük artıq queue-nu doldurmuş olacaq; minimum isti capacity və proqnozlaşdırılan trafik üçün əvvəlcədən scale-out buna görə vacibdir.&lt;/p&gt;

&lt;p&gt;Model yüklənərkən health check-ləri ayırmaq lazımdır. &lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/probes/" rel="noopener noreferrer"&gt;Kubernetes startup probe&lt;/a&gt; tətbiqin başlanğıcını tamamlamasına vaxt verir; readiness uğursuz olduqda Pod-a trafik göndərilmir, liveness isə bərpa olunmayan vəziyyətdə restart qərarı üçündür. Eyni endpoint-i üçünə də bağlamaq modelin gec yükləndiyi anda boş yerə restart dövrəsi yarada bilər.&lt;/p&gt;

&lt;h2&gt;
  
  
  Overload nasazlığa çevrilməzdən əvvəl kəsilməlidir
&lt;/h2&gt;

&lt;p&gt;Hər downstream çağırışın deadline-ı ümumi request deadline-dan qısa olmalıdır. Vaxt məhduddur. Pre-processing 300 ms, inference 900 ms, post-processing 200 ms gözləyirsə, gateway-də 1 saniyəlik timeout qoyub möcüzə gözləmək alınmayacaq. Büdcə komponentlər arasında açıq bölünür və qalan vaxt request-lə birlikdə ötürülür.&lt;/p&gt;

&lt;p&gt;Retry yalnız keçici xəta və idempotent əməliyyat üçün düşünülməlidir. Kor retry təhlükəlidir. Eyni ağır inference request-i bir neçə client eyni anda dərhal təkrar göndərsə, kiçik nasazlıq ikinci trafik dalğasına çevrilir. &lt;a href="https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/" rel="noopener noreferrer"&gt;AWS-in backoff və jitter izahında&lt;/a&gt; təsadüfi gecikmənin rəqabət aparan retry-ları zamana yaydığı göstərilir; limitli cəhd sayı, exponential backoff və jitter birlikdə işləyir, deadline bitəndən sonra isə retry dayandırılır.&lt;/p&gt;

&lt;p&gt;Backpressure də məhz burada işə düşür. Queue limiti dolanda gateway yeni işi &lt;code&gt;429&lt;/code&gt; və ya &lt;code&gt;503&lt;/code&gt; ilə rədd edir, client isə &lt;code&gt;Retry-After&lt;/code&gt; siyasətinə uyğun davrana bilər. Bu cavab xoş deyil, amma on saniyə susub sonra timeout verməkdən daha dürüstdür. Prioritetli workload varsa, məsələn interaktiv sorğu və gecəlik batch işi, onların queue və capacity payları ayrılır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Model versiyası da production vahididir
&lt;/h2&gt;

&lt;p&gt;Model çəkisi, tokenizer, preprocessing kodu və runtime konfiqurasiyası birlikdə versiyalanmalıdır. Paket bütövdür. Tək model faylını dəyişmək kifayət etmir; tokenizer uyğunsuzluğu servis işlək görünərkən səssiz keyfiyyət itkisi yarada bilər. Deployment əvvəlcə kiçik trafik payına açılır, texniki metriklərlə yanaşı modelə aid göstəricilər də müqayisə edilir.&lt;/p&gt;

&lt;p&gt;Burada rollback yalnız container image-i geri çevirmək deyil. Köhnə model artefaktı və onun bütün asılılıqları əlçatan qalmalıdır. Stateful söhbət axınında model versiyasını request ortasında dəyişmək mümkün deyilsə, session routing qaydası da rollout planına daxil edilir.&lt;/p&gt;

&lt;p&gt;Müşahidə ediləbilənlik request sərhədində qalmamalıdır. Gateway, queue, scheduler, inference və post-processing eyni trace daxilində görünəndə vaxtın harada itməsi aydınlaşır. &lt;a href="https://opentelemetry.io/docs/concepts/context-propagation/" rel="noopener noreferrer"&gt;OpenTelemetry context propagation&lt;/a&gt; trace məlumatını proses və şəbəkə sərhədlərindən keçirərək çağırışları əlaqələndirir. Trace üzərində model adı və versiyası, batch ölçüsü, queue gözləməsi, input ölçüsü və nəticə statusu faydalıdır; prompt, şəxsi məlumat və credential isə telemetry-yə yazılmamalıdır.&lt;/p&gt;

&lt;p&gt;İzlənəcək əsas paylanmalar end-to-end p50/p95/p99 latency, queue wait, inference müddəti və batch ölçüsüdür. Bunlara throughput, reject sayı, timeout, retry, GPU yaddaşı və model yükləmə vaxtı əlavə olunur. Orta rəqəm aldadır. İstifadəçilərin ən çox şikayət etdiyi quyruq gecikməsini çox rahat gizlədir.&lt;/p&gt;

&lt;p&gt;Capacity testi də tək sabit request sürəti ilə aparılmır. Ani burst, müxtəlif input uzunluğu, model rollout-u, bir GPU-nun itməsi və downstream yavaşıması ayrıca sınanır. Məqsəd sistemin maksimum neçə request qəbul etdiyini tapmaq deyil; latency büdcəsini qoruyaraq hansı yükə qədər faydalı cavab verdiyini görməkdir.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;AI inference servisi hansı metriklə miqyaslanmalıdır?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Tək CPU istifadəsi kifayət etmir. Queue dərinliyi, gözləmə vaxtı, p95/p99 latency, aktiv sorğu sayı və GPU utilization birlikdə izlənməlidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Dynamic batching həmişə latency-ni azaldır?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Xeyr. Batching throughput-u artıra bilər, lakin batch toplamaq üçün verilən gecikmə request latency-sinə əlavə olunur. Parametrlər latency büdcəsinə görə ölçülməlidir.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Model yüklənərkən readiness niyə vacibdir?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Proses işlək görünsə də model çəkiləri hələ yaddaşa yüklənməmiş ola bilər. Readiness uğurlu olmayana qədər instance-a trafik göndərilməməlidir.&lt;/p&gt;

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

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://docs.nvidia.com/deeplearning/triton-inference-server/user-guide/docs/tutorials/Conceptual_Guide/Part_2-improving_resource_utilization/README.html" rel="noopener noreferrer"&gt;NVIDIA Triton Inference Server — Dynamic Batching&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/autoscaling/horizontal-pod-autoscale/" rel="noopener noreferrer"&gt;Kubernetes — Horizontal Pod Autoscaling&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://kubernetes.io/docs/concepts/workloads/pods/probes/" rel="noopener noreferrer"&gt;Kubernetes — Liveness, Readiness, and Startup Probes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://opentelemetry.io/docs/concepts/context-propagation/" rel="noopener noreferrer"&gt;OpenTelemetry — Context propagation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://aws.amazon.com/blogs/architecture/exponential-backoff-and-jitter/" rel="noopener noreferrer"&gt;AWS Architecture Blog — Exponential Backoff And Jitter&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>ai</category>
      <category>machinelearning</category>
    </item>
    <item>
      <title>Zoosk-da real-time rabitə arxitekturası</title>
      <dc:creator>Jamal Ali</dc:creator>
      <pubDate>Sun, 04 Oct 2026 17:36:44 +0000</pubDate>
      <link>https://dev.to/camal1o/zoosk-da-real-time-rabit-arxitekturasi-4pak</link>
      <guid>https://dev.to/camal1o/zoosk-da-real-time-rabit-arxitekturasi-4pak</guid>
      <description>&lt;p&gt;Bir dating tətbiqində chat mesajının yarım saniyə gecikməsi xırda texniki detal kimi görünə bilər. Amma qarşı tərəfin online olduğunu göstərib mesajı gec çatdıranda məhsul istifadəçiyə yalan danışmış olur. Zoosk-un real-time rabitə arxitekturasında əsas məsələ buna görə təkcə sürət deyildi. Presence, bildiriş və şəxsi mesaj eyni anda həm canlı, həm tutarlı, həm də bərpa oluna bilən olmalı idi.&lt;/p&gt;

&lt;p&gt;Texnologiyaların bir qismi köhnədir. Verdikləri dizayn sualları isə hələ təzədir: uzunömürlü bağlantılar necə bölünür, tez dəyişən online state axtarışa necə qoşulur, server sıradan çıxanda istifadəçi hara gedir və offline mesaj hansı qatın məsuliyyətidir?&lt;/p&gt;

&lt;h2&gt;
  
  
  Üç fərqli axını bir protokola yığmaq
&lt;/h2&gt;

&lt;p&gt;Zoosk real-time rabitəni üç istifadəçi davranışı ətrafında qurmuşdu. Presence istifadəçinin online, away, offline və ya görünməz vəziyyətini daşıyırdı. Notification profil baxışı və uyğunlaşma kimi hadisəni client-ə çatdırırdı. Messaging isə iki istifadəçi arasındakı söhbəti aparır, məzmunu sonradan tarixçə kimi göstərmək üçün verilənlər bazasında saxlayırdı.&lt;/p&gt;

&lt;p&gt;Bu axınların hamısı XMPP-dən keçirdi. &lt;a href="https://www.rfc-editor.org/rfc/rfc6120.txt" rel="noopener noreferrer"&gt;XMPP Core&lt;/a&gt; uzunömürlü TCP bağlantısı üzərində persistent XML stream yaradır; tərəflər bağlantı açıq qaldığı müddətdə məlumatı dərhal itələyə bilir. Protokolun əsas vahidi stanza-dır və üç növü var: &lt;code&gt;message&lt;/code&gt;, &lt;code&gt;presence&lt;/code&gt; və &lt;code&gt;iq&lt;/code&gt;. Zoosk üçün bu bölgü əlverişli idi, çünki chat və online vəziyyət eyni transport qatını paylaşsa da, semantik olaraq qarışmırdı.&lt;/p&gt;

&lt;p&gt;Mobil və desktop client-lər serverə TCP socket ilə bağlanırdı. Həmin dövrün brauzer imkanları səbəbindən veb client-lər BOSH, yəni uzunömürlü rabitəni ardıcıl HTTP request-ləri ilə təqlid edən mexanizmdən istifadə edirdi. Bu gün XMPP-ni brauzerə çıxarmaq üçün &lt;a href="https://www.rfc-editor.org/rfc/rfc7395.txt" rel="noopener noreferrer"&gt;RFC 7395&lt;/a&gt; ilə standartlaşdırılmış WebSocket subprotocol-u daha təbii seçimdir: handshake zamanı &lt;code&gt;xmpp&lt;/code&gt; subprotocol-u razılaşdırılır, sonra &lt;a href="https://camalali.com/bloq/aol-xmpp-miqyaslama-problemi" rel="noopener noreferrer"&gt;XMPP&lt;/a&gt; frame-ləri WebSocket bağlantısından keçir.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/zoosk-real-time-rabite-arxitekturasi" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;İstifadəçi veb, mobil və ya desktop client-dən gəlirdi. Load balancer normal halda bağlantıları primary Tigase node-a ötürürdü, health check uğursuz olanda isə trafik secondary node-a yönəlirdi. XMPP routing online istifadəçiyə stanza-nı canlı çatdırır, offline istifadəçi üçün mesaj saxlancına müraciət edirdi. &lt;a href="https://docs.tigase.net/en/latest/Tigase_Administration/Using_Tigase/_using_tigase.html" rel="noopener noreferrer"&gt;Tigase sənədlərində&lt;/a&gt; offline mesajların istifadəçi yenidən daxil olduqda çatdırılması ayrıca server funksiyası kimi göstərilir.&lt;/p&gt;

&lt;p&gt;Burada incə məqam var. Failover yeni bağlantını sağlam node-a göndərə bilər, amma mövcud TCP bağlantısını sehrli şəkildə o biri maşına köçürmür; client qırılmanı hiss etməli, yenidən qoşulmalı və sessiyanın itirdiyi məlumat üçün bərpa mexanizminə arxalanmalıdır. Yüksək availability ilə fasiləsiz sessiya eyni vəd deyil.&lt;/p&gt;

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

&lt;h2&gt;
  
  
  Presence məlumatını axtarışdan ayırmaq
&lt;/h2&gt;

&lt;p&gt;Online state sakit məlumat deyil. İstifadəçi tətbiqi açır, arxa plana keçir, bağlantısını itirir, qayıdır; bir hesab bir neçə cihazdan da qoşula bilər. Bu dəyişikliklərin hər birini əsas axtarış indeksinə yazmaq indeks replikasiyasını və sorğu davranışını lazımsız yerə bir-birinə bağlayardı.&lt;/p&gt;

&lt;p&gt;Zoosk bunu ayrıca Online State Manager ilə həll etmişdi. Chat node-ları presence keçidini xüsusi XMPP packet-i kimi bu komponentə göndərirdi. Online State Manager isə Solr serverlərinin yanındakı &lt;code&gt;ehcache&lt;/code&gt; nüsxələrini yeniləyirdi. Axtarış sorğusu gələndə sabit profil nəticələri cache-dəki cari online state ilə birləşdirilir, sonra filtr və ya sıralama tətbiq olunurdu.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Diaqram&lt;/strong&gt; — &lt;a href="https://camalali.com/bloq/zoosk-real-time-rabite-arxitekturasi" rel="noopener noreferrer"&gt;orijinal məqalədə&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Məlumat iki mənbədən gəlir: client bağlantısı və periodik profil indeksi. Client bağlantısı Tigase chat node-da presence keçidi yaradır, Online State Manager bu keçidi hər Solr node-unun yanındakı &lt;code&gt;ehcache&lt;/code&gt;-ə yayır. Periodik profil indeksi ilə tez dəyişən state yalnız axtarış sorğusu zamanı görüşür, beləcə profil sənədinin indekslənmə tempi online göstəricinin təzələnmə tempini məhdudlaşdırmır.&lt;/p&gt;

&lt;p&gt;Əvəzində eventual consistency yaranır. Gecikmə mümkündür. Cache yenilənməsi vaxtında çatmasa, axtarış nəticəsi istifadəçini qısa müddət online göstərə bilər. Dating məhsulunda bu, adətən qəbul edilən güzəştdir; chat mesajının itməsi isə deyil. Deməli, hər iki məlumat eyni real-time interfeysdə görünsə də, onlara eyni consistency tələbi qoymaq düzgün olmazdı.&lt;/p&gt;

&lt;p&gt;Görünməz status ayrıca məhsul qaydasını ortaya çıxarır. İstifadəçi serverə bağlı qala və başqalarının presence məlumatını görə bilər, lakin özü onların siyahısında online görünməz. Buna görə connection state ilə public presence bir boolean sahəyə sıxışdırılmamalıdır. Biri infrastruktur faktıdır, digəri istifadəçiyə göstərilən vəziyyət və məxfilik qərarıdır.&lt;/p&gt;

&lt;h2&gt;
  
  
  Bildiriş yolu və davamlılıq sərhədi
&lt;/h2&gt;

&lt;p&gt;Real-time hadisələrin hamısı chat serverində yaranmırdı. Məsələn, profilə baxış veb tətbiqdə baş verirdi. Tətbiq asinxron job başladır, job Tigase-ə custom payload-lı XMPP packet-i göndərir, Tigase də onu istifadəçinin aktiv client-inə yönləndirirdi. Client həmin packet-dən toast göstərmək və ya unread badge-i yeniləmək üçün istifadə edirdi.&lt;/p&gt;

&lt;p&gt;Bu yanaşmada tətbiqin biznes hadisəsi ilə client bağlantısı arasında aydın sərhəd yaranır: veb tətbiq hansı socket-in hansı node-da olduğunu bilmir, routing işi RTC qatında qalır. Rahat bölgüdür. Lakin custom packet schema-sı versiyalanmasa, server və müxtəlif client buraxılışları arasında uyğunluq tez başağrısına çevrilə bilər. Payload-a versiya əlavə etmək, naməlum sahələri tolerant oxumaq və eyni hadisənin təkrar gəlməsini təhlükəsizliklə qarşılamaq belə sistemdə vacibdir.&lt;/p&gt;

&lt;p&gt;Mesajın canlı çatdırılması onun davamlı saxlanması ilə eyni əməliyyat deyil. İstifadəçi online-dırsa packet dərhal client-ə gedə bilər, amma tarixçə üçün database yazısı ayrıca uğursuz ola bilər. Güclü məhsul tələbi varsa, server mesaj ID-si, deduplication və aydın delivery state saxlamalıdır. Yoxsa istifadəçi mesajı ekranda bir an görər, başqa cihazdan daxil olanda isə tapa bilməz.&lt;/p&gt;

&lt;h2&gt;
  
  
  Miqyaslama rəqəmdən çox bölünmə qərarıdır
&lt;/h2&gt;

&lt;p&gt;Arxitektura çoxlu primary-secondary cütlüyünə bölünmüşdü və hər cütlük ayrıca bağlantı qrupu daşıyırdı. Bu, scale-out üçün rahat sərhəddir: yeni shard əlavə etmək olur, bir node-un yaddaş və socket yükü bütün sistemi sürükləmir, nasazlığın təsir sahəsi də həmin qrupla məhdudlaşır. Müasir Tigase cluster node-larını vahid platforma kimi birləşdirməyi, yükü yaymağı və redundancy yaratmağı dəstəkləyir.&lt;/p&gt;

&lt;p&gt;Amma shard seçiminin cavabı ayrıca verilməlidir. İstifadəçi hər qoşulmada təsadüfi cluster-ə düşürsə, session routing və istifadəçilərarası mesajlaşma node-lar arasında əlavə koordinasiya tələb edir. Sabit hash bölgüsü koordinasiyanı azalda bilər, əvəzində node əlavə ediləndə paylanmanı dəyişir. Directory service daha çevikdir, özü kritik asılılığa çevrilir. Burada pulsuz seçim yoxdur.&lt;/p&gt;

&lt;p&gt;Monitorinq də yalnız CPU və yaddaş qrafiki deyil. Socket qəbul edilir, amma presence stanza-sı keçmirsə sistem texniki baxımdan ayaqdadır, məhsul baxımından yox. Buna görə synthetic client-in login, presence və mesaj axınını başdan sona yoxlaması; queue ölçüsü, mesaj sayı, emal müddəti və aktiv bağlantı sayının ayrıca izlənməsi məntiqlidir. Qırılmanın istifadəçiyə necə göründüyünü ölçməyən dashboard çox rahat, amma natamam təsəllidir.&lt;/p&gt;

&lt;p&gt;Zoosk nümunəsinin əsas dərsi XMPP seçimi deyil. Güclü tərəf connection state, public presence, davamlı mesaj, axtarış indeksi və tez dəyişən cache məlumatını ayrı məsuliyyətlər kimi görməkdir. Onların yenilənmə tempi və nasazlıq nəticəsi fərqlidir. Hamısını “real-time data” adlı bir qutuya yığanda sistem sadələşmir, yalnız sərhədlər gizlənir.&lt;/p&gt;

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

&lt;p&gt;&lt;strong&gt;Zoosk real-time rabitə üçün hansı protokoldan istifadə edirdi?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Sistem XMPP üzərində qurulmuşdu; mobil və desktop client-lər uzunömürlü TCP bağlantısı, brauzer client-ləri isə HTTP üzərindən BOSH istifadə edirdi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Presence niyə birbaşa axtarış indeksində saxlanmırdı?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Online vəziyyət tez-tez dəyişdiyi üçün onu periodik yenilənən əsas indeksdən ayırmaq daha münasib idi. Sorğu zamanı axtarış nəticəsi ayrıca online-state cache-i ilə birləşdirilirdi.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;İstifadəçi offline olanda mesaj nə olurdu?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Mesaj və bəzi bildirişlər server tərəfində saxlanılır, istifadəçi yenidən qoşulanda çatdırılırdı. Chat tarixçəsi üçün mesaj məzmunu ayrıca verilənlər bazasında qalırdı.&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/rfc6120.txt" rel="noopener noreferrer"&gt;RFC 6120: Extensible Messaging and Presence Protocol (XMPP): Core&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://docs.tigase.net/en/latest/Tigase_Administration/Using_Tigase/_using_tigase.html" rel="noopener noreferrer"&gt;Tigase Server Documentation&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://www.rfc-editor.org/rfc/rfc7395.txt" rel="noopener noreferrer"&gt;RFC 7395: An Extensible Messaging and Presence Protocol (XMPP) Subprotocol for WebSocket&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>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>
