{"id":45378,"date":"2026-10-25T21:06:37","date_gmt":"2026-10-25T18:06:37","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/"},"modified":"2026-10-25T21:07:14","modified_gmt":"2026-10-25T18:07:14","slug":"fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/","title":{"rendered":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?"},"content":{"rendered":"<h2>FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?<\/h2>\n<p>Modern web uygulamalar\u0131nda, e\u015fzamans\u0131z (asynchronous) g\u00f6revlerin y\u00f6netimi kritik bir \u00f6neme sahiptir. Kullan\u0131c\u0131 deneyimini kesintiye u\u011fratmadan, arka planda karma\u015f\u0131k veya zaman al\u0131c\u0131 i\u015flemleri y\u00fcr\u00fctmek, uygulamalar\u0131n yan\u0131t h\u0131z\u0131n\u0131 ve genel performans\u0131n\u0131 do\u011frudan etkiler. Peki, farkl\u0131 \u00f6nceliklere sahip g\u00f6revleri nas\u0131l etkili bir \u015fekilde s\u0131ralayabilir ve i\u015fleyebiliriz? Bu makalede, y\u00fcksek performansl\u0131 ve \u00f6l\u00e7eklenebilir bir \u00f6ncelikli g\u00f6rev zamanlay\u0131c\u0131 sistemini FastAPI, Redis ve C++ kullanarak ad\u0131m ad\u0131m nas\u0131l in\u015fa edece\u011fimizi ke\u015ffedece\u011fiz. Bu sistem, e-ticaret sipari\u015f i\u015fleme, IoT veri analizi veya finansal i\u015flemler gibi senaryolarda kritik \u00f6neme sahip g\u00f6revlerin daima zaman\u0131nda ve do\u011fru s\u0131rayla i\u015flenmesini sa\u011flayacak.<\/p>\n<h2>Temel Kavramlar: Neden \u00d6ncelikli G\u00f6rev Y\u00f6netimi Gereklidir?<\/h2>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn dinamik yaz\u0131l\u0131m ortamlar\u0131nda, uygulamalar genellikle birbirinden farkl\u0131 \u00f6zelliklere ve aciliyet derecelerine sahip \u00e7ok say\u0131da g\u00f6revi ayn\u0131 anda y\u00fcr\u00fctmek zorundad\u0131r. \u00d6rne\u011fin, bir e-ticaret platformunda yeni bir sipari\u015fin i\u015flenmesi, bir kullan\u0131c\u0131n\u0131n \u015fifresini s\u0131f\u0131rlama talebi veya sistemin arka planda yapt\u0131\u011f\u0131 periyodik raporlama gibi g\u00f6revler bulunabilir. Bu g\u00f6revlerin hepsi ayn\u0131 \u00f6ncelikte de\u011fildir ve ayn\u0131 h\u0131zda i\u015flenmeleri gerekmez. \u0130\u015fte tam da bu noktada, \u00f6ncelikli g\u00f6rev y\u00f6netimi devreye girer. \u00d6ncelikli bir g\u00f6rev zamanlay\u0131c\u0131, sistemin kaynaklar\u0131n\u0131 en kritik g\u00f6revlere tahsis etmesini sa\u011flayarak, uygulaman\u0131n genel yan\u0131t verme s\u00fcresini (responsiveness) ve verimlili\u011fini art\u0131r\u0131r.<\/p>\n<p>Bir g\u00f6rev kuyru\u011fu (task queue) d\u00fc\u015f\u00fcn\u00fcn; bu, i\u015flenmeyi bekleyen g\u00f6revlerin bir listesidir. Geleneksel kuyruklarda g\u00f6revler genellikle &#8220;ilk giren ilk \u00e7\u0131kar&#8221; (FIFO &#8211; First-In, First-Out) prensibiyle i\u015flenir. Ancak \u00f6ncelikli bir kuyrukta, her g\u00f6reve bir \u00f6ncelik atan\u0131r ve en y\u00fcksek \u00f6ncelikli g\u00f6rev, kuyrukta ne zaman yer alm\u0131\u015f olursa olsun, di\u011ferlerinden \u00f6nce i\u015flenir. Bu yakla\u015f\u0131m, \u00f6zellikle s\u0131n\u0131rl\u0131 i\u015flem g\u00fcc\u00fcne sahip sistemlerde veya belirli g\u00f6revlerin acil yan\u0131t gerektirdi\u011fi durumlarda hayati \u00f6nem ta\u015f\u0131r. \u00d6rne\u011fin, bir bankac\u0131l\u0131k uygulamas\u0131nda, b\u00fcy\u00fck bir para transferi i\u015flemi ile k\u00fc\u00e7\u00fck bir bakiye sorgulama i\u015flemi ayn\u0131 \u00f6ncelikte olmamal\u0131d\u0131r. B\u00fcy\u00fck transfer, g\u00fcvenlik ve do\u011frulama ad\u0131mlar\u0131 nedeniyle daha uzun s\u00fcrebilir ve daha y\u00fcksek \u00f6ncelik gerektirebilir.<\/p>\n<p>Bu makalede in\u015fa edece\u011fimiz sistemin temel bile\u015fenleri \u015funlard\u0131r:<\/p>\n<ul>\n<li><strong>FastAPI:<\/strong> G\u00f6revleri sisteme kabul etmek i\u00e7in h\u0131zl\u0131 ve modern bir web \u00e7er\u00e7evesi (framework). Kullan\u0131c\u0131 aray\u00fczleri veya di\u011fer servisler, HTTP istekleri arac\u0131l\u0131\u011f\u0131yla g\u00f6revleri FastAPI uygulamas\u0131na g\u00f6nderecek.<\/li>\n<li><strong>Redis:<\/strong> Y\u00fcksek performansl\u0131 bir anahtar-de\u011fer (key-value) veri deposu olarak g\u00f6rev kuyru\u011fumuzu y\u00f6netecek. Redis&#8217;in Sorted Set (s\u0131ral\u0131 k\u00fcme) veri yap\u0131s\u0131, g\u00f6revleri \u00f6nceliklerine g\u00f6re s\u0131ralamak i\u00e7in idealdir.<\/li>\n<li><strong>C++:<\/strong> Redis&#8217;ten g\u00f6revleri \u00e7ekip i\u015fleyecek y\u00fcksek performansl\u0131 i\u015fleyici (worker) uygulamas\u0131 i\u00e7in kullan\u0131lacak. C++, d\u00fc\u015f\u00fck seviyeli sistem kaynaklar\u0131na eri\u015fim ve ola\u011fan\u00fcst\u00fc performans sunarak, kritik g\u00f6revlerin milisaniyeler i\u00e7inde i\u015flenmesini m\u00fcmk\u00fcn k\u0131lar.<\/li>\n<\/ul>\n<p>Bu \u00fc\u00e7 teknolojinin birle\u015fimi, hem geli\u015ftirici dostu bir API katman\u0131 hem de sa\u011flam ve h\u0131zl\u0131 bir arka plan i\u015fleme mekanizmas\u0131 sunarak, karma\u015f\u0131k g\u00f6rev y\u00f6netimi ihtiya\u00e7lar\u0131n\u0131 kar\u015f\u0131layacakt\u0131r. Sistemimizin temel amac\u0131, gelen g\u00f6revlerin \u00f6nceliklerini dikkate alarak, en kritik olanlar\u0131 en k\u0131sa s\u00fcrede i\u015flemek ve b\u00f6ylece uygulaman\u0131n genel verimlili\u011fini ve g\u00fcvenilirli\u011fini art\u0131rmakt\u0131r. Bu mimari, da\u011f\u0131t\u0131k sistemlerdeki y\u00fck dengeleme ve hata tolerans\u0131 gibi konularda da esneklik sa\u011flayarak, modern bulut tabanl\u0131 uygulamalar i\u00e7in ideal bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<h2>FastAPI ile G\u00f6rev Kuyru\u011funa Nas\u0131l Ekleme Yap\u0131l\u0131r?<\/h2>\n<p>G\u00f6rev zamanlay\u0131c\u0131 sistemimizin ilk ad\u0131m\u0131, d\u0131\u015f d\u00fcnyadan gelen g\u00f6rev taleplerini kabul edecek bir aray\u00fcz olu\u015fturmakt\u0131r. Bu aray\u00fcz i\u00e7in FastAPI&#8217;yi kullanaca\u011f\u0131z. FastAPI, modern Python tabanl\u0131, y\u00fcksek performansl\u0131 bir web \u00e7er\u00e7evesidir ve API geli\u015ftirmeyi son derece kolayla\u015ft\u0131r\u0131r. Otomatik dok\u00fcmantasyon (Swagger UI) ve veri do\u011frulama (Pydantic ile) gibi \u00f6zellikleriyle h\u0131zl\u0131 geli\u015ftirmeye olanak tan\u0131r.<\/p>\n<h3>FastAPI Uygulamas\u0131n\u0131n Kurulumu ve Temel Yap\u0131s\u0131<\/h3>\n<p>\u00d6ncelikle, FastAPI ve gerekli k\u00fct\u00fcphaneleri kurmam\u0131z gerekiyor. Python ortam\u0131n\u0131zda a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak ba\u015flayabiliriz:<\/p>\n<div class=\"code-container\">\n<pre><code>pip install fastapi uvicorn redis pydantic<\/code><\/pre>\n<\/div>\n<p><code>uvicorn<\/code>, FastAPI uygulamas\u0131n\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in kullan\u0131lan ASGI sunucusudur. <code>redis<\/code> k\u00fct\u00fcphanesi, Python uygulamas\u0131ndan Redis ile etkile\u015fim kurmam\u0131z\u0131 sa\u011flar. <code>pydantic<\/code> ise veri modellerimizi tan\u0131mlamak i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>\u015eimdi, g\u00f6revleri kabul edecek bir FastAPI uygulamas\u0131 olu\u015ftural\u0131m. G\u00f6revlerimizin bir yap\u0131s\u0131 olmal\u0131; \u00f6rne\u011fin, bir g\u00f6rev kimli\u011fi (ID), bir a\u00e7\u0131klama ve en \u00f6nemlisi bir \u00f6ncelik de\u011feri i\u00e7ermelidir. \u00d6ncelik de\u011feri, say\u0131sal bir de\u011fer olacak ve daha d\u00fc\u015f\u00fck say\u0131lar daha y\u00fcksek \u00f6nceli\u011fi ifade edecek (\u00f6rne\u011fin, 1 en y\u00fcksek \u00f6ncelik, 10 en d\u00fc\u015f\u00fck).<\/p>\n<h3>G\u00f6rev Modeli ve API U\u00e7 Noktas\u0131 Tan\u0131mlama<\/h3>\n<p>A\u015fa\u011f\u0131daki kod blo\u011fu, FastAPI uygulamas\u0131n\u0131 ve g\u00f6rev modelini nas\u0131l tan\u0131mlayaca\u011f\u0131m\u0131z\u0131 g\u00f6sterir:<\/p>\n<div class=\"code-container\">\n<pre><code>\nfrom fastapi import FastAPI, HTTPException\nfrom pydantic import BaseModel, Field\nimport redis\nimport json\nimport time\n\napp = FastAPI(title=\"\u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 API\")\n\n# Redis ba\u011flant\u0131s\u0131\n# Ger\u00e7ek bir uygulamada bu bilgileri ortam de\u011fi\u015fkenlerinden almak daha g\u00fcvenlidir.\nredis_client = redis.Redis(host='localhost', port=6379, db=0)\n\nclass Task(BaseModel):\n    task_id: str = Field(..., description=\"G\u00f6revin benzersiz kimli\u011fi\")\n    description: str = Field(..., description=\"G\u00f6revin k\u0131sa a\u00e7\u0131klamas\u0131\")\n    priority: int = Field(..., ge=1, le=10, description=\"G\u00f6revin \u00f6ncelik seviyesi (1: En y\u00fcksek, 10: En d\u00fc\u015f\u00fck)\")\n    payload: dict = Field(default_factory=dict, description=\"G\u00f6revin i\u015flenmesi i\u00e7in gerekli ek veriler\")\n\n@app.post(\"\/tasks\/\", status_code=202)\nasync def create_task(task: Task):\n    \"\"\"\n    Yeni bir g\u00f6revi \u00f6ncelikli kuyru\u011fa ekler.\n    \"\"\"\n    try:\n        # G\u00f6revin benzersiz bir anahtar\u0131 olmal\u0131, Redis'te Sorted Set'e eklerken kullan\u0131lacak.\n        # Zaman damgas\u0131 (timestamp) ekleyerek ayn\u0131 \u00f6ncelikteki g\u00f6revler aras\u0131nda FIFO sa\u011flamak\n        # veya basit\u00e7e benzersiz bir ID kullanmak m\u00fcmk\u00fcnd\u00fcr.\n        # Burada, \u00f6nceli\u011fi eksi olarak depoluyoruz \u00e7\u00fcnk\u00fc Redis Sorted Set'ler varsay\u0131lan olarak artan s\u0131rada s\u0131ralar.\n        # Biz en d\u00fc\u015f\u00fck \u00f6ncelik de\u011ferine (yani en y\u00fcksek \u00f6nceli\u011fe) sahip g\u00f6revlerin en ba\u015fta olmas\u0131n\u0131 istiyoruz.\n        # Ayn\u0131 \u00f6ncelikteki g\u00f6revler i\u00e7in, eklenme zaman\u0131n\u0131 ikinci bir s\u0131ralama kriteri olarak kullanabiliriz.\n        # Bu \u00f6rnekte, \u00f6nceli\u011fi skor olarak kullanaca\u011f\u0131z.\n        \n        # G\u00f6revi JSON format\u0131na \u00e7eviriyoruz\n        task_data = task.dict()\n        task_data[\"created_at\"] = time.time() # Eklenme zaman\u0131n\u0131 da kaydedelim\n\n        # Redis'e ekleme. Sorted Set'te skor olarak \u00f6nceli\u011fi kullan\u0131yoruz.\n        # D\u00fc\u015f\u00fck say\u0131 = Y\u00fcksek \u00f6ncelik\n        # Redis Sorted Set'ler varsay\u0131lan olarak artan s\u0131rada s\u0131ralar.\n        # Biz en d\u00fc\u015f\u00fck \u00f6ncelik de\u011ferine (yani en y\u00fcksek \u00f6nceli\u011fe) sahip g\u00f6revlerin en ba\u015fta olmas\u0131n\u0131 istiyoruz.\n        # Bu y\u00fczden priority de\u011ferini do\u011frudan skor olarak kullanabiliriz.\n        # E\u011fer en y\u00fcksek \u00f6ncelik 10, en d\u00fc\u015f\u00fck 1 olsayd\u0131, 11 - priority \u015feklinde bir skor kullan\u0131rd\u0131k.\n        # Mevcut durumda 1 en y\u00fcksek, 10 en d\u00fc\u015f\u00fck oldu\u011fu i\u00e7in do\u011frudan kullanabiliriz.\n        redis_client.zadd(\"priority_queue\", {json.dumps(task_data): task.priority})\n        \n        return {\"message\": \"G\u00f6rev ba\u015far\u0131yla kuyru\u011fa eklendi\", \"task_id\": task.task_id}\n    except Exception as e:\n        raise HTTPException(status_code=500, detail=f\"G\u00f6rev eklenirken bir hata olu\u015ftu: {str(e)}\")\n\n# Uygulamay\u0131 \u00e7al\u0131\u015ft\u0131rmak i\u00e7in terminalde:\n# uvicorn main:app --reload\n<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda, <code>Task<\/code> ad\u0131nda bir Pydantic modeli tan\u0131mlad\u0131k. Bu model, her g\u00f6revin sahip olmas\u0131 gereken alanlar\u0131 (<code>task_id<\/code>, <code>description<\/code>, <code>priority<\/code>, <code>payload<\/code>) ve bu alanlar\u0131n veri tiplerini ve k\u0131s\u0131tlamalar\u0131n\u0131 belirtir. <code>@app.post(\"\/tasks\/\")<\/code> dekorat\u00f6r\u00fc ile yeni g\u00f6revleri almak i\u00e7in bir POST u\u00e7 noktas\u0131 olu\u015fturduk. Bu u\u00e7 nokta, gelen g\u00f6revi Redis&#8217;in &#8220;priority_queue&#8221; adl\u0131 Sorted Set&#8217;ine ekler. Redis&#8217;in Sorted Set yap\u0131s\u0131, elemanlar\u0131 bir &#8220;skor&#8221;a g\u00f6re s\u0131ralad\u0131\u011f\u0131 i\u00e7in, g\u00f6revin \u00f6ncelik de\u011ferini bu skor olarak kullan\u0131r\u0131z. B\u00f6ylece Redis, g\u00f6revleri otomatik olarak \u00f6ncelik s\u0131ras\u0131na g\u00f6re d\u00fczenler.<\/p>\n<p>Bu FastAPI uygulamas\u0131, g\u00f6revleri al\u0131p Redis&#8217;e aktarma g\u00f6revini \u00fcstlenir. Kullan\u0131c\u0131lar veya di\u011fer mikroservisler, basit HTTP POST istekleriyle g\u00f6revlerini bu API&#8217;ye iletebilirler. FastAPI&#8217;nin asenkron (async\/await) yap\u0131s\u0131 sayesinde, gelen istekler h\u0131zl\u0131 bir \u015fekilde i\u015flenir ve Redis&#8217;e yazma i\u015flemi arka planda ger\u00e7ekle\u015firken API yan\u0131t verebilir. Bu, uygulaman\u0131n y\u00fcksek trafik alt\u0131nda bile yan\u0131t verme h\u0131z\u0131n\u0131 korumas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h2>Redis: \u00d6ncelikli G\u00f6rev Kuyru\u011fu Yap\u0131s\u0131 Nas\u0131l Tasarlan\u0131r?<\/h2>\n<p>G\u00f6rev zamanlay\u0131c\u0131 sistemimizin kalbinde, g\u00f6revleri \u00f6nceliklerine g\u00f6re depolayan ve i\u015fleyicilerin (workers) kolayca eri\u015febilece\u011fi bir veri yap\u0131s\u0131 yer al\u0131r. Bu rol i\u00e7in Redis, ola\u011fan\u00fcst\u00fc performans\u0131 ve esnek veri yap\u0131lar\u0131yla m\u00fckemmel bir se\u00e7enektir. \u00d6zellikle Redis&#8217;in Sorted Set (s\u0131ral\u0131 k\u00fcme) veri yap\u0131s\u0131, \u00f6ncelikli kuyruklar olu\u015fturmak i\u00e7in idealdir.<\/p>\n<h3>Redis Sorted Set ile \u00d6ncelikli Kuyruk Mant\u0131\u011f\u0131<\/h3>\n<p>Redis Sorted Set, her \u00fcyenin benzersiz bir string oldu\u011fu ve ili\u015fkili bir skor (kayan nokta say\u0131s\u0131) ile birlikte depoland\u0131\u011f\u0131 bir koleksiyondur. \u00dcyeler, bu skorlara g\u00f6re s\u0131ralan\u0131r. Bu \u00f6zellik, g\u00f6revlerimizi \u00f6ncelik skorlar\u0131na g\u00f6re s\u0131ralamak i\u00e7in tam da ihtiyac\u0131m\u0131z olan \u015feydir. Daha d\u00fc\u015f\u00fck skorlu \u00fcyeler, daha y\u00fcksek skorlu \u00fcyelerden \u00f6nce gelir.<\/p>\n<p>Bizim senaryomuzda, g\u00f6revin \u00f6ncelik de\u011feri (\u00f6rne\u011fin, 1 en y\u00fcksek \u00f6ncelik, 10 en d\u00fc\u015f\u00fck) do\u011frudan Redis Sorted Set&#8217;in skoru olarak kullan\u0131lacakt\u0131r. Bu durumda, skor 1 olan g\u00f6revler, skor 2 olanlardan \u00f6nce, skor 2 olanlar da skor 3 olanlardan \u00f6nce i\u015flenecektir. Ayn\u0131 \u00f6ncelik skoruna sahip g\u00f6revler i\u00e7in Redis, varsay\u0131lan olarak eklenme s\u0131ras\u0131na (lexicographical order) g\u00f6re s\u0131ralama yapar. Ancak, daha deterministik (belirleyici) bir davran\u0131\u015f i\u00e7in, skor de\u011ferini olu\u015ftururken eklenme zaman damgas\u0131 (timestamp) gibi ikincil bir kriteri de dahil edebiliriz. \u00d6rne\u011fin, <code>priority * 1000000000 + timestamp<\/code> gibi bir form\u00fcl kullanarak, ayn\u0131 \u00f6ncelikteki g\u00f6revlerin eklenme s\u0131ras\u0131na g\u00f6re i\u015flenmesini sa\u011flayabiliriz.<\/p>\n<h3>G\u00f6revlerin Redis&#8217;e Eklenmesi ve \u00c7ekilmesi<\/h3>\n<p>FastAPI uygulamas\u0131nda g\u00f6rd\u00fc\u011f\u00fcm\u00fcz gibi, g\u00f6revler <code>json.dumps(task_data)<\/code> ile JSON string&#8217;ine d\u00f6n\u00fc\u015ft\u00fcr\u00fcl\u00fcr ve <code>redis_client.zadd(\"priority_queue\", {json.dumps(task_data): task.priority})<\/code> komutuyla Redis&#8217;e eklenir. Burada <code>\"priority_queue\"<\/code>, Sorted Set&#8217;imizin anahtar\u0131d\u0131r.<\/p>\n<p>G\u00f6rev i\u015fleyicimiz (C++ worker), kuyruktaki en y\u00fcksek \u00f6ncelikli g\u00f6revleri \u00e7ekmek i\u00e7in Redis&#8217;in <code>ZPOPMAX<\/code> veya <code>ZRANGE<\/code> \/ <code>ZREM<\/code> komutlar\u0131n\u0131 kullanacakt\u0131r. <code>ZPOPMAX<\/code> (Redis 5.0 ve sonras\u0131), bir Sorted Set&#8217;ten en y\u00fcksek skorlu \u00fcyeyi (yani bizim durumumuzda en d\u00fc\u015f\u00fck \u00f6ncelik skoruna sahip olan\u0131) atomik (atomic) olarak \u00e7\u0131kar\u0131r ve d\u00f6nd\u00fcr\u00fcr. Bu, birden fazla i\u015fleyicinin ayn\u0131 anda g\u00f6rev \u00e7ekmeye \u00e7al\u0131\u015ft\u0131\u011f\u0131 durumlarda yar\u0131\u015f ko\u015fullar\u0131n\u0131 (race conditions) \u00f6nler.<\/p>\n<div class=\"code-container\">\n<pre><code>\n\/\/ Redis'ten en y\u00fcksek \u00f6ncelikli g\u00f6revi \u00e7ekme (C++ worker taraf\u0131ndan kullan\u0131lacak mant\u0131k)\n\/\/ Pseudo-code (s\u00f6zde kod) olarak d\u00fc\u015f\u00fcn\u00fcn\n\n\/\/ Redis komutu: ZPOPMAX key count\n\/\/ count: Ka\u00e7 eleman \u00e7ekilece\u011fi (genellikle 1)\n\/\/ ZPOPMAX en y\u00fcksek skorlu eleman\u0131 \u00e7\u0131kar\u0131r. Bizim \u00f6nceli\u011fimizde d\u00fc\u015f\u00fck skor y\u00fcksek \u00f6ncelik oldu\u011fu i\u00e7in\n\/\/ ZPOPMIN kullanmak daha do\u011fru olacakt\u0131r. Ancak Redis 6'dan itibaren ZPOPMIN mevcut.\n\/\/ E\u011fer eski bir Redis s\u00fcr\u00fcm\u00fc kullan\u0131yorsak veya ZPOPMIN yoksa, ZRANGE ile en d\u00fc\u015f\u00fck skorluyu al\u0131p ZREM ile sileriz.\n\n\/\/ Redis 6+ i\u00e7in:\n\/\/ task_data, priority = redis_client.zpopmin(\"priority_queue\", 1)\n\n\/\/ Eski Redis s\u00fcr\u00fcmleri veya daha genel bir yakla\u015f\u0131m i\u00e7in:\n\/\/ 1. En d\u00fc\u015f\u00fck skorlu (en y\u00fcksek \u00f6ncelikli) g\u00f6revi al\n\/\/ tasks = redis_client.zrange(\"priority_queue\", 0, 0, withscores=True)\n\/\/ if tasks:\n\/\/     task_member, task_priority = tasks[0]\n\/\/     # 2. G\u00f6revi kuyruktan atomik olarak sil\n\/\/     # Watch\/Multi\/Exec veya LUA scriptleri ile atomik silme sa\u011flanabilir.\n\/\/     # Alternatif olarak, her g\u00f6reve benzersiz bir ID verip, bu ID'yi ZRANGE ile al\u0131p ZREM ile silmek daha g\u00fcvenlidir.\n\/\/     # \u00d6rne\u011fin, ZRANGEbyscore ile belirli bir \u00f6ncelik aral\u0131\u011f\u0131ndaki g\u00f6revleri al\u0131p, ard\u0131ndan ZREM ile silebiliriz.\n\/\/     # Basit bir ZREM \u00f6rne\u011fi:\n\/\/     # redis_client.zrem(\"priority_queue\", task_member)\n\/\/     # return task_member, task_priority\n\/\/ else:\n\/\/     # Kuyruk bo\u015f\n\/\/     pass\n<\/code><\/pre>\n<\/div>\n<p><code>ZPOPMAX<\/code> (veya <code>ZPOPMIN<\/code>) komutunun atomik yap\u0131s\u0131, da\u011f\u0131t\u0131k i\u015fleme ortamlar\u0131nda birden fazla i\u015fleyicinin ayn\u0131 g\u00f6revi iki kez \u00e7ekmesini engeller. Bu, sistemin tutarl\u0131l\u0131\u011f\u0131 i\u00e7in kritik bir \u00f6zelliktir. E\u011fer <code>ZPOPMAX<\/code>\/<code>ZPOPMIN<\/code> mevcut de\u011filse, <code>ZRANGE<\/code> ile en \u00fcstteki g\u00f6revi okuyup, ard\u0131ndan bir LUA beti\u011fi (script) veya Redis Transaction (i\u015flem) kullanarak g\u00f6revi atomik olarak silmek daha g\u00fcvenli bir yakla\u015f\u0131md\u0131r. LUA beti\u011fi, birden fazla Redis komutunu tek bir atomik i\u015flem olarak \u00e7al\u0131\u015ft\u0131rmam\u0131z\u0131 sa\u011flar.<\/p>\n<h3>Redis Persistent (Kal\u0131c\u0131) Depolama ve Y\u00fcksek Eri\u015filebilirlik<\/h3>\n<p>Redis, varsay\u0131lan olarak bellekte \u00e7al\u0131\u015fsa da, verilerin disk \u00fczerinde kal\u0131c\u0131 olmas\u0131n\u0131 sa\u011flayan mekanizmalara sahiptir (RDB snapshotting ve AOF logging). Bu, Redis sunucusunun \u00e7\u00f6kmesi durumunda bile g\u00f6rev kuyru\u011fundaki verilerin kaybolmamas\u0131n\u0131 garanti eder. Ayr\u0131ca, Redis Sentinel veya Redis Cluster gibi \u00f6zellikler, y\u00fcksek eri\u015filebilirlik (high availability) ve \u00f6l\u00e7eklenebilirlik sa\u011flayarak, Redis&#8217;i \u00fcretim ortamlar\u0131 i\u00e7in sa\u011flam bir se\u00e7im haline getirir.<\/p>\n<p>Bu yap\u0131 sayesinde, g\u00f6revlerin Redis&#8217;e g\u00fcvenli bir \u015fekilde eklenmesi ve \u00f6nceliklerine g\u00f6re d\u00fczenlenmesi sa\u011flan\u0131r. Bir sonraki ad\u0131mda, C++ ile bu g\u00f6revleri Redis&#8217;ten nas\u0131l \u00e7ekip i\u015fleyece\u011fimizi inceleyece\u011fiz.<\/p>\n<h2>C++ ile Y\u00fcksek Performansl\u0131 G\u00f6rev \u0130\u015fleyici Nas\u0131l Geli\u015ftirilir?<\/h2>\n<p>G\u00f6rev zamanlay\u0131c\u0131 sistemimizin en kritik bile\u015fenlerinden biri, Redis kuyru\u011fundaki g\u00f6revleri \u00e7ekip ger\u00e7ek i\u015fleme mant\u0131\u011f\u0131n\u0131 y\u00fcr\u00fcten i\u015fleyicidir (worker). Bu i\u015fleyici i\u00e7in C++ kullanmam\u0131z\u0131n temel nedeni, C++&#8217;\u0131n sundu\u011fu benzersiz performans, d\u00fc\u015f\u00fck seviyeli sistem kaynaklar\u0131na eri\u015fim ve kaynak verimlili\u011fidir. \u00d6zellikle milisaniye d\u00fczeyinde yan\u0131t s\u00fcrelerinin \u00f6nemli oldu\u011fu veya yo\u011fun i\u015flem g\u00fcc\u00fc gerektiren g\u00f6revlerin bulundu\u011fu senaryolarda C++ ideal bir tercihtir.<\/p>\n<h3>Neden C++?<\/h3>\n<ul>\n<li><strong>Performans:<\/strong> C++, derlenmi\u015f (compiled) bir dil oldu\u011fu i\u00e7in Python gibi yorumlanm\u0131\u015f (interpreted) dillere g\u00f6re \u00e7ok daha h\u0131zl\u0131 \u00e7al\u0131\u015f\u0131r. Bu, \u00f6zellikle CPU yo\u011fun g\u00f6revlerde belirgin bir avantaj sa\u011flar.<\/li>\n<li><strong>Kaynak Verimlili\u011fi:<\/strong> Bellek ve CPU kullan\u0131m\u0131 \u00fczerinde do\u011frudan kontrol imkan\u0131 sunar. Bu, b\u00fcy\u00fck \u00f6l\u00e7ekli sistemlerde veya k\u0131s\u0131tl\u0131 kaynaklara sahip ortamlarda (\u00f6rne\u011fin g\u00f6m\u00fcl\u00fc sistemler) kritik \u00f6neme sahiptir.<\/li>\n<li><strong>D\u00fc\u015f\u00fck Gecikme:<\/strong> \u0130\u015fletim sistemi ve donan\u0131mla daha yak\u0131n etkile\u015fim kurarak, g\u00f6revlerin daha d\u00fc\u015f\u00fck gecikmeyle i\u015flenmesine olanak tan\u0131r.<\/li>\n<li><strong>Mevcut K\u00fct\u00fcphaneler:<\/strong> Redis ile etkile\u015fim kurmak i\u00e7in <code>hiredis<\/code> gibi sa\u011flam ve optimize edilmi\u015f C k\u00fct\u00fcphaneleri mevcuttur.<\/li>\n<\/ul>\n<h3>C++ \u0130\u015fleyici Uygulamas\u0131n\u0131n Temel Yap\u0131s\u0131<\/h3>\n<p>C++ i\u015fleyicimiz, s\u00fcrekli olarak Redis&#8217;e ba\u011flanacak, \u00f6ncelikli kuyruktan g\u00f6revleri \u00e7ekecek, bu g\u00f6revleri ayr\u0131\u015ft\u0131racak (parse edecek) ve belirlenen i\u015fleme mant\u0131\u011f\u0131n\u0131 uygulayacakt\u0131r. Bir hata durumunda veya g\u00f6rev ba\u015far\u0131yla tamamland\u0131\u011f\u0131nda uygun \u015fekilde yan\u0131t verecektir.<\/p>\n<h4>Redis ile Ba\u011flant\u0131 Kurma (<code>hiredis<\/code> kullanarak)<\/h4>\n<p><code>hiredis<\/code>, C dilinde yaz\u0131lm\u0131\u015f hafif bir Redis istemcisidir ve C++ projelerinde kolayca kullan\u0131labilir. \u0130lk ad\u0131m, <code>hiredis<\/code> k\u00fct\u00fcphanesini sisteminize kurmakt\u0131r. Genellikle Linux da\u011f\u0131t\u0131mlar\u0131nda paket y\u00f6neticileri arac\u0131l\u0131\u011f\u0131yla (\u00f6rn. <code>sudo apt-get install libhiredis-dev<\/code>) veya kaynak koddan derlenerek kurulabilir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n#include <iostream>\n#include <string>\n#include <thread>\n#include <chrono>\n#include <hiredis\/hiredis.h> \/\/ hiredis k\u00fct\u00fcphanesi\n\n\/\/ Basit bir JSON ayr\u0131\u015ft\u0131r\u0131c\u0131 k\u00fct\u00fcphanesi (\u00f6rne\u011fin nlohmann\/json) kullan\u0131labilir.\n\/\/ Bu \u00f6rnekte string i\u015flemleri ile basit bir ayr\u0131\u015ft\u0131rma yapaca\u011f\u0131z.\n\/\/ Ger\u00e7ek bir uygulamada nlohmann\/json gibi robust bir k\u00fct\u00fcphane \u015fiddetle tavsiye edilir.\n\nstd::string get_json_value(const std::string& json_str, const std::string& key) {\n    std::string search_key = \"\\\"\" + key + \"\\\":\";\n    size_t pos = json_str.find(search_key);\n    if (pos == std::string::npos) {\n        return \"\"; \/\/ Anahtar bulunamad\u0131\n    }\n    pos += search_key.length();\n    \n    \/\/ De\u011ferin ba\u015flang\u0131c\u0131n\u0131 bul\n    while (pos < json_str.length() &#038;&#038; (json_str[pos] == ' ' || json_str[pos] == '\"')) {\n        pos++;\n    }\n\n    size_t end_pos = pos;\n    while (end_pos < json_str.length() &#038;&#038; json_str[end_pos] != ',' &#038;&#038; json_str[end_pos] != '}') {\n        end_pos++;\n    }\n    \n    std::string value = json_str.substr(pos, end_pos - pos);\n    \/\/ E\u011fer de\u011fer t\u0131rnak i\u00e7inde ise t\u0131rnaklar\u0131 kald\u0131r\n    if (!value.empty() &#038;&#038; value.front() == '\"' &#038;&#038; value.back() == '\"') {\n        return value.substr(1, value.length() - 2);\n    }\n    return value;\n}\n\n\nvoid worker_thread(int worker_id) {\n    redisContext *c = redisConnect(\"127.0.0.1\", 6379);\n    if (c == NULL || c->err) {\n        if (c) {\n            std::cerr << \"Redis ba\u011flant\u0131 hatas\u0131: \" << c->errstr << std::endl;\n            redisFree(c);\n        } else {\n            std::cerr << \"Redis ba\u011flant\u0131 kurulamad\u0131.\" << std::endl;\n        }\n        return;\n    }\n    std::cout << \"Worker \" << worker_id << \" Redis'e ba\u011fland\u0131.\" << std::endl;\n\n    while (true) {\n        redisReply *reply;\n        \/\/ ZPOPMIN: Sorted Set'ten en d\u00fc\u015f\u00fck skorlu eleman\u0131 (yani en y\u00fcksek \u00f6ncelikli g\u00f6revi) atomik olarak \u00e7eker.\n        \/\/ Redis 6.0 ve \u00fczeri i\u00e7in ge\u00e7erlidir. Daha eski s\u00fcr\u00fcmlerde ZRANGE\/ZREM kombinasyonu kullan\u0131lmal\u0131.\n        reply = (redisReply *)redisCommand(c, \"ZPOPMIN priority_queue 1\");\n\n        if (reply == NULL) {\n            std::cerr << \"Redis komut hatas\u0131 veya ba\u011flant\u0131 kesildi.\" << std::endl;\n            redisFree(c);\n            c = redisConnect(\"127.0.0.1\", 6379); \/\/ Yeniden ba\u011flanmay\u0131 dene\n            std::this_thread::sleep_for(std::chrono::seconds(5));\n            continue;\n        }\n\n        if (reply->type == REDIS_REPLY_ARRAY && reply->elements > 0) {\n            \/\/ ZPOPMIN \u00e7\u0131kt\u0131s\u0131: [member1, score1, member2, score2, ...]\n            \/\/ Biz 1 eleman \u00e7ekti\u011fimiz i\u00e7in reply->elements 2 olacak (member ve score)\n            std::string task_json = reply->element[0]->str;\n            double priority_score = std::stod(reply->element[1]->str);\n\n            \/\/ G\u00f6rev verilerini ayr\u0131\u015ft\u0131r (\u00f6rne\u011fin JSON ayr\u0131\u015ft\u0131rma)\n            \/\/ Ger\u00e7ek bir uygulamada nlohmann\/json gibi bir k\u00fct\u00fcphane kullan\u0131lmal\u0131.\n            std::string task_id = get_json_value(task_json, \"task_id\");\n            std::string description = get_json_value(task_json, \"description\");\n            \n            std::cout << \"Worker \" << worker_id << \" g\u00f6revi \u00e7ekti: ID=\" << task_id \n                      << \", A\u00e7\u0131klama='\" << description << \"', \u00d6ncelik=\" << priority_score << std::endl;\n\n            \/\/ Burada g\u00f6revin ger\u00e7ek i\u015fleme mant\u0131\u011f\u0131 yer alacak.\n            \/\/ \u00d6rne\u011fin, bir veritaban\u0131 i\u015flemi, harici bir API \u00e7a\u011fr\u0131s\u0131, dosya yazma vb.\n            std::this_thread::sleep_for(std::chrono::milliseconds(500)); \/\/ G\u00f6rev i\u015fleme sim\u00fclasyonu\n\n            std::cout << \"Worker \" << worker_id << \" g\u00f6revi tamamlad\u0131: ID=\" << task_id << std::endl;\n\n        } else {\n            \/\/ Kuyruk bo\u015f, biraz bekle ve tekrar dene\n            std::cout << \"Worker \" << worker_id << \" kuyruk bo\u015f, bekleniyor...\" << std::endl;\n            std::this_thread::sleep_for(std::chrono::seconds(1));\n        }\n        freeReplyObject(reply); \/\/ Belle\u011fi serbest b\u0131rak\n    }\n\n    redisFree(c); \/\/ Ba\u011flant\u0131y\u0131 kapat\n}\n\nint main() {\n    \/\/ Birden fazla worker thread'i ba\u015flatabiliriz\n    const int num_workers = 3;\n    std::vector<std::thread> workers;\n    for (int i = 0; i < num_workers; ++i) {\n        workers.emplace_back(worker_thread, i + 1);\n    }\n\n    for (auto&#038; w : workers) {\n        w.join(); \/\/ Thread'lerin bitmesini bekle (bu \u00f6rnekte sonsuz d\u00f6ng\u00fcde \u00e7al\u0131\u015facaklar)\n    }\n\n    return 0;\n}\n<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki C++ kodu, basit bir g\u00f6rev i\u015fleyici (worker) \u00f6rne\u011fini g\u00f6stermektedir:<\/p>\n<ul>\n<li><code>redisConnect<\/code> ile Redis sunucusuna ba\u011flan\u0131r.<\/li>\n<li>Sonsuz bir d\u00f6ng\u00fc i\u00e7inde, <code>ZPOPMIN priority_queue 1<\/code> komutunu kullanarak Redis'ten en y\u00fcksek \u00f6ncelikli g\u00f6revi (en d\u00fc\u015f\u00fck skorlu) \u00e7eker. Bu komut, g\u00f6revi atomik olarak kuyruktan kald\u0131r\u0131r.<\/li>\n<li>Gelen g\u00f6revin JSON verilerini ayr\u0131\u015ft\u0131r\u0131r (ger\u00e7ek bir uygulamada <code>nlohmann\/json<\/code> gibi bir k\u00fct\u00fcphane kullanmak \u00e7ok daha g\u00fcvenli ve pratik olacakt\u0131r).<\/li>\n<li>G\u00f6rev i\u015fleme mant\u0131\u011f\u0131n\u0131 sim\u00fcle etmek i\u00e7in k\u0131sa bir s\u00fcre bekler.<\/li>\n<li>G\u00f6rev tamamland\u0131\u011f\u0131nda konsola bilgi basar.<\/li>\n<li>Kuyruk bo\u015fsa, belirli bir s\u00fcre bekleyip tekrar dener.<\/li>\n<li>Birden fazla worker thread'i ba\u015flatarak e\u015fzamanl\u0131 g\u00f6rev i\u015flemeyi g\u00f6sterir.<\/li>\n<\/ul>\n<p>Bu C++ i\u015fleyicisi, Redis'ten g\u00f6revleri verimli bir \u015fekilde \u00e7ekerek, belirlenen i\u015f mant\u0131\u011f\u0131n\u0131 y\u00fcksek performansla y\u00fcr\u00fct\u00fcr. Hata y\u00f6netimi ve ba\u011flant\u0131 kesintileri durumunda yeniden ba\u011flanma mekanizmalar\u0131, sa\u011flam bir \u00fcretim uygulamas\u0131 i\u00e7in hayati \u00f6neme sahiptir. Ayr\u0131ca, g\u00f6revlerin i\u015flenmesi s\u0131ras\u0131nda olu\u015fabilecek istisnalar\u0131n (exceptions) do\u011fru bir \u015fekilde ele al\u0131nmas\u0131 ve ba\u015far\u0131s\u0131z g\u00f6revlerin bir \"\u00f6l\u00fc mektup kuyru\u011funa\" (dead-letter queue) y\u00f6nlendirilmesi gibi ileri d\u00fczey konular da d\u00fc\u015f\u00fcn\u00fclmelidir.<\/p>\n<h2>Sistem Entegrasyonu ve \u00d6l\u00e7eklenebilirlik: Bile\u015fenler Nas\u0131l Birle\u015ftirilir?<\/h2>\n<p>\u015eimdiye kadar FastAPI ile g\u00f6revleri kuyru\u011fa eklemeyi, Redis ile \u00f6ncelikli bir kuyruk yap\u0131s\u0131 olu\u015fturmay\u0131 ve C++ ile bu g\u00f6revleri i\u015flemeyi \u00f6\u011frendik. Bu \u00fc\u00e7 bile\u015feni bir araya getirerek sa\u011flam, \u00f6l\u00e7eklenebilir ve y\u00fcksek performansl\u0131 bir g\u00f6rev zamanlay\u0131c\u0131 sistemi in\u015fa edebiliriz. Bu b\u00f6l\u00fcmde, sistemin genel mimarisini, bile\u015fenlerin nas\u0131l entegre edilece\u011fini ve \u00f6l\u00e7eklenebilirlik stratejilerini inceleyece\u011fiz.<\/p>\n<h3>Sistemin Genel Mimarisi<\/h3>\n<p>Sistemimiz \u00fc\u00e7 ana katmandan olu\u015fur:<\/p>\n<ol>\n<li><strong>API Katman\u0131 (FastAPI):<\/strong> Kullan\u0131c\u0131lar\u0131n veya di\u011fer servislerin g\u00f6revleri sisteme g\u00f6ndermesi i\u00e7in bir HTTP aray\u00fcz\u00fc sa\u011flar. Gelen g\u00f6revleri do\u011frular ve Redis kuyru\u011funa ekler.<\/li>\n<li><strong>Kuyruk Katman\u0131 (Redis):<\/strong> G\u00f6revleri \u00f6nceliklerine g\u00f6re depolayan ve i\u015fleyiciler i\u00e7in merkezi bir havuz g\u00f6revi g\u00f6ren y\u00fcksek performansl\u0131 bir mesaj kuyru\u011fu olarak i\u015flev g\u00f6r\u00fcr.<\/li>\n<li><strong>\u0130\u015fleme Katman\u0131 (C++ Workers):<\/strong> Redis kuyru\u011fundan g\u00f6revleri \u00e7eker, i\u015fleme mant\u0131\u011f\u0131n\u0131 uygular ve sonu\u00e7lar\u0131 i\u015fler.<\/li>\n<\/ol>\n<p>Bu mimari, her katman\u0131n kendi sorumlulu\u011funa odaklanmas\u0131n\u0131 sa\u011flar ve bile\u015fenlerin ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenmesine olanak tan\u0131r. \u00d6rne\u011fin, API trafi\u011fi artarsa sadece FastAPI \u00f6rneklerini art\u0131rabiliriz; g\u00f6rev i\u015fleme y\u00fck\u00fc artarsa C++ worker say\u0131s\u0131n\u0131 art\u0131rabiliriz.<\/p>\n<h3>Bile\u015fenlerin Entegrasyonu<\/h3>\n<p>Entegrasyon s\u00fcreci olduk\u00e7a basittir:<\/p>\n<ul>\n<li><strong>FastAPI ve Redis:<\/strong> FastAPI uygulamas\u0131, Redis istemci k\u00fct\u00fcphanesini (<code>redis-py<\/code>) kullanarak Redis sunucusuna ba\u011flan\u0131r ve <code>ZADD<\/code> komutuyla g\u00f6revleri <code>priority_queue<\/code> Sorted Set'ine ekler. Redis sunucusunun eri\u015filebilir bir adreste (\u00f6rne\u011fin, <code>localhost:6379<\/code>) \u00e7al\u0131\u015f\u0131yor olmas\u0131 gerekir.<\/li>\n<li><strong>C++ Workers ve Redis:<\/strong> C++ worker uygulamalar\u0131, <code>hiredis<\/code> k\u00fct\u00fcphanesini kullanarak ayn\u0131 Redis sunucusuna ba\u011flan\u0131r ve <code>ZPOPMIN<\/code> (veya alternatif komutlar) ile g\u00f6revleri <code>priority_queue<\/code>'dan \u00e7eker. Her worker, kendi ba\u011flant\u0131s\u0131n\u0131 y\u00f6netir ve g\u00f6revleri ba\u011f\u0131ms\u0131z olarak i\u015fler.<\/li>\n<\/ul>\n<p>Bu entegrasyon, Redis'in merkezi bir mesaj arac\u0131 olarak hareket etmesi sayesinde kolayca ger\u00e7ekle\u015ftirilir. T\u00fcm bile\u015fenler, Redis \u00fczerinden ileti\u015fim kurar ve birbirlerinin varl\u0131\u011f\u0131ndan haberdar olmak zorunda kalmazlar.<\/p>\n<h3>\u00d6l\u00e7eklenebilirlik Stratejileri<\/h3>\n<p>Sistemimizin farkl\u0131 katmanlar\u0131n\u0131 ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklendirebiliriz:<\/p>\n<ul>\n<li><strong>FastAPI \u00d6l\u00e7eklemesi:<\/strong>\n<ul>\n<li><strong>Yatay \u00d6l\u00e7ekleme:<\/strong> Birden fazla FastAPI \u00f6rne\u011fini bir y\u00fck dengeleyici (load balancer) arkas\u0131nda \u00e7al\u0131\u015ft\u0131rarak API katman\u0131n\u0131n kapasitesini art\u0131rabiliriz. Gelen HTTP istekleri, bu \u00f6rnekler aras\u0131nda da\u011f\u0131t\u0131l\u0131r.<\/li>\n<li><strong>Asenkron \u0130\u015fleme:<\/strong> FastAPI'nin asenkron yap\u0131s\u0131 sayesinde, I\/O yo\u011fun i\u015flemlerde (Redis'e yazma gibi) bile y\u00fcksek e\u015fzamanl\u0131l\u0131k (concurrency) sa\u011flan\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li><strong>Redis \u00d6l\u00e7eklemesi:<\/strong>\n<ul>\n<li><strong>Redis Sentinel:<\/strong> Y\u00fcksek eri\u015filebilirlik i\u00e7in Redis Sentinel kullanarak ana (master) Redis sunucusunun \u00e7\u00f6kmesi durumunda otomatik failover (yedeklemeye ge\u00e7i\u015f) sa\u011flayabiliriz.<\/li>\n<li><strong>Redis Cluster:<\/strong> \u00c7ok b\u00fcy\u00fck veri k\u00fcmeleri veya \u00e7ok y\u00fcksek okuma\/yazma y\u00fckleri i\u00e7in Redis Cluster kullanarak verileri birden fazla Redis d\u00fc\u011f\u00fcm\u00fcne da\u011f\u0131tabilir ve yatay \u00f6l\u00e7ekleme sa\u011flayabiliriz.<\/li>\n<li><strong>Replikasyon (Replication):<\/strong> Okuma y\u00fck\u00fcn\u00fc da\u011f\u0131tmak i\u00e7in Redis master-replica (ana-kopya) mimarisi kullan\u0131labilir. Worker'lar, g\u00f6revleri \u00e7ekmek i\u00e7in replica'lara ba\u011flanabilir (ancak ZPOPMIN gibi yazma komutlar\u0131 i\u00e7in master'a ba\u011flanmalar\u0131 gerekir).<\/li>\n<\/ul>\n<\/li>\n<li><strong>C++ Workers \u00d6l\u00e7eklemesi:<\/strong>\n<ul>\n<li><strong>Yatay \u00d6l\u00e7ekleme:<\/strong> Birden fazla C++ worker \u00f6rne\u011fini farkl\u0131 sunucularda veya ayn\u0131 sunucu \u00fczerinde ayr\u0131 s\u00fcre\u00e7ler (processes) olarak \u00e7al\u0131\u015ft\u0131rabiliriz. Her worker, Redis'ten g\u00f6revleri ba\u011f\u0131ms\u0131z olarak \u00e7eker ve i\u015fler. Redis'in atomik <code>ZPOPMIN<\/code> komutu, birden fazla worker'\u0131n ayn\u0131 g\u00f6revi \u00e7ekmesini engeller.<\/li>\n<li><strong>Dikey \u00d6l\u00e7ekleme:<\/strong> Daha g\u00fc\u00e7l\u00fc CPU'lara sahip sunucular kullanarak tek bir worker'\u0131n daha fazla g\u00f6revi daha h\u0131zl\u0131 i\u015flemesini sa\u011flayabiliriz.<\/li>\n<li><strong>\u0130\u015f Par\u00e7ac\u0131\u011f\u0131 Havuzlar\u0131 (Thread Pools):<\/strong> Her bir C++ worker s\u00fcreci i\u00e7inde, birden fazla i\u015f par\u00e7ac\u0131\u011f\u0131 (thread) kullanarak e\u015fzamanl\u0131 g\u00f6rev i\u015fleme kapasitesini art\u0131rabiliriz. Ancak, bu durumda g\u00f6revlerin i\u015fleme mant\u0131\u011f\u0131n\u0131n i\u015f par\u00e7ac\u0131\u011f\u0131 g\u00fcvenli (thread-safe) olmas\u0131 gerekir.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<h3>Vaka Analizi: IoT Veri \u0130\u015fleme<\/h3>\n<p>Bir IoT sens\u00f6r a\u011f\u0131ndan gelen verileri i\u015fleyen bir sistemi d\u00fc\u015f\u00fcnelim. Sens\u00f6rler, s\u0131cakl\u0131k, nem, bas\u0131n\u00e7 gibi verileri s\u00fcrekli olarak g\u00f6nderiyor. Baz\u0131 sens\u00f6rler kritik altyap\u0131dan (\u00f6rne\u011fin, bir n\u00fckleer reakt\u00f6r\u00fcn s\u0131cakl\u0131\u011f\u0131) gelirken, di\u011ferleri daha az kritik alanlardan (\u00f6rne\u011fin, bir ofis odas\u0131n\u0131n nemi) geliyor. Kritik sens\u00f6rlerden gelen verilerin an\u0131nda i\u015flenip alarm \u00fcretilmesi gerekirken, di\u011fer veriler daha d\u00fc\u015f\u00fck \u00f6ncelikle i\u015flenebilir.<\/p>\n<p>Bu senaryoda:<\/p>\n<ul>\n<li><strong>FastAPI:<\/strong> Sens\u00f6r a\u011f ge\u00e7itlerinden gelen t\u00fcm verileri bir API u\u00e7 noktas\u0131 arac\u0131l\u0131\u011f\u0131yla kabul eder. Kritik sens\u00f6r verilerine y\u00fcksek \u00f6ncelik (\u00f6rne\u011fin, 1), di\u011ferlerine daha d\u00fc\u015f\u00fck \u00f6ncelik (\u00f6rne\u011fin, 5) atar ve Redis kuyru\u011funa g\u00f6nderir.<\/li>\n<li><strong>Redis:<\/strong> Gelen t\u00fcm sens\u00f6r verilerini \u00f6nceliklerine g\u00f6re s\u0131ralanm\u0131\u015f bir kuyrukta tutar.<\/li>\n<li><strong>C++ Workers:<\/strong> Kuyruktan en y\u00fcksek \u00f6ncelikli verileri \u00e7eker. Kritik veriler i\u00e7in an\u0131nda analiz yapar, anormallikler tespit ederse alarm sistemlerini tetikler ve ilgili birimlere bildirim g\u00f6nderir. Daha d\u00fc\u015f\u00fck \u00f6ncelikli veriler i\u00e7in ise daha yava\u015f tempoda analiz yapar ve uzun vadeli depolama veya raporlama i\u00e7in haz\u0131rlar.<\/li>\n<\/ul>\n<p>Bu sistem, kritik durumlar\u0131n h\u0131zla ele al\u0131nmas\u0131n\u0131 sa\u011flarken, ayn\u0131 zamanda t\u00fcm verilerin tutarl\u0131 bir \u015fekilde i\u015flenmesini garanti eder. C++'\u0131n performans\u0131, y\u00fcksek hacimli sens\u00f6r verilerinin d\u00fc\u015f\u00fck gecikmeyle i\u015flenmesini m\u00fcmk\u00fcn k\u0131lar.<\/p>\n<h2>\u0130leri D\u00fczey Optimizasyonlar ve En \u0130yi Uygulamalar Nelerdir?<\/h2>\n<p>Temel bir \u00f6ncelikli g\u00f6rev zamanlay\u0131c\u0131 sistemini kurduktan sonra, \u00fcretim ortamlar\u0131nda daha sa\u011flam, verimli ve g\u00fcvenilir hale getirmek i\u00e7in \u00e7e\u015fitli ileri d\u00fczey optimizasyonlar ve en iyi uygulamalar mevcuttur. Bu b\u00f6l\u00fcmde, sisteminizi bir sonraki seviyeye ta\u015f\u0131yacak baz\u0131 \u00f6nemli stratejileri inceleyece\u011fiz.<\/p>\n<h3>1. Batch \u0130\u015fleme (Toplu \u0130\u015fleme)<\/h3>\n<p>C++ worker'lar\u0131, Redis'ten tek tek g\u00f6rev \u00e7ekmek yerine, belirli bir say\u0131da g\u00f6revi toplu olarak \u00e7ekebilir. \u00d6rne\u011fin, <code>ZPOPMIN priority_queue 10<\/code> komutu ile bir seferde 10 g\u00f6revi \u00e7ekebilir. Bu, her g\u00f6rev i\u00e7in ayr\u0131 ayr\u0131 Redis komutu \u00e7al\u0131\u015ft\u0131rman\u0131n getirdi\u011fi a\u011f gecikmesini (network latency) azalt\u0131r ve genel verimi art\u0131r\u0131r. Ancak, toplu i\u015fleme yaparken, bir g\u00f6rev i\u015flenirken olu\u015fan hatan\u0131n di\u011fer g\u00f6revleri etkilememesi i\u00e7in hata y\u00f6netiminin dikkatlice yap\u0131lmas\u0131 \u00f6nemlidir.<\/p>\n<h3>2. Yeniden Deneme Mekanizmalar\u0131 ve \u00d6l\u00fc Mektup Kuyruklar\u0131 (Dead-Letter Queues)<\/h3>\n<p>G\u00f6rev i\u015fleme s\u0131ras\u0131nda hatalar ka\u00e7\u0131n\u0131lmazd\u0131r. Bir g\u00f6rev ba\u015far\u0131s\u0131z oldu\u011funda (\u00f6rne\u011fin, harici bir servis yan\u0131t vermedi\u011finde), otomatik yeniden deneme (retry) mekanizmalar\u0131 uygulamak \u00f6nemlidir. G\u00f6revler, belirli bir gecikmeyle tekrar kuyru\u011fa eklenebilir. Ancak, s\u00fcrekli ba\u015far\u0131s\u0131z olan g\u00f6revler (zehirli g\u00f6revler - \"poison pill\" tasks) sistem kaynaklar\u0131n\u0131 t\u00fcketebilir. Bu t\u00fcr g\u00f6revler i\u00e7in, belirli say\u0131da denemeden sonra bir \"\u00f6l\u00fc mektup kuyru\u011funa\" (dead-letter queue - DLQ) ta\u015f\u0131nmalar\u0131 gerekir. Bu, sorunlu g\u00f6revleri ana i\u015f ak\u0131\u015f\u0131ndan ay\u0131rarak sistemin genel sa\u011fl\u0131\u011f\u0131n\u0131 korur ve ba\u015far\u0131s\u0131z g\u00f6revlerin manuel olarak incelenmesine olanak tan\u0131r.<\/p>\n<h3>3. Dinamik \u00d6ncelik Ayarlamalar\u0131<\/h3>\n<p>Baz\u0131 durumlarda, bir g\u00f6revin \u00f6nceli\u011fi zamanla de\u011fi\u015febilir. \u00d6rne\u011fin, ba\u015flang\u0131\u00e7ta d\u00fc\u015f\u00fck \u00f6ncelikli olan bir raporlama g\u00f6revi, belirli bir son tarihe yakla\u015ft\u0131k\u00e7a daha y\u00fcksek \u00f6ncelik kazanabilir. Bu t\u00fcr senaryolar i\u00e7in, FastAPI API'sine g\u00f6rev \u00f6nceli\u011fini g\u00fcncellemek i\u00e7in bir u\u00e7 nokta ekleyebiliriz. Bu u\u00e7 nokta, Redis'teki g\u00f6revin skorunu (\u00f6nceli\u011fini) <code>ZADD<\/code> komutuyla g\u00fcncelleyerek dinamik \u00f6ncelik ayarlamalar\u0131na izin verir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# FastAPI'de \u00f6ncelik g\u00fcncelleme \u00f6rne\u011fi (pseudo-code)\n@app.put(\"\/tasks\/{task_id}\/priority\")\nasync def update_task_priority(task_id: str, new_priority: int = Field(..., ge=1, le=10)):\n    # \u00d6nce g\u00f6revin mevcut verilerini bulmak gerekebilir,\n    # ya da sadece \u00f6nceli\u011fini g\u00fcncelleyerek yeni bir eleman olarak ekleyebiliriz.\n    # Redis Sorted Set'te ayn\u0131 eleman\u0131 farkl\u0131 skorla eklemek, skorunu g\u00fcnceller.\n    # Ancak burada task_id'ye g\u00f6re g\u00f6revin tam JSON'unu bulup g\u00fcncellemek daha do\u011fru olur.\n    # Bu, Redis'te ek bir ZSCAN veya HGETALL i\u015flemi gerektirebilir\n    # ya da g\u00f6revin tam JSON'unu da bir Redis Hash'te saklayabiliriz.\n    \n    # Basit bir \u00f6rnek: G\u00f6revin JSON string'ini bulup, i\u00e7indeki \u00f6nceli\u011fi g\u00fcncelleyip tekrar ZADD yapmak.\n    # Bu, eleman\u0131n kendisi de\u011fi\u015fti\u011fi i\u00e7in ZREM + ZADD \u015feklinde yap\u0131lmal\u0131.\n    # Daha iyi bir yakla\u015f\u0131m: G\u00f6revin detaylar\u0131n\u0131 Redis Hash'te (\u00f6rne\u011fin \"tasks:task_id\") saklay\u0131p,\n    # Sorted Set'te sadece task_id'yi skor ile tutmak.\n    \n    # Varsayal\u0131m ki g\u00f6rev detaylar\u0131 bir Redis Hash'te saklan\u0131yor:\n    # redis_client.hset(f\"task:{task_id}\", \"priority\", new_priority)\n    # redis_client.zadd(\"priority_queue\", {task_id: new_priority}) # Sadece skorunu g\u00fcncelle\n    \n    return {\"message\": f\"G\u00f6rev {task_id} \u00f6nceli\u011fi {new_priority} olarak g\u00fcncellendi.\"}\n<\/code><\/pre>\n<\/div>\n<h3>4. \u0130zleme ve G\u00fcnl\u00fckleme (Monitoring and Logging)<\/h3>\n<p>\u00dcretim ortam\u0131ndaki her sistem gibi, g\u00f6rev zamanlay\u0131c\u0131m\u0131z\u0131n da kapsaml\u0131 bir \u015fekilde izlenmesi ve g\u00fcnl\u00fcklenmesi gerekir. Prometheus ve Grafana gibi ara\u00e7larla Redis kuyruk boyutunu, i\u015flenen g\u00f6rev say\u0131s\u0131n\u0131, hata oranlar\u0131n\u0131 ve g\u00f6rev i\u015fleme s\u00fcrelerini takip edebiliriz. Her bile\u015fenin (FastAPI, Redis, C++ workers) detayl\u0131 g\u00fcnl\u00fckler \u00fcretmesi, sorun giderme ve performans analizi i\u00e7in kritik \u00f6neme sahiptir. G\u00fcnl\u00fckler merkezi bir g\u00fcnl\u00fck toplama sistemine (\u00f6rne\u011fin ELK Stack veya Loki) g\u00f6nderilmelidir.<\/p>\n<h3>5. G\u00fcvenlik<\/h3>\n<p>Sistemdeki t\u00fcm bile\u015fenler aras\u0131ndaki ileti\u015fimin g\u00fcvenli oldu\u011fundan emin olunmal\u0131d\u0131r:<\/p>\n<ul>\n<li><strong>API G\u00fcvenli\u011fi:<\/strong> FastAPI u\u00e7 noktalar\u0131 i\u00e7in API anahtarlar\u0131, JWT (JSON Web Token) veya OAuth2 gibi kimlik do\u011frulama ve yetkilendirme mekanizmalar\u0131 uygulay\u0131n.<\/li>\n<li><strong>Redis G\u00fcvenli\u011fi:<\/strong> Redis sunucusuna eri\u015fimi \u015fifre (<code>requirepass<\/code>) ile koruyun ve yaln\u0131zca yetkili IP adreslerinden eri\u015fime izin verin. Gerekirse SSL\/TLS \u00fczerinden ileti\u015fim kurun.<\/li>\n<li><strong>Veri \u015eifreleme:<\/strong> Hassas g\u00f6rev verileri, Redis'e g\u00f6nderilmeden \u00f6nce \u015fifrelenmeli ve C++ worker taraf\u0131ndan i\u015flenmeden \u00f6nce \u00e7\u00f6z\u00fclmelidir.<\/li>\n<\/ul>\n<h3>6. Kapsaml\u0131 Testler<\/h3>\n<p>Birim testleri (unit tests), entegrasyon testleri ve y\u00fck testleri (load tests) sistemin farkl\u0131 bile\u015fenlerinin do\u011fru \u00e7al\u0131\u015ft\u0131\u011f\u0131ndan ve beklenen performans seviyelerini kar\u015f\u0131lad\u0131\u011f\u0131ndan emin olmak i\u00e7in hayati \u00f6neme sahiptir. \u00d6zellikle e\u015fzamanl\u0131l\u0131k ve \u00f6ncelik mant\u0131\u011f\u0131 gibi karma\u015f\u0131k alanlar i\u00e7in kapsaml\u0131 test senaryolar\u0131 olu\u015fturulmal\u0131d\u0131r.<\/p>\n<p>Bu optimizasyonlar ve en iyi uygulamalar, \u00f6ncelikli g\u00f6rev zamanlay\u0131c\u0131 sisteminizin sadece i\u015flevsel olmas\u0131n\u0131 de\u011fil, ayn\u0131 zamanda \u00fcretim ortam\u0131n\u0131n zorluklar\u0131na dayan\u0131kl\u0131, performansl\u0131 ve y\u00f6netilebilir olmas\u0131n\u0131 sa\u011flayacakt\u0131r.<\/p>\n<h2>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h2>\n<p>Bu makalede, FastAPI, Redis ve C++ teknolojilerini bir araya getirerek y\u00fcksek performansl\u0131 ve \u00f6ncelikli bir g\u00f6rev zamanlay\u0131c\u0131 sisteminin nas\u0131l in\u015fa edilece\u011fini detayl\u0131 bir \u015fekilde inceledik. FastAPI ile kullan\u0131c\u0131 dostu ve h\u0131zl\u0131 bir API katman\u0131 olu\u015fturduk, Redis'in Sorted Set veri yap\u0131s\u0131n\u0131 kullanarak g\u00f6revleri \u00f6nceliklerine g\u00f6re verimli bir \u015fekilde y\u00f6netmeyi \u00f6\u011frendik ve C++ ile d\u00fc\u015f\u00fck gecikmeli, kaynak verimli g\u00f6rev i\u015fleyicileri geli\u015ftirdik. Bu mimari, e-ticaret, IoT, finans gibi bir\u00e7ok farkl\u0131 sekt\u00f6rdeki uygulamalarda kritik g\u00f6revlerin zaman\u0131nda ve do\u011fru s\u0131rayla i\u015flenmesini sa\u011flayarak, sistemlerin genel verimlili\u011fini ve yan\u0131t verme yetene\u011fini art\u0131r\u0131r.<\/p>\n<p>\u00d6l\u00e7eklenebilirlik, hata tolerans\u0131 ve performans optimizasyonlar\u0131 gibi konulara de\u011finerek, bu t\u00fcr bir sistemin sadece temel i\u015flevselli\u011fi de\u011fil, ayn\u0131 zamanda \u00fcretim ortam\u0131n\u0131n zorluklar\u0131na kar\u015f\u0131 nas\u0131l diren\u00e7li hale getirilebilece\u011fini g\u00f6sterdik. Her bir bile\u015fenin ba\u011f\u0131ms\u0131z olarak \u00f6l\u00e7eklenebilmesi, sistemin de\u011fi\u015fen y\u00fcklere kolayca adapte olmas\u0131n\u0131 sa\u011flar. G\u00fcvenlik, izleme ve yeniden deneme mekanizmalar\u0131 gibi ileri d\u00fczey uygulamalar, sistemin sa\u011flaml\u0131\u011f\u0131n\u0131 ve g\u00fcvenilirli\u011fini art\u0131r\u0131r.<\/p>\n<p>Bu sistem, karma\u015f\u0131k arka plan i\u015fleme ihtiya\u00e7lar\u0131 olan her t\u00fcrl\u00fc modern uygulama i\u00e7in g\u00fc\u00e7l\u00fc bir temel sunar. Do\u011fru tasar\u0131m ve uygulama ile, en kritik g\u00f6revlerinizin her zaman \u00f6ncelikli olarak ele al\u0131nd\u0131\u011f\u0131ndan emin olabilirsiniz.<\/p>\n<h3>S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<ol>\n<li>\n        <strong>Neden Python (FastAPI) yerine C++ worker kullanmay\u0131 tercih ettik?<\/strong><\/p>\n<p>C++ worker kullanmam\u0131z\u0131n temel nedeni, y\u00fcksek performans ve d\u00fc\u015f\u00fck seviyeli kaynak y\u00f6netimi ihtiyac\u0131d\u0131r. \u00d6zellikle g\u00f6revlerin \u00e7ok k\u0131sa s\u00fcrede i\u015flenmesi gereken veya CPU yo\u011fun hesaplamalar i\u00e7eren senaryolarda C++'\u0131n derlenmi\u015f (compiled) do\u011fas\u0131, Python'a g\u00f6re \u00f6nemli \u00f6l\u00e7\u00fcde daha h\u0131zl\u0131 y\u00fcr\u00fctme s\u00fcreleri sunar. Bu, sistemin genel verimini ve yan\u0131t verme yetene\u011fini art\u0131r\u0131r. Python (FastAPI) API katman\u0131 i\u00e7in geli\u015ftirme h\u0131z\u0131 ve kolayl\u0131\u011f\u0131 nedeniyle tercih edilmi\u015ftir.<\/p>\n<\/li>\n<li>\n        <strong>Redis'in Sorted Set yerine ba\u015fka bir veri yap\u0131s\u0131 kullanabilir miydik?<\/strong><\/p>\n<p>Evet, teorik olarak ba\u015fka veri yap\u0131lar\u0131 da kullan\u0131labilirdi ancak Sorted Set, \u00f6ncelikli kuyruklar i\u00e7in Redis'in en uygun ve verimli veri yap\u0131s\u0131d\u0131r. Listeler (Lists) FIFO kuyruklar\u0131 i\u00e7in harikad\u0131r ama \u00f6ncelik s\u0131ralamas\u0131 yapmaz. Hash'ler veya String'ler g\u00f6rev verilerini depolamak i\u00e7in kullan\u0131labilir ancak \u00f6nceliklendirme ve h\u0131zl\u0131 \u00e7ekme i\u00e7in ek mant\u0131k gerektirir. Sorted Set, \u00fcyeleri skorlar\u0131na g\u00f6re otomatik olarak s\u0131ralad\u0131\u011f\u0131 ve <code>ZPOPMIN<\/code> gibi komutlarla atomik olarak en y\u00fcksek \u00f6ncelikli eleman\u0131 \u00e7ekme yetene\u011fi sundu\u011fu i\u00e7in bu mimaride idealdir.<\/p>\n<\/li>\n<li>\n        <strong>G\u00f6rev i\u015flenirken C++ worker \u00e7\u00f6kerse ne olur?<\/strong><\/p>\n<p>E\u011fer bir C++ worker bir g\u00f6revi \u00e7ektikten sonra i\u015fleme s\u0131ras\u0131nda \u00e7\u00f6kerse, g\u00f6rev kuyruktan zaten \u00e7\u0131kar\u0131ld\u0131\u011f\u0131 i\u00e7in kaybolmu\u015f gibi g\u00f6r\u00fcnebilir. Bu t\u00fcr durumlar\u0131 ele almak i\u00e7in birka\u00e7 strateji vard\u0131r:<\/p>\n<ul>\n<li><strong>\u0130\u015fleme Durumu Takibi:<\/strong> G\u00f6revler \u00e7ekildi\u011finde, bir \"i\u015fleniyor\" durumuna ge\u00e7irilebilir (\u00f6rne\u011fin, ba\u015fka bir Redis Hash'e kaydedilerek). E\u011fer belirli bir s\u00fcre i\u00e7inde tamamlanmazlarsa, zaman a\u015f\u0131m\u0131na u\u011fram\u0131\u015f kabul edilip tekrar kuyru\u011fa eklenebilir veya bir \u00f6l\u00fc mektup kuyru\u011funa g\u00f6nderilebilir.<\/li>\n<li><strong>Atomik \u0130\u015flemler:<\/strong> Daha karma\u015f\u0131k senaryolarda, g\u00f6rev i\u015fleme mant\u0131\u011f\u0131 bir Redis Transaction veya LUA script'i i\u00e7inde atomik olarak y\u00fcr\u00fct\u00fclebilir, b\u00f6ylece bir hata durumunda t\u00fcm i\u015flemler geri al\u0131n\u0131r.<\/li>\n<li><strong>Idempotent G\u00f6revler:<\/strong> G\u00f6revlerin birden fazla kez i\u015flense bile ayn\u0131 sonucu vermesini sa\u011flayacak \u015fekilde tasarlanmas\u0131 (idempotency), bu t\u00fcr \u00e7\u00f6kme durumlar\u0131nda veri tutarl\u0131l\u0131\u011f\u0131 sorunlar\u0131n\u0131 azalt\u0131r.<\/li>\n<\/ul>\n<\/li>\n<li>\n        <strong>Bu sistemde g\u00f6revlerin zamanlanm\u0131\u015f (scheduled) olarak \u00e7al\u0131\u015fmas\u0131n\u0131 nas\u0131l sa\u011flar\u0131z?<\/strong><\/p>\n<p>Bu makaledeki sistem \u00f6ncelikli kuyruk \u00fczerine odaklanm\u0131\u015ft\u0131r. Zamanlanm\u0131\u015f g\u00f6revler i\u00e7in farkl\u0131 bir yakla\u015f\u0131m gerekebilir. Redis'in Sorted Set'i yine kullan\u0131labilir, ancak skor olarak g\u00f6revin \u00e7al\u0131\u015fmas\u0131 gereken zaman damgas\u0131 (timestamp) kullan\u0131l\u0131r. Bir worker, s\u00fcrekli olarak \"\u015fimdiye kadar \u00e7al\u0131\u015fmas\u0131 gereken\" g\u00f6revleri (yani mevcut zamandan k\u00fc\u00e7\u00fck veya e\u015fit skorlu g\u00f6revleri) <code>ZRANGEBYSCORE<\/code> ile \u00e7eker ve i\u015fler. Bu, cron benzeri bir i\u015flevsellik sa\u011flar.<\/p>\n<\/li>\n<li>\n        <strong>FastAPI ve C++ aras\u0131nda ileti\u015fim i\u00e7in HTTP d\u0131\u015f\u0131nda ba\u015fka bir yol var m\u0131?<\/strong><\/p>\n<p>Evet, HTTP d\u0131\u015f\u0131nda farkl\u0131 ileti\u015fim mekanizmalar\u0131 da kullan\u0131labilir. \u00d6rne\u011fin, gRPC (Google Remote Procedure Call) veya AMQP (Advanced Message Queuing Protocol) gibi mesaj kuyruklar\u0131 (\u00f6rne\u011fin RabbitMQ veya Apache Kafka) kullan\u0131labilir. Ancak, bu makaledeki mimaride Redis, hem kuyruk hem de temel ileti\u015fim arac\u0131 olarak g\u00f6rev yapt\u0131\u011f\u0131 i\u00e7in, FastAPI ve C++ worker'lar\u0131 do\u011frudan birbirleriyle ileti\u015fim kurmak yerine Redis \u00fczerinden dolayl\u0131 olarak etkile\u015fime girer. Bu, bile\u015fenlerin ba\u011f\u0131ms\u0131zl\u0131\u011f\u0131n\u0131 art\u0131r\u0131r.<\/p>\n<\/li>\n<\/ol>\n<p>#Teknoloji #WebGeli\u015ftirme #FastAPI #Redis #C++ #G\u00f6revY\u00f6netimi #Mikroservisler #Y\u00fcksekPerformans<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/fastapi-redis-priority-task-queue\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/fastapi-redis-priority-task-queue<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Modern web uygulamalar\u0131nda, e\u015fzamans\u0131z (asynchronous) g\u00f6revlerin y\u00f6netimi kritik bir \u00f6neme sahiptir.","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1404],"tags":[],"class_list":{"0":"post-45378","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-redis","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?\" \/>\n<meta property=\"og:description\" content=\"Modern web uygulamalar\u0131nda, e\u015fzamans\u0131z (asynchronous) g\u00f6revlerin y\u00f6netimi kritik bir \u00f6neme sahiptir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-10-25T18:06:37+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-10-25T18:07:14+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"14 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?\",\"datePublished\":\"2026-10-25T18:06:37+00:00\",\"dateModified\":\"2026-10-25T18:07:14+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\"},\"wordCount\":4630,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"articleSection\":[\"Redis\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\",\"name\":\"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-10-25T18:06:37+00:00\",\"dateModified\":\"2026-10-25T18:07:14+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/","og_locale":"tr_TR","og_type":"article","og_title":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?","og_description":"Modern web uygulamalar\u0131nda, e\u015fzamans\u0131z (asynchronous) g\u00f6revlerin y\u00f6netimi kritik bir \u00f6neme sahiptir.","og_url":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-10-25T18:06:37+00:00","article_modified_time":"2026-10-25T18:07:14+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"14 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?","datePublished":"2026-10-25T18:06:37+00:00","dateModified":"2026-10-25T18:07:14+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/"},"wordCount":4630,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"articleSection":["Redis"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/","url":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/","name":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur? - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-10-25T18:06:37+00:00","dateModified":"2026-10-25T18:07:14+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/fastapi-redis-ve-c-ile-oncelikli-gorev-zamanlayici-nasil-olusturulur\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"FastAPI, Redis ve C++ ile \u00d6ncelikli G\u00f6rev Zamanlay\u0131c\u0131 Nas\u0131l Olu\u015fturulur?"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45378","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=45378"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45378\/revisions"}],"predecessor-version":[{"id":45379,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/45378\/revisions\/45379"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=45378"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=45378"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=45378"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}