{"id":37947,"date":"2026-01-19T11:30:35","date_gmt":"2026-01-19T08:30:35","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/"},"modified":"2026-01-19T11:30:35","modified_gmt":"2026-01-19T08:30:35","slug":"transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/","title":{"rendered":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama"},"content":{"rendered":"<h2>Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama<\/h2>\n<p>Mikroservis mimarileri, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda esneklik, \u00f6l\u00e7eklenebilirlik ve ba\u011f\u0131ms\u0131zl\u0131k vaatleriyle h\u0131zla yayg\u0131nla\u015fm\u0131\u015ft\u0131r. Ancak bu mimarilerin getirdi\u011fi en b\u00fcy\u00fck zorluklardan biri, da\u011f\u0131t\u0131k sistemlerde veri tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenilir ileti\u015fimi sa\u011flamakt\u0131r. \u00d6zellikle bir servis kendi veritaban\u0131nda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131nda, bu de\u011fi\u015fikli\u011fi di\u011fer servislere g\u00fcvenilir bir \u015fekilde olay (event) olarak bildirmesi kritik \u00f6neme sahiptir. Bu makalede, bu zorlu\u011fun \u00fcstesinden gelmek i\u00e7in kullan\u0131lan g\u00fc\u00e7l\u00fc bir desen olan Transactional Outbox pattern&#8217;\u0131n\u0131 ve RabbitMQ ile entegrasyonunu detayl\u0131 bir \u015fekilde inceleyece\u011fiz.<\/p>\n<h3>Mikroservis Mimarilerinde Olay Odakl\u0131 \u0130leti\u015fim ve Zorluklar\u0131<\/h3>\n<p>Mikroservisler aras\u0131 ileti\u015fimde olay odakl\u0131 mimariler, servislerin birbirleriyle do\u011frudan ba\u011f\u0131ml\u0131l\u0131k kurmadan asenkron bir \u015fekilde haberle\u015fmesini sa\u011flar. Bu yakla\u015f\u0131m, sistemin daha esnek ve hata toleransl\u0131 olmas\u0131na yard\u0131mc\u0131 olur.<\/p>\n<h4>Neden Olay Odakl\u0131 \u0130leti\u015fim?<\/h4>\n<p>Olay odakl\u0131 ileti\u015fim, servislerin gev\u015fek bir \u015fekilde ba\u011flanmas\u0131n\u0131 (loosely coupled) sa\u011flar. Bir servis bir olay\u0131 yay\u0131nlad\u0131\u011f\u0131nda, di\u011fer servisler bu olay\u0131 dinleyebilir ve kendi i\u015f mant\u0131klar\u0131n\u0131 tetikleyebilir. Bu, servislerin ba\u011f\u0131ms\u0131z olarak geli\u015ftirilmesine, da\u011f\u0131t\u0131lmas\u0131na ve \u00f6l\u00e7eklenmesine olanak tan\u0131r. \u00d6rne\u011fin, bir &#8220;Sipari\u015f&#8221; servisi yeni bir sipari\u015f olu\u015fturdu\u011funda, &#8220;\u00d6deme&#8221; servisi \u00f6demeyi i\u015flemek i\u00e7in, &#8220;Envanter&#8221; servisi sto\u011fu g\u00fcncellemek i\u00e7in ve &#8220;Bildirim&#8221; servisi m\u00fc\u015fteriye e-posta g\u00f6ndermek i\u00e7in bu olay\u0131 dinleyebilir.<\/p>\n<h4>Veri Tutarl\u0131l\u0131\u011f\u0131 Sorunlar\u0131<\/h4>\n<p>Olay odakl\u0131 mimarilerde temel bir sorun ortaya \u00e7\u0131kar: Bir servis kendi veritaban\u0131nda bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131nda ve ard\u0131ndan bu de\u011fi\u015fikli\u011fi bir mesaj kuyru\u011funa olay olarak g\u00f6nderdi\u011finde, bu iki i\u015flemin atomik (b\u00f6l\u00fcnmez) olmas\u0131 gerekir. Yani, ya her ikisi de ba\u015far\u0131l\u0131 olmal\u0131 ya da her ikisi de ba\u015far\u0131s\u0131z olmal\u0131d\u0131r. Aksi takdirde, veritaban\u0131nda bir de\u011fi\u015fiklik olurken olay yay\u0131nlanmazsa (veya tam tersi), sistemde veri tutars\u0131zl\u0131klar\u0131 meydana gelir.<\/p>\n<h4>Atomik \u0130\u015flemlerin Gereklili\u011fi<\/h4>\n<p>Geleneksel olarak, tek bir i\u015flem (transaction) i\u00e7inde veritaban\u0131 ve mesaj kuyru\u011fu i\u015flemlerini birle\u015ftirmek m\u00fcmk\u00fcn de\u011fildir. Veritaban\u0131 i\u015flemleri genellikle ACID \u00f6zelliklerini (Atomicity, Consistency, Isolation, Durability) desteklerken, mesaj kuyruklar\u0131 farkl\u0131 garanti seviyeleri sunar. Bu iki farkl\u0131 sistem aras\u0131nda atomik bir ba\u011f kurmak, da\u011f\u0131t\u0131k i\u015flemlerin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 beraberinde getirir.<\/p>\n<h3>Da\u011f\u0131t\u0131k \u0130\u015flemlerin Karma\u015f\u0131kl\u0131\u011f\u0131: \u0130ki A\u015famal\u0131 Taahh\u00fct (2PC) ve Alternatifler<\/h3>\n<p>Veri tutarl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flamak i\u00e7in kullan\u0131lan geleneksel y\u00f6ntemler, mikroservis mimarilerinde genellikle yetersiz kal\u0131r veya yeni sorunlar yarat\u0131r.<\/p>\n<h4>2PC&#8217;nin S\u0131n\u0131rlamalar\u0131<\/h4>\n<p>\u0130ki A\u015famal\u0131 Taahh\u00fct (Two-Phase Commit &#8211; 2PC), birden fazla kat\u0131l\u0131mc\u0131 aras\u0131nda da\u011f\u0131t\u0131k bir i\u015flemi atomik olarak koordine etmek i\u00e7in tasarlanm\u0131\u015f bir protokold\u00fcr. Ancak 2PC, mikroservis ortamlar\u0131nda genellikle tercih edilmez. \u00c7\u00fcnk\u00fc:<\/p>\n<ul>\n<li>Performans darbo\u011fazlar\u0131na neden olabilir.<\/li>\n<li>Tek bir koordinat\u00f6r\u00fcn ba\u015far\u0131s\u0131z olmas\u0131 durumunda t\u00fcm sistemin kilitlenmesine yol a\u00e7abilir (tek hata noktas\u0131).<\/li>\n<li>Farkl\u0131 teknoloji y\u0131\u011f\u0131nlar\u0131na sahip servisler aras\u0131nda entegrasyonu zordur.<\/li>\n<\/ul>\n<h4>Saga Deseni ve Tutarl\u0131l\u0131k Modelleri<\/h4>\n<p>Mikroservislerde da\u011f\u0131t\u0131k i\u015flemler i\u00e7in daha yayg\u0131n bir yakla\u015f\u0131m, Saga desenidir. Saga, bir dizi yerel i\u015flemin s\u0131rayla y\u00fcr\u00fct\u00fcld\u00fc\u011f\u00fc ve her bir yerel i\u015flemin ba\u015far\u0131s\u0131z olmas\u0131 durumunda \u00f6nceki i\u015flemlerin telafi edici i\u015flemlerle geri al\u0131nd\u0131\u011f\u0131 bir desendir. Saga deseni, nihai tutarl\u0131l\u0131k (eventual consistency) modelini benimser, yani sistemin belirli bir s\u00fcre sonra tutarl\u0131 hale gelece\u011fi varsay\u0131l\u0131r. Ancak Saga&#8217;n\u0131n kendisi, yerel veritaban\u0131 de\u011fi\u015fikli\u011fi ile olay\u0131n yay\u0131nlanmas\u0131 aras\u0131ndaki atomikli\u011fi garanti etmez.<\/p>\n<h4>G\u00fcvenilir Olay Yay\u0131nlama \u0130htiyac\u0131<\/h4>\n<p>Yukar\u0131daki zorluklar g\u00f6z \u00f6n\u00fcne al\u0131nd\u0131\u011f\u0131nda, mikroservislerin kendi veritaban\u0131 i\u015flemlerini tamamlad\u0131ktan sonra, bu olay\u0131 g\u00fcvenilir bir \u015fekilde mesaj kuyru\u011funa iletebilmesi i\u00e7in farkl\u0131 bir mekanizmaya ihtiya\u00e7 duyulur. \u0130\u015fte bu noktada Transactional Outbox deseni devreye girer.<\/p>\n<h3>Transactional Outbox Deseni Nedir?<\/h3>\n<p>Transactional Outbox deseni, mikroservislerde veri tutarl\u0131l\u0131\u011f\u0131n\u0131 ve g\u00fcvenilir olay yay\u0131nlamay\u0131 sa\u011flamak i\u00e7in kullan\u0131lan bir yakla\u015f\u0131md\u0131r. Temel fikir, bir veritaban\u0131 i\u015flemi i\u00e7inde hem i\u015f verisini hem de yay\u0131nlanacak olaylar\u0131 ayn\u0131 anda kaydetmektir.<\/p>\n<h4>Temel Prensip<\/h4>\n<p>Transactional Outbox deseninin temel prensibi \u015fudur: Bir servis kendi i\u015f verisinde bir de\u011fi\u015fiklik yapt\u0131\u011f\u0131nda (\u00f6rne\u011fin, bir sipari\u015f olu\u015fturdu\u011funda), bu de\u011fi\u015fikli\u011fi kendi veritaban\u0131na kaydederken, ayn\u0131 veritaban\u0131 i\u015flemi (transaction) i\u00e7inde, yay\u0131nlanacak olay\u0131n bir kopyas\u0131n\u0131 da \u00f6zel bir &#8220;Outbox&#8221; tablosuna kaydeder. Bu, i\u015f verisi de\u011fi\u015fikli\u011fi ve olay\u0131n kaydedilmesi i\u015flemlerinin atomik olmas\u0131n\u0131 sa\u011flar. E\u011fer veritaban\u0131 i\u015flemi ba\u015far\u0131l\u0131 olursa, hem i\u015f verisi hem de olay Outbox tablosunda kal\u0131c\u0131 hale gelir. E\u011fer i\u015flem ba\u015far\u0131s\u0131z olursa, her ikisi de geri al\u0131n\u0131r.<\/p>\n<h4>Avantajlar\u0131<\/h4>\n<ul>\n<li><strong>Atomiklik:<\/strong> \u0130\u015f verisi de\u011fi\u015fikli\u011fi ve olay kayd\u0131n\u0131n tek bir veritaban\u0131 i\u015flemi i\u00e7inde atomik olarak ger\u00e7ekle\u015fmesini garanti eder.<\/li>\n<li><strong>G\u00fcvenilirlik:<\/strong> Olaylar\u0131n kaybolmamas\u0131n\u0131 sa\u011flar. Olaylar veritaban\u0131na kaydedildi\u011fi s\u00fcrece, daha sonra mesaj kuyru\u011funa g\u00f6nderilebilir.<\/li>\n<li><strong>Basitlik:<\/strong> Da\u011f\u0131t\u0131k i\u015flem koordinat\u00f6rlerine (2PC gibi) ihtiya\u00e7 duymaz, bu da sistemin karma\u015f\u0131kl\u0131\u011f\u0131n\u0131 azalt\u0131r.<\/li>\n<li><strong>Gev\u015fek Ba\u011flant\u0131:<\/strong> Servislerin mesaj kuyru\u011fuyla do\u011frudan entegre olma zorunlulu\u011funu ortadan kald\u0131r\u0131r.<\/li>\n<\/ul>\n<h4>Dezavantajlar\u0131<\/h4>\n<ul>\n<li><strong>Ek Veritaban\u0131 Y\u00fck\u00fc:<\/strong> Her olay i\u00e7in veritaban\u0131na yazma i\u015flemi gerektirir.<\/li>\n<li><strong>Gecikme:<\/strong> Olaylar\u0131n mesaj kuyru\u011funa iletilmesinde k\u00fc\u00e7\u00fck bir gecikme olabilir (nihai tutarl\u0131l\u0131k).<\/li>\n<li><strong>Karma\u015f\u0131kl\u0131k:<\/strong> Outbox tablosunu izleyen ve olaylar\u0131 yay\u0131nlayan ek bir &#8220;relay&#8221; servisi veya mekanizmas\u0131 gerektirir.<\/li>\n<\/ul>\n<h3>Transactional Outbox Nas\u0131l \u00c7al\u0131\u015f\u0131r? Ad\u0131m Ad\u0131m Uygulama<\/h3>\n<p>Transactional Outbox desenini uygulamak i\u00e7in genellikle a\u015fa\u011f\u0131daki ad\u0131mlar izlenir:<\/p>\n<h4>Olaylar\u0131n Veritaban\u0131na Kaydedilmesi<\/h4>\n<p>Bir servis, bir i\u015f i\u015flemi ger\u00e7ekle\u015ftirdi\u011finde (\u00f6rne\u011fin, yeni bir kullan\u0131c\u0131 kayd\u0131), bu i\u015flemi kendi veritaban\u0131nda ba\u015flat\u0131r. Bu i\u015flem s\u0131ras\u0131nda, i\u015f verisini g\u00fcnceller ve ayn\u0131 veritaban\u0131 i\u015flemi i\u00e7inde, yay\u0131nlamak istedi\u011fi olay\u0131 (\u00f6rne\u011fin, <code>UserCreatedEvent<\/code>) \u00f6zel bir <code>Outbox<\/code> tablosuna kaydeder.<\/p>\n<pre><code class=\"language-csharp\">\n\/\/ \u00d6rnek: C# ve Entity Framework Core\nusing (var transaction = _dbContext.Database.BeginTransaction())\n{\n    \/\/ 1. \u0130\u015f verisini kaydet\n    var user = new User { Name = \"John Doe\", Email = \"john.doe@example.com\" };\n    _dbContext.Users.Add(user);\n    _dbContext.SaveChanges();\n\n    \/\/ 2. Olay\u0131 Outbox tablosuna kaydet\n    var userCreatedEvent = new OutboxMessage\n    {\n        Id = Guid.NewGuid(),\n        OccurredOn = DateTime.UtcNow,\n        Type = \"UserCreatedEvent\",\n        Payload = JsonConvert.SerializeObject(new { UserId = user.Id, UserName = user.Name })\n    };\n    _dbContext.OutboxMessages.Add(userCreatedEvent);\n    _dbContext.SaveChanges();\n\n    \/\/ 3. Veritaban\u0131 i\u015flemini tamamla\n    transaction.Commit();\n}\n<\/pre>\n<p><\/code><\/p>\n<h4>Arka Plan \u0130\u015flemi (Relay)<\/h4>\n<p>Ayr\u0131 bir servis veya arka plan g\u00f6revi (genellikle \"Relay\" servisi olarak adland\u0131r\u0131l\u0131r), <code>Outbox<\/code> tablosunu s\u00fcrekli olarak izler. Bu izleme, belirli aral\u0131klarla tabloyu sorgulayarak (polling) veya veritaban\u0131n\u0131n Change Data Capture (CDC) \u00f6zelliklerini kullanarak yap\u0131labilir.<\/p>\n<h4>Olaylar\u0131n Mesaj Kuyru\u011funa G\u00f6nderilmesi<\/h4>\n<p>Relay servisi, <code>Outbox<\/code> tablosunda hen\u00fcz yay\u0131nlanmam\u0131\u015f olaylar\u0131 buldu\u011funda, bu olaylar\u0131 al\u0131r ve yap\u0131land\u0131r\u0131lm\u0131\u015f bir mesaj kuyru\u011funa (bu durumda RabbitMQ) g\u00f6nderir. Olay ba\u015far\u0131yla mesaj kuyru\u011funa g\u00f6nderildikten sonra, Relay servisi <code>Outbox<\/code> tablosundaki ilgili olay\u0131n durumunu \"yay\u0131nland\u0131\" olarak g\u00fcnceller veya olay\u0131 siler.<\/p>\n<h4>\u0130\u015flem Atomikli\u011finin Sa\u011flanmas\u0131<\/h4>\n<p>Bu yakla\u015f\u0131m, i\u015f verisi de\u011fi\u015fikli\u011fi ve olay\u0131n kaydedilmesinin atomik olmas\u0131n\u0131 sa\u011flar. E\u011fer uygulama \u00e7\u00f6kerse veya mesaj kuyru\u011funa g\u00f6nderme i\u015flemi ba\u015far\u0131s\u0131z olursa, olay hala <code>Outbox<\/code> tablosunda durur ve Relay servisi taraf\u0131ndan tekrar i\u015flenebilir. Bu, olay\u0131n kaybolmamas\u0131n\u0131 garanti eder.<\/p>\n<h3>RabbitMQ ile Entegrasyon: Olaylar\u0131 G\u00fcvenle \u0130letme<\/h3>\n<p>RabbitMQ, Transactional Outbox deseniyle m\u00fckemmel bir uyum i\u00e7indedir. Olaylar\u0131n g\u00fcvenilir bir \u015fekilde mesaj kuyru\u011funa iletilmesi ve t\u00fcketilmesi i\u00e7in \u00e7e\u015fitli mekanizmalar sunar.<\/p>\n<h4>RabbitMQ'nun Rol\u00fc<\/h4>\n<p>Relay servisi, <code>Outbox<\/code> tablosundan ald\u0131\u011f\u0131 olaylar\u0131 RabbitMQ'ya g\u00f6nderir. RabbitMQ, bu olaylar\u0131 ilgili Exchange'lere y\u00f6nlendirir ve oradan da kuyruklara da\u011f\u0131t\u0131r. Bu sayede, olay\u0131 dinleyen t\u00fcm servisler, olay mesaj\u0131n\u0131 alabilir.<\/p>\n<h4>Mesaj Garanti Mekanizmalar\u0131 (Publisher Confirms)<\/h4>\n<p>RabbitMQ, yay\u0131nc\u0131lar\u0131n mesajlar\u0131n\u0131n Broker taraf\u0131ndan al\u0131nd\u0131\u011f\u0131ndan ve i\u015flendi\u011finden emin olmalar\u0131n\u0131 sa\u011flayan \"Publisher Confirms\" \u00f6zelli\u011fine sahiptir. Relay servisi, bir mesaj\u0131 RabbitMQ'ya g\u00f6nderdi\u011finde, bu \u00f6zelli\u011fi kullanarak mesaj\u0131n ba\u015far\u0131l\u0131 bir \u015fekilde teslim edildi\u011fine dair bir onay bekleyebilir. E\u011fer onay gelmezse (\u00f6rne\u011fin, a\u011f hatas\u0131 veya RabbitMQ'nun \u00e7\u00f6kmesi), Relay servisi mesaj\u0131 tekrar g\u00f6ndermeyi deneyebilir.<\/p>\n<h4>Mesaj Tekrarlamas\u0131 ve Idempotency<\/h4>\n<p>Transactional Outbox deseni ve RabbitMQ entegrasyonunda, ayn\u0131 olay\u0131n birden fazla kez g\u00f6nderilme olas\u0131l\u0131\u011f\u0131 vard\u0131r (\u00f6rne\u011fin, Relay servisi bir olay\u0131 g\u00f6nderdikten sonra, onay almadan \u00f6nce \u00e7\u00f6kerse ve yeniden ba\u015flad\u0131\u011f\u0131nda ayn\u0131 olay\u0131 tekrar g\u00f6nderirse). Bu nedenle, olaylar\u0131 t\u00fcketen servislerin idempotent olmas\u0131, yani ayn\u0131 olay\u0131 birden fazla kez ald\u0131klar\u0131nda bile sistemde yan etki yaratmayacak \u015fekilde tasarlanmas\u0131 kritik \u00f6neme sahiptir. Her olaya benzersiz bir kimlik (UUID) eklemek ve t\u00fcketicilerin bu kimli\u011fi kullanarak olaylar\u0131 i\u015flem \u00f6ncesi kontrol etmesi yayg\u0131n bir yakla\u015f\u0131md\u0131r.<\/p>\n<h3>Uygulama Ad\u0131mlar\u0131 ve Dikkat Edilmesi Gerekenler<\/h3>\n<p>Transactional Outbox desenini uygularken baz\u0131 \u00f6nemli noktalara dikkat etmek gerekir.<\/p>\n<h4>Outbox Tablosu Tasar\u0131m\u0131<\/h4>\n<p><code>Outbox<\/code> tablosu, her olay\u0131n benzersiz bir kimli\u011fe sahip olmas\u0131n\u0131 ve gerekli t\u00fcm bilgileri i\u00e7ermesini sa\u011flamal\u0131d\u0131r. \u00d6rnek bir tablo yap\u0131s\u0131:<\/p>\n<table>\n<thead>\n<tr>\n<th>Kolon Ad\u0131<\/th>\n<th>Veri Tipi<\/th>\n<th>A\u00e7\u0131klama<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><code>Id<\/code><\/td>\n<td><code>GUID<\/code><\/td>\n<td>Olay\u0131n benzersiz kimli\u011fi<\/td>\n<\/tr>\n<tr>\n<td><code>OccurredOn<\/code><\/td>\n<td><code>DateTimeOffset<\/code><\/td>\n<td>Olay\u0131n olu\u015ftu\u011fu zaman<\/td>\n<\/tr>\n<tr>\n<td><code>Type<\/code><\/td>\n<td><code>NVARCHAR(255)<\/code><\/td>\n<td>Olay\u0131n tipi (\u00f6rn. \"UserCreatedEvent\")<\/td>\n<\/tr>\n<tr>\n<td><code>Payload<\/code><\/td>\n<td><code>NVARCHAR(MAX)<\/code><\/td>\n<td>Olay\u0131n JSON format\u0131ndaki i\u00e7eri\u011fi<\/td>\n<\/tr>\n<tr>\n<td><code>ProcessedDate<\/code><\/td>\n<td><code>DateTimeOffset?<\/code><\/td>\n<td>Olay\u0131n mesaj kuyru\u011funa g\u00f6nderildi\u011fi zaman (NULL ise g\u00f6nderilmedi)<\/td>\n<\/tr>\n<tr>\n<td><code>Attempts<\/code><\/td>\n<td><code>INT<\/code><\/td>\n<td>G\u00f6nderme denemesi say\u0131s\u0131<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<h4>Olaylar\u0131 Yay\u0131nlama Servisi<\/h4>\n<p>\u0130\u015f mant\u0131\u011f\u0131n\u0131 i\u00e7eren servisler, veritaban\u0131 i\u015flemleri i\u00e7inde Outbox tablosuna olaylar\u0131 eklemekten sorumlu olacakt\u0131r. Bu i\u015flem, genellikle bir ORM (Object-Relational Mapper) veya Repository deseni kullan\u0131larak soyutlanabilir.<\/p>\n<h4>Relay Servisi (Polling veya Change Data Capture)<\/h4>\n<p>Relay servisi, Outbox tablosunu izleyen ve olaylar\u0131 RabbitMQ'ya g\u00f6nderen ba\u011f\u0131ms\u0131z bir bile\u015fendir.<\/p>\n<ul>\n<li><strong>Polling Yakla\u015f\u0131m\u0131:<\/strong> Belirli aral\u0131klarla (\u00f6rne\u011fin, her 5 saniyede bir) <code>ProcessedDate<\/code> alan\u0131 <code>NULL<\/code> olan kay\u0131tlar\u0131 sorgular ve bunlar\u0131 RabbitMQ'ya g\u00f6nderir. Ba\u015far\u0131l\u0131 g\u00f6nderimden sonra <code>ProcessedDate<\/code> alan\u0131n\u0131 g\u00fcnceller.<\/li>\n<li><strong>Change Data Capture (CDC) Yakla\u015f\u0131m\u0131:<\/strong> Veritaban\u0131n\u0131n i\u015flem loglar\u0131n\u0131 (transaction logs) izleyerek Outbox tablosundaki de\u011fi\u015fiklikleri ger\u00e7ek zamanl\u0131 olarak yakalar. Bu yakla\u015f\u0131m, daha d\u00fc\u015f\u00fck gecikme ve daha iyi performans sunar ancak veritaban\u0131 sistemine ve ara\u00e7lar\u0131na ba\u011fl\u0131d\u0131r (\u00f6rne\u011fin, Debezium, SQL Server Change Tracking).<\/li>\n<\/ul>\n<h4>Hata Y\u00f6netimi ve Yeniden Denemeler<\/h4>\n<p>Relay servisi, RabbitMQ'ya mesaj g\u00f6nderirken olu\u015fabilecek hatalar\u0131 y\u00f6netmelidir. Yeniden deneme mekanizmalar\u0131 (exponential backoff ile) ve ba\u015far\u0131s\u0131z mesajlar i\u00e7in bir \"Dead Letter Queue\" (DLQ) kullan\u0131m\u0131 \u00f6nemlidir. E\u011fer bir olay belirli say\u0131da denemeden sonra hala g\u00f6nderilemiyorsa, bu olay\u0131n DLQ'ya ta\u015f\u0131nmas\u0131 ve manuel m\u00fcdahale i\u00e7in i\u015faretlenmesi gerekebilir.<\/p>\n<h3>Sonu\u00e7 ve Gelecek B\u00f6l\u00fcm<\/h3>\n<p>Transactional Outbox deseni, mikroservis mimarilerinde g\u00fcvenilir olay yay\u0131nlaman\u0131n temel ta\u015flar\u0131ndan biridir. \u0130\u015f verisi de\u011fi\u015fiklikleri ile olay yay\u0131nlama aras\u0131ndaki atomikli\u011fi sa\u011flayarak, da\u011f\u0131t\u0131k sistemlerde veri tutarl\u0131l\u0131\u011f\u0131 sorunlar\u0131na zarif bir \u00e7\u00f6z\u00fcm sunar. RabbitMQ gibi g\u00fc\u00e7l\u00fc bir mesaj arac\u0131s\u0131yla birle\u015fti\u011finde, bu desen servisler aras\u0131 ileti\u015fimin sa\u011flaml\u0131\u011f\u0131n\u0131 ve esnekli\u011fini \u00f6nemli \u00f6l\u00e7\u00fcde art\u0131r\u0131r.<\/p>\n<p>Bu makalede, Transactional Outbox deseninin temellerini, neden ihtiya\u00e7 duyuldu\u011funu ve RabbitMQ ile nas\u0131l entegre edilebilece\u011fini ele ald\u0131k. \"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 2)\" makalemizde, bu desenin daha ileri uygulamalar\u0131n\u0131, Change Data Capture (CDC) ile entegrasyonunu, hata y\u00f6netimi stratejilerini ve izleme (monitoring) konular\u0131n\u0131 daha derinlemesine inceleyece\u011fiz.<\/p>\n<h3>SSS (S\u0131k Sorulan Sorular)<\/h3>\n<h4>1. Neden do\u011frudan RabbitMQ'ya g\u00f6ndermiyoruz?<\/h4>\n<p>Do\u011frudan RabbitMQ'ya g\u00f6ndermek, veritaban\u0131 i\u015flemi ile mesaj g\u00f6nderme i\u015fleminin atomik olmamas\u0131n\u0131 sa\u011flar. E\u011fer veritaban\u0131 i\u015flemi ba\u015far\u0131l\u0131 olurken mesaj g\u00f6nderme ba\u015far\u0131s\u0131z olursa, sistemde veri tutars\u0131zl\u0131\u011f\u0131 olu\u015fur. Transactional Outbox, bu iki i\u015flemi tek bir veritaban\u0131 i\u015flemi i\u00e7inde birle\u015ftirerek atomikli\u011fi garanti eder.<\/p>\n<h4>2. Outbox tablosu \u00e7ok b\u00fcy\u00fck olursa ne olur?<\/h4>\n<p>Outbox tablosunun s\u00fcrekli b\u00fcy\u00fcmesi, performans sorunlar\u0131na yol a\u00e7abilir. Bu nedenle, olaylar ba\u015far\u0131yla yay\u0131nland\u0131ktan sonra Outbox tablosundan silinmeli veya ar\u015fivlenmelidir. Relay servisi, ba\u015far\u0131l\u0131 bir \u015fekilde g\u00f6nderilen olaylar\u0131 i\u015faretlemeli ve d\u00fczenli olarak temizlik i\u015flemleri yap\u0131lmal\u0131d\u0131r.<\/p>\n<h4>3. Relay servisi \u00e7\u00f6kerse olaylar kaybolur mu?<\/h4>\n<p>Hay\u0131r, olaylar kaybolmaz. Olaylar, i\u015f verisiyle birlikte veritaban\u0131ndaki Outbox tablosuna kal\u0131c\u0131 olarak kaydedildi\u011fi i\u00e7in, Relay servisi \u00e7\u00f6kse bile olaylar g\u00fcvende kal\u0131r. Relay servisi yeniden ba\u015flat\u0131ld\u0131\u011f\u0131nda, kald\u0131\u011f\u0131 yerden devam ederek hen\u00fcz yay\u0131nlanmam\u0131\u015f olaylar\u0131 i\u015fleyecektir.<\/p>\n<h4>4. Idempotency neden \u00f6nemli?<\/h4>\n<p>Idempotency, ayn\u0131 i\u015flemin birden fazla kez uygulanmas\u0131n\u0131n ayn\u0131 sonucu vermesi veya ek yan etkiler yaratmamas\u0131 anlam\u0131na gelir. Transactional Outbox deseninde, Relay servisi veya RabbitMQ'nun kendisi nedeniyle ayn\u0131 olay\u0131n birden fazla kez g\u00f6nderilme olas\u0131l\u0131\u011f\u0131 her zaman vard\u0131r. T\u00fcketici servisler idempotent olarak tasarlanmazsa, ayn\u0131 olay\u0131 birden fazla kez i\u015fleyerek hatal\u0131 veri durumlar\u0131na veya istenmeyen yan etkilere neden olabilirler.<\/p>\n","protected":false},"excerpt":{"rendered":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama\nMikroservis mimarileri, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda esnekl&#8230;","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":[1],"tags":[],"class_list":{"0":"post-37947","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","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>Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama - 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\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama\" \/>\n<meta property=\"og:description\" content=\"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama Mikroservis mimarileri, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda esnekl...\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-01-19T08:30:35+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=\"11 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama\",\"datePublished\":\"2026-01-19T08:30:35+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\"},\"wordCount\":2207,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\",\"name\":\"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-01-19T08:30:35+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama\"}]},{\"@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":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama - 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\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/","og_locale":"tr_TR","og_type":"article","og_title":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama","og_description":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama Mikroservis mimarileri, yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda esnekl...","og_url":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-01-19T08:30:35+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"11 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama","datePublished":"2026-01-19T08:30:35+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/"},"wordCount":2207,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/","url":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/","name":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-01-19T08:30:35+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/transactional-outbox-ile-rabbitmq-bolum-1-mikroservislerde-guvenilir-olay-yayinlama\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Transactional Outbox ile RabbitMQ (B\u00f6l\u00fcm 1): Mikroservislerde G\u00fcvenilir Olay Yay\u0131nlama"}]},{"@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\/37947","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=37947"}],"version-history":[{"count":0,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/37947\/revisions"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=37947"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=37947"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=37947"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}