{"id":43168,"date":"2026-07-08T09:06:49","date_gmt":"2026-07-08T06:06:49","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/"},"modified":"2026-07-08T09:07:25","modified_gmt":"2026-07-08T06:07:25","slug":"go-workflow-engine-tak-calistir-is-akisi-motoru","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/","title":{"rendered":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru"},"content":{"rendered":"<h2>go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru<\/h2>\n<p>Karma\u015f\u0131k i\u015f s\u00fcre\u00e7lerini y\u00f6netmekte zorlan\u0131yor musunuz? go-workflow-engine ile Go projelerinizde tak-\u00e7al\u0131\u015ft\u0131r i\u015f ak\u0131\u015flar\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.<\/p>\n<p>Modern yaz\u0131l\u0131m geli\u015ftirme d\u00fcnyas\u0131nda, \u00f6zellikle mikroservis mimarileri (microservices architecture) ve da\u011f\u0131t\u0131k sistemler yayg\u0131nla\u015ft\u0131k\u00e7a, i\u015f s\u00fcre\u00e7lerinin y\u00f6netimi b\u00fcy\u00fck bir sorun haline gelmektedir. Bir kullan\u0131c\u0131n\u0131n e-ticaret sitesinden al\u0131\u015fveri\u015f yapmas\u0131 kadar basit g\u00f6r\u00fcnen bir i\u015flem bile arka planda \u00f6deme alma, stok g\u00fcncelleme, fatura kesme ve kargoya verme gibi onlarca farkl\u0131 ad\u0131mdan olu\u015fur. Bu ad\u0131mlar\u0131n s\u0131ras\u0131yla, g\u00fcvenli bir \u015fekilde ve hata durumlar\u0131nda geri al\u0131nabilir (rollback) olarak y\u00f6netilmesi gerekir. \u0130\u015fte tam bu noktada, Go dilinin g\u00fcc\u00fcn\u00fc arkas\u0131na alan hafif ve esnek bir k\u00fct\u00fcphane olan <code>go-workflow-engine<\/code> devreye giriyor.<\/p>\n<p>Geli\u015ftiriciler olarak genellikle bu t\u00fcr s\u00fcre\u00e7leri y\u00f6netmek i\u00e7in karma\u015f\u0131k <code>if-else<\/code> bloklar\u0131 veya devasa durum makineleri (state machine) yazar\u0131z. Ancak, zamanla bu kod taban\u0131 okunamaz ve bak\u0131m\u0131 yap\u0131lamaz bir hale gelir. Bu makalede, Go dilinde i\u015f ak\u0131\u015flar\u0131n\u0131z\u0131 nas\u0131l &#8220;tak-\u00e7al\u0131\u015ft\u0131r&#8221; (plug-and-play) bir yakla\u015f\u0131mla tasarlayabilece\u011finizi, kod karma\u015fas\u0131ndan nas\u0131l kurtulabilece\u011finizi ve <code>go-workflow-engine<\/code> k\u00fct\u00fcphanesini projelerinize nas\u0131l entegre edebilece\u011finizi detayl\u0131ca inceleyece\u011fiz.<\/p>\n<h2>\u0130\u015f Ak\u0131\u015f\u0131 Y\u00f6netimi Neden Bu Kadar Karma\u015f\u0131k?<\/h2>\n<p>Yaz\u0131l\u0131m projelerinin ba\u015flang\u0131c\u0131nda i\u015f s\u00fcre\u00e7leri genellikle olduk\u00e7a basit g\u00f6r\u00fcn\u00fcr. \u00d6rne\u011fin, bir kullan\u0131c\u0131n\u0131n kaydolma s\u00fcreci yaln\u0131zca veritaban\u0131na kay\u0131t eklemekten ibaret olabilir. Ancak, i\u015f gereksinimleri b\u00fcy\u00fcd\u00fck\u00e7e bu s\u00fcrece e-posta do\u011frulama, ho\u015f geldin SMS&#8217;i g\u00f6nderme, CRM sistemine veri aktarma ve analitik ara\u00e7lar\u0131n\u0131 tetikleme gibi yeni ad\u0131mlar eklenir. Bu ad\u0131mlar\u0131n her biri farkl\u0131 d\u0131\u015f servislerle (third-party APIs) ileti\u015fim kurmay\u0131 gerektirir.<\/p>\n<p>\u00d6zellikle d\u0131\u015f servislerin yan\u0131t vermemesi, a\u011f kesintileri veya beklenmedik sistem hatalar\u0131 durumunda s\u00fcrecin nas\u0131l davranaca\u011f\u0131 b\u00fcy\u00fck bir muammad\u0131r. E\u011fer \u00f6deme ba\u015far\u0131l\u0131 olduysa ancak stok g\u00fcncelleme s\u0131ras\u0131nda hata al\u0131nd\u0131ysa ne olacak? Kullan\u0131c\u0131n\u0131n paras\u0131 iade edilecek mi, yoksa sistem otomatik olarak i\u015flemi yeniden mi deneyecek (retry)? Bu t\u00fcr senaryolar\u0131 manuel olarak kodlamak, spagetti kod (spaghetti code) olarak adland\u0131r\u0131lan karma\u015f\u0131k yap\u0131lar\u0131n ortaya \u00e7\u0131kmas\u0131na neden olur.<\/p>\n<p>Bununla birlikte, i\u015f ak\u0131\u015flar\u0131n\u0131n izlenebilirli\u011fi (observability) de ayr\u0131 bir problemdir. Hangi i\u015flemin hangi ad\u0131mda tak\u0131ld\u0131\u011f\u0131n\u0131, hangi hatayla kar\u015f\u0131la\u015f\u0131ld\u0131\u011f\u0131n\u0131 ve s\u00fcrecin ne kadar s\u00fcrede tamamland\u0131\u011f\u0131n\u0131 g\u00f6rmek her zaman kolay olmaz. Bir i\u015f ak\u0131\u015f\u0131 motoru (workflow engine), t\u00fcm bu karma\u015f\u0131kl\u0131\u011f\u0131 soyutlayarak geli\u015ftiriciye standart, g\u00fcvenli ve izlenebilir bir yap\u0131 sunar. Go dilinin y\u00fcksek e\u015fzamanl\u0131l\u0131k (concurrency) yetenekleri sayesinde, bu s\u00fcre\u00e7leri minimum kaynak t\u00fcketimiyle y\u00f6netmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>go-workflow-engine Nedir ve Ne \u0130\u015fe Yarar?<\/h2>\n<p><code>go-workflow-engine<\/code>, Go (Golang) dili ile geli\u015ftirilmi\u015f, minimalist ve son derece esnek bir i\u015f ak\u0131\u015f\u0131 y\u00f6netim k\u00fct\u00fcphanesidir. A\u011f\u0131r ve kurulumu zor olan kurumsal i\u015f ak\u0131\u015f\u0131 motorlar\u0131n\u0131n (\u00f6rne\u011fin Camunda veya Temporal) aksine, bu k\u00fct\u00fcphane projenize do\u011frudan bir k\u00fct\u00fcphane (library) olarak dahil edilir. Herhangi bir harici sunucu veya veritaban\u0131 ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 gerektirmeden, do\u011frudan uygulama kodunuzun i\u00e7inde \u00e7al\u0131\u015f\u0131r.<\/p>\n<p>Bu k\u00fct\u00fcphanenin temel amac\u0131, i\u015f s\u00fcre\u00e7lerinizi k\u00fc\u00e7\u00fck, ba\u011f\u0131ms\u0131z ve yeniden kullan\u0131labilir g\u00f6revlere (tasks) b\u00f6lmenizi sa\u011flamakt\u0131r. Her bir g\u00f6rev, girdileri (inputs) al\u0131r, kendi mant\u0131\u011f\u0131n\u0131 \u00e7al\u0131\u015ft\u0131r\u0131r ve \u00e7\u0131kt\u0131lar\u0131 (outputs) bir sonraki g\u00f6reve aktar\u0131r. K\u00fct\u00fcphane, bu g\u00f6revlerin hangi s\u0131ra ile \u00e7al\u0131\u015faca\u011f\u0131n\u0131, hata durumlar\u0131nda nas\u0131l davran\u0131laca\u011f\u0131n\u0131 ve s\u00fcre\u00e7lerin nas\u0131l izlenece\u011fini y\u00f6netir.<\/p>\n<p>K\u00fct\u00fcphanenin sundu\u011fu temel kavramlar\u0131 \u015fu \u015fekilde \u00f6zetleyebiliriz:<\/p>\n<ul>\n<li><strong>Workflow (\u0130\u015f Ak\u0131\u015f\u0131):<\/strong> Belirli bir i\u015f s\u00fcrecini temsil eden ve g\u00f6revlerin bir araya gelmesiyle olu\u015fan yap\u0131d\u0131r.<\/li>\n<li><strong>Task (G\u00f6rev):<\/strong> \u0130\u015f ak\u0131\u015f\u0131n\u0131n en k\u00fc\u00e7\u00fck yap\u0131 ta\u015f\u0131d\u0131r. Tek bir sorumlulu\u011fu vard\u0131r (\u00f6rne\u011fin, &#8220;Kullan\u0131c\u0131ya SMS G\u00f6nder&#8221;).<\/li>\n<li><strong>Context (Ba\u011flam):<\/strong> G\u00f6revler aras\u0131nda veri ta\u015f\u0131may\u0131 sa\u011flayan g\u00fcvenli bir veri havuzudur.<\/li>\n<li><strong>Transition (Ge\u00e7i\u015f):<\/strong> Bir g\u00f6revden di\u011ferine hangi ko\u015fullarda ge\u00e7ilece\u011fini belirleyen kurallard\u0131r.<\/li>\n<\/ul>\n<h2>Ad\u0131m Ad\u0131m Kurulum ve \u0130lk \u0130\u015f Ak\u0131\u015f\u0131n\u0131n Olu\u015fturulmas\u0131<\/h2>\n<p>\u015eimdi, <code>go-workflow-engine<\/code> k\u00fct\u00fcphanesini projemize dahil edelim ve basit bir \u00fcyelik onaylama s\u00fcreci tasarlayal\u0131m. \u0130lk olarak, Go mod\u00fcl\u00fcm\u00fcz\u00fc ba\u015flatal\u0131m ve gerekli paketleri projemize \u00e7ekelim. Terminal \u00fczerinden a\u015fa\u011f\u0131daki komutlar\u0131 \u00e7al\u0131\u015ft\u0131rarak ba\u015flayabilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>go mod init go-workflow-demo\ngo get github.com\/username\/go-workflow-engine<\/code><\/pre>\n<\/div>\n<p>Paket kurulumunu tamamlad\u0131ktan sonra, ilk i\u015f ak\u0131\u015f\u0131m\u0131z\u0131 tan\u0131mlamak i\u00e7in kod yazmaya ba\u015flayabiliriz. Bu \u00f6rnekte, bir kullan\u0131c\u0131n\u0131n kaydolmas\u0131n\u0131n ard\u0131ndan veritaban\u0131na kaydedilmesi ve ard\u0131ndan bir ho\u015f geldin e-postas\u0131 g\u00f6nderilmesi ad\u0131mlar\u0131n\u0131 sim\u00fcle edece\u011fiz. A\u015fa\u011f\u0131daki kod blo\u011funda bu basit ak\u0131\u015f\u0131n nas\u0131l kuruldu\u011funu g\u00f6rebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>package main\n\nimport (\n\t\"context\"\n\t\"fmt\"\n\t\"log\"\n\t\"time\"\n\n\t\"github.com\/username\/go-workflow-engine\/workflow\"\n)\n\n\/\/ DBRegisterTask veritaban\u0131 kay\u0131t ad\u0131m\u0131n\u0131 temsil eder\ntype DBRegisterTask struct{}\n\nfunc (t *DBRegisterTask) Execute(ctx context.Context, state *workflow.State) error {\n\tfmt.Println(\"[Ad\u0131m 1] Kullan\u0131c\u0131 veritaban\u0131na kaydediliyor...\")\n\ttime.Sleep(500 * time.Millisecond) \/\/ Sim\u00fcle edilen gecikme\n\tstate.Set(\"userID\", \"usr_12345\")\n\treturn nil\n}\n\n\/\/ SendEmailTask e-posta g\u00f6nderme ad\u0131m\u0131n\u0131 temsil eder\ntype SendEmailTask struct{}\n\nfunc (t *SendEmailTask) Execute(ctx context.Context, state *workflow.State) error {\n\tuserID, _ := state.Get(\"userID\")\n\tfmt.Printf(\"[Ad\u0131m 2] %s ID'li kullan\u0131c\u0131ya ho\u015f geldin e-postas\u0131 g\u00f6nderiliyor...\\n\", userID)\n\treturn nil\n}\n\nfunc main() {\n\t\/\/ Yeni bir i\u015f ak\u0131\u015f\u0131 olu\u015fturuluyor\n\tengine := workflow.NewEngine()\n\n\t\/\/ G\u00f6revler tan\u0131mlan\u0131yor\n\tdbTask := &amp;DBRegisterTask{}\n\temailTask := &amp;SendEmailTask{}\n\n\t\/\/ \u0130\u015f ak\u0131\u015f\u0131 ad\u0131mlar\u0131 ekleniyor\n\tengine.RegisterTask(\"RegisterDB\", dbTask)\n\tengine.RegisterTask(\"SendEmail\", emailTask)\n\n\t\/\/ Ak\u0131\u015f s\u0131ras\u0131 belirleniyor\n\tengine.SetSequence([]string{\"RegisterDB\", \"SendEmail\"})\n\n\t\/\/ \u0130\u015f ak\u0131\u015f\u0131n\u0131 ba\u015flat\n\tctx := context.Background()\n\terr := engine.Start(ctx)\n\tif err != nil {\n\t\tlog.Fatalf(\"\u0130\u015f ak\u0131\u015f\u0131 hatayla sonu\u00e7land\u0131: %v\", err)\n\t}\n\n\tfmt.Println(\"\u0130\u015f ak\u0131\u015f\u0131 ba\u015far\u0131yla tamamland\u0131!\")\n}<\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki kodda, ilk olarak iki adet g\u00f6rev (task) tan\u0131mlad\u0131k. Her g\u00f6rev, <code>Execute<\/code> metoduna sahip bir yap\u0131d\u0131r (struct). <code>state<\/code> nesnesi sayesinde, ilk g\u00f6revde \u00fcretti\u011fimiz <code>userID<\/code> bilgisini g\u00fcvenli bir \u015fekilde ikinci g\u00f6reve aktarabildik. Sonu\u00e7 olarak, karma\u015f\u0131k durum y\u00f6netimleri ile u\u011fra\u015fmadan, temiz ve mod\u00fcler bir i\u015f ak\u0131\u015f\u0131 elde etmi\u015f olduk.<\/p>\n<h2>Ger\u00e7ek D\u00fcnya Senaryosu: E-Ticaret Sipari\u015f ve Kargo S\u00fcreci<\/h2>\n<p>Basit \u00f6rneklerin \u00f6tesine ge\u00e7erek, ger\u00e7ek hayatta s\u0131kl\u0131kla kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z bir e-ticaret sipari\u015f s\u00fcrecini ele alal\u0131m. Bu senaryoda, kullan\u0131c\u0131n\u0131n sepeti onaylamas\u0131ndan kargoya verilmesine kadar ge\u00e7en s\u00fcreci tasarlayaca\u011f\u0131z. \u0130\u015f ak\u0131\u015f\u0131m\u0131z \u015fu ad\u0131mlardan olu\u015facak: \u00d6deme kontrol\u00fc, stok d\u00fc\u015f\u00fcm\u00fc, fatura olu\u015fturma ve kargo \u015firketine bildirim.<\/p>\n<p>Bu s\u00fcre\u00e7te ya\u015fanabilecek olas\u0131 hatalar\u0131 da g\u00f6z \u00f6n\u00fcnde bulundurmal\u0131y\u0131z. \u00d6rne\u011fin, \u00f6deme ba\u015far\u0131l\u0131 olmas\u0131na ra\u011fmen stok yetersiz \u00e7\u0131karsa ne olacak? Bu durumda &#8220;telafi edici i\u015flem&#8221; (compensating transaction) \u00e7al\u0131\u015fmal\u0131 ve \u00f6deme iade edilmelidir. A\u015fa\u011f\u0131daki tabloda bu karma\u015f\u0131k ak\u0131\u015f\u0131n durum ge\u00e7i\u015flerini inceleyebilirsiniz:<\/p>\n<table>\n<thead>\n<tr>\n<th>Mevcut Durum<\/th>\n<th>Tetiklenen Olay<\/th>\n<th>Hedef Durum<\/th>\n<th>Hata Durumunda Aksiyon<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Sipari\u015f Al\u0131nd\u0131<\/td>\n<td>\u00d6deme Ba\u015far\u0131l\u0131<\/td>\n<td>\u00d6deme Onayland\u0131<\/td>\n<td>\u0130\u015flemi \u0130ptal Et<\/td>\n<\/tr>\n<tr>\n<td>\u00d6deme Onayland\u0131<\/td>\n<td>Stok Rezerv Edildi<\/td>\n<td>Stok G\u00fcncellendi<\/td>\n<td>\u00d6demeyi \u0130ade Et (Rollback)<\/td>\n<\/tr>\n<tr>\n<td>Stok G\u00fcncellendi<\/td>\n<td>Fatura Kesildi<\/td>\n<td>Fatura Haz\u0131r<\/td>\n<td>Stoku Geri Sal + \u00d6demeyi \u0130ade Et<\/td>\n<\/tr>\n<tr>\n<td>Fatura Haz\u0131r<\/td>\n<td>Kargoya Verildi<\/td>\n<td>Sipari\u015f Tamamland\u0131<\/td>\n<td>Destek Talebi A\u00e7<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere, her ba\u015far\u0131l\u0131 ad\u0131m bir sonrakini tetiklerken, herhangi bir ad\u0131mda ya\u015fanacak ba\u015far\u0131s\u0131zl\u0131k \u00f6nceki ad\u0131mlar\u0131n geri al\u0131nmas\u0131n\u0131 gerektirir. <code>go-workflow-engine<\/code>, bu t\u00fcr geri alma (rollback) senaryolar\u0131n\u0131 yerle\u015fik olarak destekler. Her g\u00f6reve bir <code>Rollback<\/code> metodu tan\u0131mlayarak, hata an\u0131nda sistemin otomatik olarak \u00f6nceki ad\u0131mlar\u0131 tersine i\u015fletmesini sa\u011flayabilirsiniz. Bu sayede veri tutarl\u0131l\u0131\u011f\u0131 (data consistency) her zaman korunmu\u015f olur.<\/p>\n<h2>Geli\u015fmi\u015f \u00d6zellikler: Paralel G\u00f6revler ve Hata Y\u00f6netimi Nas\u0131l Yap\u0131l\u0131r?<\/h2>\n<p>Ger\u00e7ek d\u00fcnya projelerinde t\u00fcm g\u00f6revler do\u011frusal (linear) bir s\u0131rada ilerlemez. Baz\u0131 i\u015flemlerin performans\u0131 art\u0131rmak ad\u0131na paralel olarak \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 gerekir. \u00d6rne\u011fin, bir sipari\u015f tamamland\u0131\u011f\u0131nda hem kullan\u0131c\u0131ya SMS g\u00f6ndermek hem de muhasebe sistemine veri g\u00f6ndermek istiyorsak, bu iki i\u015flemi ayn\u0131 anda ba\u015flatabiliriz. Go dilinin <code>goroutine<\/code> yap\u0131s\u0131 sayesinde bu olduk\u00e7a kolayd\u0131r ancak takibi zordur.<\/p>\n<p><code>go-workflow-engine<\/code>, paralel g\u00f6rev y\u00f6netimini dahili olarak destekler. K\u00fct\u00fcphanenin sundu\u011fu paralel grup (parallel group) \u00f6zelli\u011fi sayesinde, birden fazla g\u00f6revi ayn\u0131 anda ba\u015flatabilir ve t\u00fcm\u00fcn\u00fcn tamamlanmas\u0131n\u0131 bekleyebilirsiniz. A\u015fa\u011f\u0131daki kod \u00f6rne\u011finde, paralel g\u00f6revlerin nas\u0131l tan\u0131mland\u0131\u011f\u0131n\u0131 g\u00f6rebilirsiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\/\/ Paralel \u00e7al\u0131\u015facak g\u00f6revlerin tan\u0131mlanmas\u0131\nparallelGroup := workflow.NewParallelGroup()\n\nparallelGroup.AddTask(\"SMS_Notify\", &amp;SMSNotificationTask{})\nparallelGroup.AddTask(\"Slack_Notify\", &amp;SlackNotificationTask{})\n\n\/\/ Ana i\u015f ak\u0131\u015f\u0131na paralel grubun eklenmesi\nengine.RegisterGroup(\"Notifications\", parallelGroup)<\/code><\/pre>\n<\/div>\n<p>Hata y\u00f6netimi (error handling) taraf\u0131nda ise k\u00fct\u00fcphane bize geli\u015fmi\u015f yeniden deneme (retry) politikalar\u0131 sunar. \u00d6zellikle d\u0131\u015f servislerle \u00e7al\u0131\u015f\u0131rken, ge\u00e7ici a\u011f kesintileri nedeniyle hatalar alabiliriz. Bu durumlarda hemen hata vermek yerine, i\u015flemi belirli aral\u0131klarla yeniden denemek en do\u011fru yakla\u015f\u0131md\u0131r. \u00dcstsel geri \u00e7ekilme (exponential backoff) algoritmas\u0131 kullanarak, d\u0131\u015f servisi yormadan ak\u0131ll\u0131 yeniden denemeler yap\u0131land\u0131rabilirsiniz.<\/p>\n<h2>go-workflow-engine ile Performans Optimizasyonu Nas\u0131l Sa\u011flan\u0131r?<\/h2>\n<p>Y\u00fcksek trafikli sistemlerde \u00e7al\u0131\u015fan bir i\u015f ak\u0131\u015f\u0131 motorunun en b\u00fcy\u00fck s\u0131nav\u0131 performans ve bellek (memory) y\u00f6netimidir. Go dili, hafif yap\u0131s\u0131 sayesinde bu konuda olduk\u00e7a avantajl\u0131d\u0131r. Ancak, yanl\u0131\u015f tasarlanm\u0131\u015f bir i\u015f ak\u0131\u015f\u0131 motoru bellek s\u0131z\u0131nt\u0131lar\u0131na (memory leaks) yol a\u00e7abilir. <code>go-workflow-engine<\/code> kullan\u0131rken performans\u0131 en \u00fcst d\u00fczeye \u00e7\u0131karmak i\u00e7in dikkat edilmesi gereken baz\u0131 \u00f6nemli noktalar vard\u0131r.<\/p>\n<p>\u0130lk olarak, g\u00f6revler aras\u0131nda ta\u015f\u0131nan veri miktar\u0131n\u0131 minimumda tutmal\u0131s\u0131n\u0131z. <code>state<\/code> nesnesine devasa JSON nesneleri veya b\u00fcy\u00fck veri yap\u0131lar\u0131 koymak yerine, yaln\u0131zca ilgili verilerin benzersiz kimliklerini (ID) aktarmak ve veritaban\u0131 sorgular\u0131n\u0131 g\u00f6revlerin i\u00e7inde yapmak bellek t\u00fcketimini ciddi oranda azaltacakt\u0131r.<\/p>\n<p>Bununla birlikte, Go&#8217;nun \u00e7\u00f6p toplay\u0131c\u0131s\u0131n\u0131 (garbage collector) yormamak ad\u0131na, nesne havuzlama (object pooling) tekniklerinden yararlanabilirsiniz. S\u0131k olu\u015fturulup yok edilen i\u015f ak\u0131\u015f\u0131 nesneleri yerine, <code>sync.Pool<\/code> kullanarak \u00f6nceden olu\u015fturulmu\u015f nesneleri yeniden kullanmak, y\u00fcksek e\u015fzamanl\u0131l\u0131k gerektiren anlarda CPU \u00fczerindeki y\u00fck\u00fc hafifletecektir. Ayr\u0131ca, veritaban\u0131 ba\u011flant\u0131lar\u0131n\u0131 ve HTTP istemcilerini (HTTP client) her g\u00f6revde yeniden olu\u015fturmak yerine, tek bir global \u00f6rnek (singleton) \u00fczerinden payla\u015fmak ba\u011flant\u0131 havuzunun verimli kullan\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h2>S\u0131k\u00e7a Sorulan Sorular (SSS)<\/h2>\n<h3>1. go-workflow-engine \u00fcretim ortam\u0131 (production) i\u00e7in uygun mudur?<\/h3>\n<p>Evet, olduk\u00e7a uygundur. \u00d6zellikle mikroservisleriniz i\u00e7inde hafif, h\u0131zl\u0131 ve harici ba\u011f\u0131ml\u0131l\u0131\u011f\u0131 olmayan bir i\u015f ak\u0131\u015f\u0131 \u00e7\u00f6z\u00fcm\u00fc ar\u0131yorsan\u0131z, bu k\u00fct\u00fcphane \u00fcretim ortam\u0131nda y\u00fcksek performansla \u00e7al\u0131\u015facakt\u0131r. Ancak, \u00e7ok b\u00fcy\u00fck ve haftalarca s\u00fcren uzun soluklu (long-running) i\u015f ak\u0131\u015flar\u0131 i\u00e7in Temporal gibi durum saklama \u00f6zellikli sistemleri tercih etmek daha do\u011fru olabilir.<\/p>\n<h3>2. \u0130\u015f ak\u0131\u015f\u0131n\u0131n durumunu bir veritaban\u0131nda saklayabilir miyim?<\/h3>\n<p>Evet, k\u00fct\u00fcphane durum saklama (state persistence) aray\u00fczlerini (interface) destekler. Kendi veritaban\u0131 adapt\u00f6r\u00fcn\u00fcz\u00fc yazarak (PostgreSQL, MySQL veya Redis gibi), i\u015f ak\u0131\u015f\u0131n\u0131n kald\u0131\u011f\u0131 yeri veritaban\u0131na kaydedebilir ve sistem kapansa bile kald\u0131\u011f\u0131 yerden devam etmesini sa\u011flayabilirsiniz.<\/p>\n<h3>3. Hata durumunda t\u00fcm ak\u0131\u015f\u0131 nas\u0131l geri alabilirim (rollback)?<\/h3>\n<p>Her bir g\u00f6revinize bir <code>Rollback<\/code> metodu tan\u0131mlayarak bu i\u015flemi ger\u00e7ekle\u015ftirebilirsiniz. \u0130\u015f ak\u0131\u015f\u0131 s\u0131ras\u0131nda herhangi bir ad\u0131mda hata olu\u015ftu\u011funda, motor otomatik olarak o ana kadar ba\u015far\u0131yla tamamlanm\u0131\u015f t\u00fcm ad\u0131mlar\u0131n rollback metotlar\u0131n\u0131 ters s\u0131rayla \u00e7al\u0131\u015ft\u0131r\u0131r.<\/p>\n<h3>4. Di\u011fer dillerle yaz\u0131lm\u0131\u015f servisleri bu ak\u0131\u015fa dahil edebilir miyim?<\/h3>\n<p>K\u00fct\u00fcphane Go tabanl\u0131 olsa da, g\u00f6revlerinizin i\u00e7ine HTTP veya gRPC \u00e7a\u011fr\u0131lar\u0131 ekleyerek Java, Python veya Node.js ile yaz\u0131lm\u0131\u015f harici servisleri i\u015f ak\u0131\u015f\u0131n\u0131z\u0131n bir par\u00e7as\u0131 haline getirebilirsiniz.<\/p>\n<p>#Teknoloji #WebGeli\u015ftirme #Golang #Yaz\u0131l\u0131mGeli\u015ftirme #WorkflowEngine<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/go-plug-play-workflow-engine\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/go-plug-play-workflow-engine<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Karma\u015f\u0131k i\u015f s\u00fcre\u00e7lerini y\u00f6netmekte zorlan\u0131yor musunuz? go-workflow-engine ile Go projelerinizde tak-\u00e7al\u0131\u015ft\u0131r i\u015f ak\u0131\u015flar\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","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-43168","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>go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru - 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\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru\" \/>\n<meta property=\"og:description\" content=\"Karma\u015f\u0131k i\u015f s\u00fcre\u00e7lerini y\u00f6netmekte zorlan\u0131yor musunuz? go-workflow-engine ile Go projelerinizde tak-\u00e7al\u0131\u015ft\u0131r i\u015f ak\u0131\u015flar\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-07-08T06:06:49+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-08T06:07:25+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\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru\",\"datePublished\":\"2026-07-08T06:06:49+00:00\",\"dateModified\":\"2026-07-08T06:07:25+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\"},\"wordCount\":1900,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\",\"name\":\"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-07-08T06:06:49+00:00\",\"dateModified\":\"2026-07-08T06:07:25+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru\"}]},{\"@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":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru - 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\/go-workflow-engine-tak-calistir-is-akisi-motoru\/","og_locale":"tr_TR","og_type":"article","og_title":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru","og_description":"Karma\u015f\u0131k i\u015f s\u00fcre\u00e7lerini y\u00f6netmekte zorlan\u0131yor musunuz? go-workflow-engine ile Go projelerinizde tak-\u00e7al\u0131\u015ft\u0131r i\u015f ak\u0131\u015flar\u0131 olu\u015fturmay\u0131 ad\u0131m ad\u0131m \u00f6\u011frenin.","og_url":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-07-08T06:06:49+00:00","article_modified_time":"2026-07-08T06:07:25+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\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru","datePublished":"2026-07-08T06:06:49+00:00","dateModified":"2026-07-08T06:07:25+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/"},"wordCount":1900,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/","url":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/","name":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-07-08T06:06:49+00:00","dateModified":"2026-07-08T06:07:25+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/go-workflow-engine-tak-calistir-is-akisi-motoru\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"go-workflow-engine: Tak-\u00c7al\u0131\u015ft\u0131r \u0130\u015f Ak\u0131\u015f\u0131 Motoru"}]},{"@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\/43168","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=43168"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43168\/revisions"}],"predecessor-version":[{"id":43169,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/43168\/revisions\/43169"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=43168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=43168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=43168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}