{"id":44168,"date":"2026-08-18T09:05:21","date_gmt":"2026-08-18T06:05:21","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/"},"modified":"2026-08-18T09:05:52","modified_gmt":"2026-08-18T06:05:52","slug":"elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/","title":{"rendered":"Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek"},"content":{"rendered":"<h2>Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek<\/h2>\n<p>Da\u011f\u0131t\u0131k sistemler geli\u015ftirirken, beklenmedik hatalar\u0131n ve sistem kesintilerinin \u00f6n\u00fcne ge\u00e7mek kritik bir \u00f6neme sahiptir. Elixir, bu t\u00fcr zorluklarla ba\u015fa \u00e7\u0131kmak i\u00e7in Erlang&#8217;\u0131n sa\u011flam OTP (Open Telecom Platform) yap\u0131s\u0131n\u0131 miras alm\u0131\u015ft\u0131r ve bu yap\u0131n\u0131n temel ta\u015flar\u0131ndan biri de Supervisor&#8217;lard\u0131r. Peki, uygulaman\u0131zdaki bir s\u00fcrecin aniden \u00e7\u00f6kmesi durumunda ne olur? Ya da bir \u00f6deme i\u015fleminin tam ortas\u0131nda harici bir servise ba\u011flant\u0131 kesilirse sisteminiz nas\u0131l tepki verir? Bu makalede, Elixir&#8217;in Supervisor mekanizmas\u0131n\u0131 s\u0131f\u0131rdan in\u015fa ederek, hata toleransl\u0131 ve kendili\u011finden iyile\u015fen da\u011f\u0131t\u0131k sistemlerin nas\u0131l kurulaca\u011f\u0131n\u0131 ad\u0131m ad\u0131m inceleyece\u011fiz.<\/p>\n<h3>Elixir ve Da\u011f\u0131t\u0131k Sistemlerde G\u00fcvenilirlik Neden \u00d6nemli?<\/h3>\n<p>G\u00fcn\u00fcm\u00fcz\u00fcn s\u00fcrekli \u00e7al\u0131\u015fan ve y\u00fcksek eri\u015filebilirlik beklentisi olan uygulamalar\u0131nda, sistemlerin hatalara kar\u015f\u0131 dayan\u0131kl\u0131 olmas\u0131 bir l\u00fcks de\u011fil, bir zorunluluktur. Bir e-ticaret sitesinde \u00f6deme i\u015flemini ger\u00e7ekle\u015ftiren bir mikroservisin anl\u0131k bir hata nedeniyle \u00e7\u00f6kmesi, sadece kullan\u0131c\u0131 deneyimini olumsuz etkilemekle kalmaz, ayn\u0131 zamanda ciddi finansal kay\u0131plara da yol a\u00e7abilir. Geleneksel programlama dillerinde bu t\u00fcr durumlar genellikle karma\u015f\u0131k hata yakalama bloklar\u0131 ve manuel yeniden ba\u015flatma mekanizmalar\u0131yla y\u00f6netilmeye \u00e7al\u0131\u015f\u0131l\u0131rken, Elixir ve Erlang d\u00fcnyas\u0131nda bu sorunlara \u00e7ok daha zarif ve etkili bir \u00e7\u00f6z\u00fcm sunulur: OTP.<\/p>\n<p>OTP, \u00f6zellikle telekom\u00fcnikasyon sekt\u00f6r\u00fcndeki y\u00fcksek eri\u015filebilirlik gereksinimleri i\u00e7in tasarlanm\u0131\u015f bir dizi k\u00fct\u00fcphane ve tasar\u0131m ilkesidir. &#8220;Let it crash&#8221; (B\u0131rak \u00e7\u00f6ks\u00fcn) felsefesi, OTP&#8217;nin temelini olu\u015fturur. Bu felsefe, hatalar\u0131 karma\u015f\u0131k bir \u015fekilde d\u00fczeltmeye \u00e7al\u0131\u015fmak yerine, hatan\u0131n oldu\u011fu s\u00fcreci g\u00fcvenli bir \u015fekilde sonland\u0131r\u0131p, temiz bir ba\u015flang\u0131\u00e7la yeniden aya\u011fa kald\u0131rman\u0131n daha g\u00fcvenli ve pratik oldu\u011funu savunur. \u0130\u015fte bu noktada Supervisor&#8217;lar devreye girer. Supervisor, belirli bir sorumlulu\u011fu olan \u00e7ocuk s\u00fcre\u00e7leri (child processes) izleyen ve bu s\u00fcre\u00e7ler \u00e7\u00f6kt\u00fc\u011f\u00fcnde \u00f6nceden tan\u0131mlanm\u0131\u015f stratejilere g\u00f6re onlar\u0131 yeniden ba\u015flatan \u00f6zel bir GenServer&#8217;d\u0131r. Bu sayede, uygulaman\u0131z\u0131n genel durumu bozulmadan, hatal\u0131 s\u00fcre\u00e7ler izole edilir ve sistem kendili\u011finden iyile\u015fir. Bu mekanizma, \u00f6zellikle a\u011f ba\u011flant\u0131s\u0131 kesintileri, veritaban\u0131 hatalar\u0131 veya \u00fc\u00e7\u00fcnc\u00fc taraf API&#8217;lerinden kaynaklanan ge\u00e7ici sorunlar gibi da\u011f\u0131t\u0131k sistemlerde s\u0131k\u00e7a kar\u015f\u0131la\u015f\u0131lan durumlar i\u00e7in hayati \u00f6nem ta\u015f\u0131r. Elixir&#8217;in hafif s\u00fcre\u00e7leri ve mesajla\u015fma tabanl\u0131 e\u015fzamanl\u0131l\u0131k modeliyle birle\u015fen Supervisor&#8217;lar, karma\u015f\u0131k da\u011f\u0131t\u0131k sistemleri basit, anla\u015f\u0131l\u0131r ve bak\u0131m\u0131 kolay bir \u015fekilde in\u015fa etmenizi sa\u011flar.<\/p>\n<h3>Supervisor Nedir ve Nas\u0131l \u00c7al\u0131\u015f\u0131r?<\/h3>\n<p>Elixir&#8217;deki Supervisor (Denetleyici), Erlang\/OTP&#8217;nin kalbinde yer alan ve uygulamalar\u0131n\u0131z\u0131n hata toleransl\u0131 olmas\u0131n\u0131 sa\u011flayan temel bir bile\u015fendir. \u00d6z\u00fcnde, Supervisor bir veya daha fazla &#8220;\u00e7ocuk s\u00fcreci&#8221; (child processes) y\u00f6neten ve izleyen \u00f6zel bir GenServer&#8217;d\u0131r. Bu \u00e7ocuk s\u00fcre\u00e7ler, uygulaman\u0131z\u0131n belirli i\u015flevlerini yerine getiren di\u011fer GenServer&#8217;lar, Task&#8217;lar veya hatta ba\u015fka Supervisor&#8217;lar olabilir. Supervisor&#8217;\u0131n ana g\u00f6revi, \u00e7ocuk s\u00fcre\u00e7lerinden herhangi biri beklenmedik bir \u015fekilde sonland\u0131\u011f\u0131nda (\u00e7\u00f6kt\u00fc\u011f\u00fcnde), \u00f6nceden tan\u0131mlanm\u0131\u015f bir stratejiye g\u00f6re onu otomatik olarak yeniden ba\u015flatmakt\u0131r. Bu sayede, uygulaman\u0131z\u0131n genel stabilitesi korunur ve tek bir s\u00fcrecin hatas\u0131 t\u00fcm sistemi \u00e7\u00f6kertmez.<\/p>\n<p>Bir Supervisor&#8217;\u0131 tan\u0131mlarken, y\u00f6netece\u011fi \u00e7ocuk s\u00fcre\u00e7leri ve her \u00e7ocuk i\u00e7in bir &#8220;\u00e7ocuk belirtimi&#8221; (child specification) sa\u011flaman\u0131z gerekir. \u00c7ocuk belirtimi, s\u00fcrecin mod\u00fcl\u00fcn\u00fc, ba\u015flang\u0131\u00e7 arg\u00fcmanlar\u0131n\u0131 ve en \u00f6nemlisi, nas\u0131l ba\u015flat\u0131laca\u011f\u0131n\u0131 ve yeniden ba\u015flat\u0131laca\u011f\u0131n\u0131 belirten meta verileri i\u00e7erir. Supervisor&#8217;lar, \u00e7ocuk s\u00fcre\u00e7lerini izlerken farkl\u0131 yeniden ba\u015flatma stratejileri kullanabilirler:<\/p>\n<ul>\n<li><code>:one_for_one<\/code> (Bire Bir): En yayg\u0131n stratejidir. Yaln\u0131zca \u00e7\u00f6ken \u00e7ocuk s\u00fcreci yeniden ba\u015flat\u0131r. Di\u011fer \u00e7ocuk s\u00fcre\u00e7ler etkilenmez. Bu, ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fan s\u00fcre\u00e7ler i\u00e7in idealdir.<\/li>\n<li><code>:one_for_all<\/code> (Hepsi \u0130\u00e7in Bir): Bir \u00e7ocuk s\u00fcreci \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Supervisor t\u00fcm \u00e7ocuk s\u00fcre\u00e7leri (kendisi dahil) sonland\u0131r\u0131r ve ard\u0131ndan hepsini ba\u015ftan ba\u015flat\u0131r. Bu strateji, s\u00fcre\u00e7lerin birbirine s\u0131k\u0131ca ba\u011fl\u0131 oldu\u011fu ve birinin \u00e7\u00f6kmesinin di\u011ferlerini de ge\u00e7ersiz k\u0131ld\u0131\u011f\u0131 durumlar i\u00e7in uygundur. \u00d6rne\u011fin, bir veritaban\u0131 ba\u011flant\u0131s\u0131 y\u00f6neticisi \u00e7\u00f6kerse, ona ba\u011fl\u0131 t\u00fcm i\u015f s\u00fcre\u00e7lerinin de yeniden ba\u015flat\u0131lmas\u0131 gerekebilir.<\/li>\n<li><code>:rest_for_one<\/code> (Kalanlar \u0130\u00e7in Bir): Bir \u00e7ocuk s\u00fcreci \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Supervisor sadece \u00e7\u00f6ken s\u00fcre\u00e7ten <em>sonra<\/em> ba\u015flat\u0131lan t\u00fcm \u00e7ocuk s\u00fcre\u00e7leri sonland\u0131r\u0131r ve yeniden ba\u015flat\u0131r. \u00c7\u00f6ken s\u00fcrecin kendisi de dahil olmak \u00fczere bu s\u00fcre\u00e7ler yeniden ba\u015flat\u0131l\u0131r. Bu strateji, s\u00fcre\u00e7lerin belirli bir ba\u015flatma s\u0131ras\u0131na sahip oldu\u011fu ve sonraki s\u00fcre\u00e7lerin \u00f6nceki s\u00fcre\u00e7lere ba\u011f\u0131ml\u0131 oldu\u011fu durumlar i\u00e7in kullan\u0131\u015fl\u0131d\u0131r.<\/li>\n<li><code>:simple_one_for_one<\/code> (Basit Bire Bir): Dinamik olarak \u00e7ocuk s\u00fcreci eklemek i\u00e7in kullan\u0131l\u0131r. Bu Supervisor, ba\u015flang\u0131\u00e7ta hi\u00e7bir \u00e7ocuk s\u00fcreci ba\u015flatmaz. \u00c7ocuk s\u00fcre\u00e7ler, Supervisor&#8217;a bir mesaj g\u00f6nderilerek \u00e7al\u0131\u015fma zaman\u0131nda (runtime) ba\u015flat\u0131l\u0131r. Bu, \u00f6rne\u011fin her yeni kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131 bir s\u00fcre\u00e7 ba\u015flatman\u0131z gereken durumlarda \u00e7ok faydal\u0131d\u0131r.<\/li>\n<\/ul>\n<p>Supervisor, bu stratejileri uygulayarak, uygulaman\u0131z\u0131n hatalara kar\u015f\u0131 otomatik olarak tepki vermesini ve kendini onarmas\u0131n\u0131 sa\u011flar. Bu, geli\u015ftiricilerin hata y\u00f6netimiyle ilgili karma\u015f\u0131k mant\u0131k yazmak yerine, i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131na olanak tan\u0131r. Bir Supervisor&#8217;\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fc, bir OTP uygulamas\u0131n\u0131n ba\u015flang\u0131c\u0131ndan itibaren ba\u015flar ve uygulaman\u0131n kapanmas\u0131na kadar devam eder, b\u00f6ylece t\u00fcm \u00e7ocuk s\u00fcre\u00e7lerinin s\u00fcrekli olarak denetlenmesini sa\u011flar.<\/p>\n<h3>S\u0131f\u0131rdan Bir Supervisor Olu\u015fturma Ad\u0131mlar\u0131<\/h3>\n<p>\u015eimdi, Elixir&#8217;de kendi Supervisor&#8217;\u0131m\u0131z\u0131 nas\u0131l olu\u015fturaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m inceleyelim. Bu \u00f6rnekte, basit bir saya\u00e7 GenServer&#8217;\u0131 y\u00f6netecek bir Supervisor tasarlayaca\u011f\u0131z. Saya\u00e7, her \u00e7a\u011fr\u0131ld\u0131\u011f\u0131nda de\u011ferini art\u0131ran ve bir hata sim\u00fcle edebilen bir s\u00fcre\u00e7 olacak.<\/p>\n<h4>Ad\u0131m 1: \u00c7ocuk S\u00fcreci (GenServer) Tan\u0131mlama<\/h4>\n<p>\u00d6ncelikle, Supervisor&#8217;\u0131m\u0131z\u0131n y\u00f6nete\u011fi basit bir GenServer olu\u015ftural\u0131m. Bu GenServer, bir sayac\u0131 tutacak ve bir hata sim\u00fcle etme yetene\u011fine sahip olacak.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndefmodule MyCounter do\n  use GenServer\n\n  # GenServer Callbacks\n\n  def start_link(initial_value) do\n    GenServer.start_link(__MODULE__, initial_value, name: __MODULE__)\n  end\n\n  @impl true\n  def init(initial_value) do\n    IO.puts(\"MyCounter started with initial value: #{initial_value}\")\n    {:ok, initial_value}\n  end\n\n  @impl true\n  def handle_call(:get_value, _from, state) do\n    {:reply, state, state}\n  end\n\n  @impl true\n  def handle_call(:increment, _from, state) do\n    new_state = state + 1\n    IO.puts(\"MyCounter incremented to: #{new_state}\")\n    {:reply, new_state, new_state}\n  end\n\n  @impl true\n  def handle_call(:crash, _from, state) do\n    IO.puts(\"MyCounter is crashing now!\")\n    # Hata sim\u00fclasyonu: S\u00fcreci aniden sonland\u0131r\n    exit(:boom)\n    {:reply, :crashed, state} # Bu sat\u0131ra asla ula\u015f\u0131lamaz\n  end\n\n  @impl true\n  def terminate(reason, state) do\n    IO.puts(\"MyCounter terminating. Reason: #{inspect(reason)}, State: #{state}\")\n    :ok\n  end\n\n  # Client API\n\n  def get_value do\n    GenServer.call(__MODULE__, :get_value)\n  end\n\n  def increment do\n    GenServer.call(__MODULE__, :increment)\n  end\n\n  def crash do\n    GenServer.call(__MODULE__, :crash)\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu <code>MyCounter<\/code> mod\u00fcl\u00fc, <code>start_link\/1<\/code> ile ba\u015flat\u0131labilir, <code>get_value\/0<\/code> ile mevcut de\u011ferini sorgulayabilir, <code>increment\/0<\/code> ile de\u011ferini art\u0131rabilir ve <code>crash\/0<\/code> ile kendini kasten \u00e7\u00f6kertir. <code>init\/1<\/code> ve <code>terminate\/2<\/code> callback&#8217;leri, s\u00fcrecin ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc izlememize yard\u0131mc\u0131 olacak \u00e7\u0131kt\u0131 mesajlar\u0131 i\u00e7erir.<\/p>\n<h4>Ad\u0131m 2: \u00d6zel Supervisor Mod\u00fcl\u00fc Uygulama<\/h4>\n<p>\u015eimdi, <code>MyCounter<\/code> GenServer&#8217;\u0131m\u0131z\u0131 denetleyecek bir Supervisor olu\u015ftural\u0131m. Bu Supervisor, <code>Supervisor<\/code> davran\u0131\u015f\u0131n\u0131 kullanacak ve <code>init\/1<\/code> geri \u00e7a\u011f\u0131rmas\u0131nda \u00e7ocuk belirtimlerini tan\u0131mlayacakt\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndefmodule MyApp.Supervisor do\n  use Supervisor\n\n  def start_link(opts) do\n    Supervisor.start_link(__MODULE__, :ok, opts)\n  end\n\n  @impl true\n  def init(:ok) do\n    children = [\n      # MyCounter'\u0131 bir \u00e7ocuk s\u00fcre\u00e7 olarak tan\u0131mla\n      # :id, \u00e7ocuk s\u00fcrecin benzersiz tan\u0131mlay\u0131c\u0131s\u0131d\u0131r.\n      # :start, {Mod\u00fcl, Fonksiyon, Arg\u00fcmanlar} \u015feklinde ba\u015flang\u0131\u00e7 fonksiyonunu belirtir.\n      # :restart, s\u00fcrecin nas\u0131l yeniden ba\u015flat\u0131laca\u011f\u0131n\u0131 belirler (:permanent, :transient, :temporary).\n      # :shutdown, s\u00fcrecin nas\u0131l sonland\u0131r\u0131laca\u011f\u0131n\u0131 belirler (:brutal_kill, :infinity, veya bir zaman a\u015f\u0131m\u0131).\n      # :type, s\u00fcrecin t\u00fcr\u00fcn\u00fc belirler (:worker veya :supervisor).\n      %{\n        id: MyCounter,\n        start: {MyCounter, :start_link, [0]}, # 0 ba\u015flang\u0131\u00e7 de\u011feriyle ba\u015flat\n        restart: :permanent, # S\u00fcrekli yeniden ba\u015flat\n        shutdown: 5000,      # 5 saniye i\u00e7inde sonland\u0131r\n        type: :worker\n      }\n    ]\n\n    # Supervisor'\u0131n yeniden ba\u015flatma stratejisini belirle\n    # Bu \u00f6rnekte, sadece \u00e7\u00f6ken s\u00fcreci yeniden ba\u015flataca\u011f\u0131z.\n    opts = [strategy: :one_for_one, name: __MODULE__]\n\n    Supervisor.init(children, opts)\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu <code>MyApp.Supervisor<\/code> mod\u00fcl\u00fc, <code>MyCounter<\/code>&#8216;\u0131 <code>:permanent<\/code> (kal\u0131c\u0131) bir \u00e7ocuk olarak tan\u0131mlar. Bu, <code>MyCounter<\/code> her \u00e7\u00f6kt\u00fc\u011f\u00fcnde Supervisor taraf\u0131ndan yeniden ba\u015flat\u0131laca\u011f\u0131 anlam\u0131na gelir. <code>:shutdown<\/code> se\u00e7ene\u011fi, s\u00fcrecin nazik\u00e7e sonland\u0131r\u0131lmas\u0131 i\u00e7in 5000 milisaniye (5 saniye) s\u00fcre tan\u0131r. <code>:one_for_one<\/code> stratejisi, sadece \u00e7\u00f6ken <code>MyCounter<\/code> \u00f6rne\u011finin yeniden ba\u015flat\u0131lmas\u0131n\u0131 sa\u011flar.<\/p>\n<h4>Ad\u0131m 3: Supervisor&#8217;\u0131 Uygulama A\u011fac\u0131na Ekleme<\/h4>\n<p>Bir Elixir uygulamas\u0131nda, t\u00fcm Supervisor&#8217;lar ve \u00e7ocuk s\u00fcre\u00e7ler genellikle bir uygulama mod\u00fcl\u00fc arac\u0131l\u0131\u011f\u0131yla y\u00f6netilen bir &#8220;uygulama a\u011fac\u0131&#8221; (application tree) i\u00e7inde d\u00fczenlenir. Bu, sistemin ba\u015flat\u0131lmas\u0131 ve kapat\u0131lmas\u0131 i\u00e7in merkezi bir kontrol noktas\u0131 sa\u011flar.<\/p>\n<div class=\"code-container\">\n<pre><code>\ndefmodule MyApp.Application do\n  use Application\n\n  def start(_type, _args) do\n    children = [\n      # Uygulama Supervisor'\u0131m\u0131z\u0131 buraya ekliyoruz\n      MyApp.Supervisor\n    ]\n\n    # Uygulama a\u011fac\u0131n\u0131 ba\u015flat\n    opts = [strategy: :one_for_one, name: MyApp.Supervisor]\n    Supervisor.start_link(children, opts)\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu <code>MyApp.Application<\/code> mod\u00fcl\u00fc, uygulaman\u0131z\u0131n ana giri\u015f noktas\u0131d\u0131r. <code>start\/2<\/code> fonksiyonu, <code>MyApp.Supervisor<\/code>&#8216;\u0131 uygulama a\u011fac\u0131n\u0131n bir par\u00e7as\u0131 olarak ba\u015flat\u0131r. Bu sayede, uygulaman\u0131z ba\u015flad\u0131\u011f\u0131nda Supervisor da otomatik olarak devreye girer ve <code>MyCounter<\/code>&#8216;\u0131 denetlemeye ba\u015flar.<\/p>\n<h4>Ad\u0131m 4: \u00c7al\u0131\u015ft\u0131rma ve Davran\u0131\u015f\u0131 G\u00f6zlemleme<\/h4>\n<p>\u015eimdi bu yap\u0131y\u0131 \u00e7al\u0131\u015ft\u0131ral\u0131m ve davran\u0131\u015f\u0131n\u0131 g\u00f6zlemleyelim. Bir Elixir projesi olu\u015fturdu\u011funuzu varsayarak (<code>mix new my_app --sup<\/code>), yukar\u0131daki kodlar\u0131 ilgili dosyalara (<code>lib\/my_counter.ex<\/code>, <code>lib\/my_app\/supervisor.ex<\/code>, <code>lib\/my_app\/application.ex<\/code>) yerle\u015ftirdikten sonra, <code>iex -S mix<\/code> ile interaktif bir oturum ba\u015flatabilirsiniz.<\/p>\n<p>Uygulama ba\u015flad\u0131\u011f\u0131nda, <code>MyCounter<\/code>&#8216;\u0131n ba\u015flat\u0131ld\u0131\u011f\u0131na dair bir \u00e7\u0131kt\u0131 g\u00f6rmelisiniz:<\/p>\n<div class=\"code-container\">\n<pre><code>\niex(1)> MyCounter started with initial value: 0\n  <\/code><\/pre>\n<\/div>\n<p>\u015eimdi sayac\u0131 art\u0131r\u0131n ve de\u011ferini kontrol edin:<\/p>\n<div class=\"code-container\">\n<pre><code>\niex(2)> MyCounter.increment()\nMyCounter incremented to: 1\n1\niex(3)> MyCounter.get_value()\n1\n  <\/code><\/pre>\n<\/div>\n<p>Ve \u015fimdi <code>MyCounter<\/code>&#8216;\u0131 kasten \u00e7\u00f6kertelim:<\/p>\n<div class=\"code-container\">\n<pre><code>\niex(4)> MyCounter.crash()\nMyCounter is crashing now!\nMyCounter terminating. Reason: :boom, State: 1\nMyCounter started with initial value: 0\n  <\/code><\/pre>\n<\/div>\n<p>G\u00f6rd\u00fc\u011f\u00fcn\u00fcz gibi, <code>MyCounter<\/code> \u00e7\u00f6kt\u00fc\u011f\u00fcnde (<code>MyCounter terminating. Reason: :boom, State: 1<\/code>), Supervisor devreye girer ve onu yeniden ba\u015flat\u0131r (<code>MyCounter started with initial value: 0<\/code>). Yeniden ba\u015flat\u0131lan saya\u00e7, ba\u015flang\u0131\u00e7 de\u011feri olan <code>0<\/code> ile tekrar ba\u015flar. Bu, Supervisor&#8217;\u0131n hata tolerans\u0131 sa\u011flama ve sistemin kendili\u011finden iyile\u015fme yetene\u011finin bir g\u00f6stergesidir.<\/p>\n<h3>Yeniden Ba\u015flatma Stratejileri ve Senaryolar\u0131<\/h3>\n<p>Supervisor&#8217;lar, \u00e7ocuk s\u00fcre\u00e7lerini y\u00f6netirken farkl\u0131 yeniden ba\u015flatma stratejileri sunar. Bu stratejileri do\u011fru anlamak ve uygun senaryolarda kullanmak, uygulaman\u0131z\u0131n g\u00fcvenilirli\u011fini ve performans\u0131n\u0131 do\u011frudan etkiler.<\/p>\n<h4><code>:one_for_one<\/code> (Bire Bir) Stratejisi<\/h4>\n<p>Bu, en yayg\u0131n ve varsay\u0131lan stratejidir. Bir \u00e7ocuk s\u00fcreci \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Supervisor sadece o \u00e7\u00f6ken s\u00fcreci yeniden ba\u015flat\u0131r. Di\u011fer \u00e7ocuk s\u00fcre\u00e7ler etkilenmez ve \u00e7al\u0131\u015fmaya devam eder. Bu strateji, s\u00fcre\u00e7lerin birbirinden ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015ft\u0131\u011f\u0131 veya birinin \u00e7\u00f6kmesinin di\u011ferlerini do\u011frudan etkilemedi\u011fi durumlar i\u00e7in idealdir.<\/p>\n<p><strong>Senaryo:<\/strong> Bir web sunucusunda her gelen HTTP iste\u011fi i\u00e7in ayr\u0131 bir GenServer (veya Task) ba\u015flatt\u0131\u011f\u0131n\u0131z\u0131 d\u00fc\u015f\u00fcn\u00fcn. Bir iste\u011fi i\u015fleyen s\u00fcre\u00e7 bir hata nedeniyle \u00e7\u00f6kerse, sadece o istekle ilgili s\u00fcrecin yeniden ba\u015flat\u0131lmas\u0131 gerekir. Di\u011fer istekleri i\u015fleyen s\u00fcre\u00e7lerin etkilenmemesi, genel sistemin kesintisiz \u00e7al\u0131\u015fmas\u0131n\u0131 sa\u011flar.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# MyApp.Supervisor i\u00e7indeki children listesi\nchildren = [\n  %{\n    id: RequestProcessor,\n    start: {RequestProcessor, :start_link, []},\n    restart: :permanent,\n    type: :worker\n  },\n  %{\n    id: DatabaseClient,\n    start: {DatabaseClient, :start_link, []},\n    restart: :permanent,\n    type: :worker\n  }\n]\nopts = [strategy: :one_for_one]\n  <\/code><\/pre>\n<\/div>\n<p>Yukar\u0131daki \u00f6rnekte, <code>RequestProcessor<\/code> \u00e7\u00f6kerse, sadece o yeniden ba\u015flat\u0131l\u0131r. <code>DatabaseClient<\/code> bundan etkilenmez.<\/p>\n<h4><code>:one_for_all<\/code> (Hepsi \u0130\u00e7in Bir) Stratejisi<\/h4>\n<p>Bu strateji, bir \u00e7ocuk s\u00fcreci \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Supervisor&#8217;\u0131n <em>t\u00fcm<\/em> \u00e7ocuk s\u00fcre\u00e7leri sonland\u0131r\u0131p ard\u0131ndan hepsini ba\u015ftan ba\u015flatmas\u0131n\u0131 sa\u011flar. Bu, s\u00fcre\u00e7lerin birbirine s\u0131k\u0131ca ba\u011fl\u0131 oldu\u011fu ve birinin durumunun di\u011ferlerinin durumu i\u00e7in kritik oldu\u011fu durumlarda kullan\u0131l\u0131r.<\/p>\n<p><strong>Senaryo:<\/strong> Bir \u00f6deme a\u011f ge\u00e7idi entegrasyonu d\u00fc\u015f\u00fcnebiliriz. Bu a\u011f ge\u00e7idi, bir HTTP istemcisi, bir kimlik do\u011frulama belirteci (token) y\u00f6neticisi ve bir i\u015flem g\u00fcnl\u00fc\u011f\u00fc kaydedici gibi birden fazla bile\u015fenden olu\u015fabilir. E\u011fer kimlik do\u011frulama belirteci y\u00f6neticisi \u00e7\u00f6kerse, HTTP istemcisinin veya i\u015flem g\u00fcnl\u00fc\u011f\u00fc kaydedicinin g\u00fcncel olmayan veya ge\u00e7ersiz bir belirte\u00e7le \u00e7al\u0131\u015fmas\u0131 anlams\u0131z hale gelir. Bu durumda, t\u00fcm bu bile\u015fenlerin birlikte yeniden ba\u015flat\u0131lmas\u0131, sistemin tutarl\u0131 bir duruma geri d\u00f6nmesini sa\u011flar.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# MyApp.PaymentGateway.Supervisor i\u00e7indeki children listesi\nchildren = [\n  %{id: HttpClient, start: {HttpClient, :start_link, []}},\n  %{id: TokenManager, start: {TokenManager, :start_link, []}},\n  %{id: TransactionLogger, start: {TransactionLogger, :start_link, []}}\n]\nopts = [strategy: :one_for_all]\n  <\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131da, <code>TokenManager<\/code> \u00e7\u00f6kerse, <code>HttpClient<\/code> ve <code>TransactionLogger<\/code> da sonland\u0131r\u0131l\u0131p yeniden ba\u015flat\u0131l\u0131r.<\/p>\n<h4><code>:rest_for_one<\/code> (Kalanlar \u0130\u00e7in Bir) Stratejisi<\/h4>\n<p>Bir \u00e7ocuk s\u00fcreci \u00e7\u00f6kt\u00fc\u011f\u00fcnde, Supervisor o s\u00fcre\u00e7ten <em>sonra<\/em> ba\u015flat\u0131lan t\u00fcm \u00e7ocuk s\u00fcre\u00e7leri sonland\u0131r\u0131r ve yeniden ba\u015flat\u0131r. \u00c7\u00f6ken s\u00fcrecin kendisi de dahil olmak \u00fczere bu s\u00fcre\u00e7ler yeniden ba\u015flat\u0131l\u0131r. Bu strateji, s\u00fcre\u00e7lerin belirli bir ba\u015flatma s\u0131ras\u0131na sahip oldu\u011fu ve sonraki s\u00fcre\u00e7lerin \u00f6nceki s\u00fcre\u00e7lere ba\u011f\u0131ml\u0131 oldu\u011fu durumlar i\u00e7in idealdir.<\/p>\n<p><strong>Senaryo:<\/strong> Bir veri i\u015fleme hatt\u0131 hayal edin. \u0130lk s\u00fcre\u00e7 veriyi al\u0131r, ikinci s\u00fcre\u00e7 veriyi temizler, \u00fc\u00e7\u00fcnc\u00fc s\u00fcre\u00e7 veriyi analiz eder. E\u011fer veri temizleme s\u00fcreci (ikinci s\u00fcre\u00e7) \u00e7\u00f6kerse, ondan sonraki analiz s\u00fcrecinin \u00e7al\u0131\u015fmaya devam etmesi anlams\u0131zd\u0131r \u00e7\u00fcnk\u00fc temizlenmemi\u015f veri \u00fczerinde \u00e7al\u0131\u015facakt\u0131r. Bu durumda, veri temizleme s\u00fcrecini ve ondan sonraki t\u00fcm s\u00fcre\u00e7leri yeniden ba\u015flatmak mant\u0131kl\u0131d\u0131r. Veri al\u0131m s\u00fcreci (birinci s\u00fcre\u00e7) ise etkilenmeden \u00e7al\u0131\u015fmaya devam edebilir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# MyApp.DataPipeline.Supervisor i\u00e7indeki children listesi\nchildren = [\n  %{id: DataIngestor, start: {DataIngestor, :start_link, []}},\n  %{id: DataCleaner, start: {DataCleaner, :start_link, []}},\n  %{id: DataAnalyzer, start: {DataAnalyzer, :start_link, []}}\n]\nopts = [strategy: :rest_for_one]\n  <\/code><\/pre>\n<\/div>\n<p>Burada, <code>DataCleaner<\/code> \u00e7\u00f6kerse, <code>DataCleaner<\/code> ve <code>DataAnalyzer<\/code> yeniden ba\u015flat\u0131l\u0131r. <code>DataIngestor<\/code> ise \u00e7al\u0131\u015fmaya devam eder.<\/p>\n<h4><code>:simple_one_for_one<\/code> (Basit Bire Bir) Stratejisi<\/h4>\n<p>Bu strateji, \u00e7al\u0131\u015fma zaman\u0131nda (runtime) dinamik olarak \u00e7ocuk s\u00fcre\u00e7leri ba\u015flatmak i\u00e7in kullan\u0131l\u0131r. Supervisor ba\u015flang\u0131\u00e7ta hi\u00e7bir \u00e7ocuk s\u00fcreci ba\u015flatmaz. \u00c7ocuk s\u00fcre\u00e7ler, Supervisor&#8217;a bir mesaj g\u00f6nderilerek (genellikle <code>Supervisor.start_child\/2<\/code> veya <code>Supervisor.start_child\/3<\/code> ile) ba\u015flat\u0131l\u0131r.<\/p>\n<p><strong>Senaryo:<\/strong> Bir sohbet uygulamas\u0131 veya oyun sunucusu gibi bir sistemde, her yeni kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131 bir s\u00fcre\u00e7 ba\u015flatman\u0131z gerekebilir. Bu s\u00fcre\u00e7lerin say\u0131s\u0131 \u00f6nceden belli de\u011fildir ve dinamik olarak de\u011fi\u015fir. <code>:simple_one_for_one<\/code> Supervisor, her yeni ba\u011flant\u0131 geldi\u011finde bir kullan\u0131c\u0131 oturumu s\u00fcrecini ba\u015flatmak i\u00e7in m\u00fckemmel bir se\u00e7imdir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# MyApp.UserSession.Supervisor i\u00e7indeki init fonksiyonu\ndef init(:ok) do\n  children = [\n    # \u00c7ocuk belirtimi, dinamik olarak ba\u015flat\u0131lacak s\u00fcre\u00e7 i\u00e7in bir \u015fablon g\u00f6revi g\u00f6r\u00fcr.\n    # Arg\u00fcmanlar, start_child \u00e7a\u011fr\u0131s\u0131nda sa\u011flan\u0131r.\n    %{\n      id: UserSession,\n      start: {UserSession, :start_link, []}, # Arg\u00fcmanlar bo\u015f b\u0131rak\u0131l\u0131r\n      type: :worker,\n      restart: :temporary # Oturumlar genellikle ge\u00e7icidir\n    }\n  ]\n  opts = [strategy: :simple_one_for_one, name: __MODULE__]\n  Supervisor.init(children, opts)\nend\n\n# UserSession.Supervisor'dan dinamik olarak \u00e7ocuk ba\u015flatma\n# Supervisor.start_child(MyApp.UserSession.Supervisor, [user_id, socket_pid])\n  <\/code><\/pre>\n<\/div>\n<p><code>:simple_one_for_one<\/code> stratejisi, \u00f6zellikle sunucu taraf\u0131nda ba\u011flant\u0131 y\u00f6neticileri veya i\u015fleme kuyruklar\u0131 gibi dinamik kaynaklar\u0131 y\u00f6netmek i\u00e7in vazge\u00e7ilmezdir. Her stratejinin kendine \u00f6zg\u00fc avantajlar\u0131 ve kullan\u0131m alanlar\u0131 vard\u0131r. Do\u011fru stratejiyi se\u00e7mek, sisteminizin hata tolerans\u0131 ve kaynak y\u00f6netimi a\u00e7\u0131s\u0131ndan ne kadar verimli olaca\u011f\u0131n\u0131 belirler.<\/p>\n<h3>Ger\u00e7ek D\u00fcnya Uygulamalar\u0131: Bir \u00d6deme A\u011f Ge\u00e7idi Y\u00f6netimi<\/h3>\n<p>Elixir&#8217;deki Supervisor&#8217;lar\u0131n ger\u00e7ek d\u00fcnyadaki g\u00fcc\u00fcn\u00fc anlamak i\u00e7in, bir \u00f6deme a\u011f ge\u00e7idi sistemini ele alal\u0131m. Bu sistem, farkl\u0131 bile\u015fenlerin bir araya gelerek \u00e7al\u0131\u015ft\u0131\u011f\u0131 ve her birinin hataya dayan\u0131kl\u0131 olmas\u0131 gereken karma\u015f\u0131k bir yap\u0131d\u0131r. Bir \u00f6deme i\u015fleminin ba\u015far\u0131l\u0131 bir \u015fekilde tamamlanmas\u0131, bir\u00e7ok alt s\u00fcrecin hatas\u0131z \u00e7al\u0131\u015fmas\u0131na ba\u011fl\u0131d\u0131r.<\/p>\n<h4>Vaka Analizi: Hata Toleransl\u0131 \u00d6deme \u0130\u015flemleri<\/h4>\n<p>Bir \u00f6deme a\u011f ge\u00e7idi, genellikle a\u015fa\u011f\u0131daki ana bile\u015fenleri i\u00e7erir:<\/p>\n<ol>\n<li><strong>Veritaban\u0131 Ba\u011flant\u0131s\u0131 Y\u00f6neticisi (<code>DatabaseConnection<\/code>):<\/strong> \u00d6deme bilgilerini, i\u015flem kay\u0131tlar\u0131n\u0131 ve kullan\u0131c\u0131 verilerini saklar.<\/li>\n<li><strong>Harici \u00d6deme Sa\u011flay\u0131c\u0131 \u0130stemcisi (<code>PaymentProviderClient<\/code>):<\/strong> PayPal, Stripe gibi \u00fc\u00e7\u00fcnc\u00fc taraf \u00f6deme sa\u011flay\u0131c\u0131lar\u0131yla ileti\u015fim kurar.<\/li>\n<li><strong>\u0130\u015flem \u0130\u015fleyici (<code>TransactionProcessor<\/code>):<\/strong> Gelen \u00f6deme taleplerini al\u0131r, do\u011frular ve \u00f6deme sa\u011flay\u0131c\u0131ya y\u00f6nlendirir.<\/li>\n<li><strong>Bildirim G\u00f6nderici (<code>NotificationSender<\/code>):<\/strong> \u00d6deme ba\u015far\u0131l\u0131 oldu\u011funda veya ba\u015far\u0131s\u0131z oldu\u011funda kullan\u0131c\u0131lara e-posta veya SMS bildirimleri g\u00f6nderir.<\/li>\n<\/ol>\n<p>Bu bile\u015fenlerin her biri, bir Elixir GenServer&#8217;\u0131 olarak uygulanabilir. \u015eimdi bu bile\u015fenleri bir Supervisor a\u011fac\u0131nda nas\u0131l y\u00f6netece\u011fimizi tasarlayal\u0131m.<\/p>\n<h4>\u00d6deme A\u011f Ge\u00e7idi Supervisor Yap\u0131s\u0131<\/h4>\n<p>Ana uygulama Supervisor&#8217;\u0131m\u0131z, bu bile\u015fenleri y\u00f6netecek bir alt Supervisor&#8217;\u0131 ba\u015flatabilir. Bu alt Supervisor&#8217;\u0131n kendi i\u00e7inde farkl\u0131 yeniden ba\u015flatma stratejileri kullanmas\u0131 gerekebilir.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# lib\/payment_gateway\/supervisor.ex\ndefmodule PaymentGateway.Supervisor do\n  use Supervisor\n\n  def start_link(opts) do\n    Supervisor.start_link(__MODULE__, :ok, opts)\n  end\n\n  @impl true\n  def init(:ok) do\n    children = [\n      # Veritaban\u0131 ba\u011flant\u0131s\u0131 kritik ve di\u011fer t\u00fcm s\u00fcre\u00e7ler ona ba\u011f\u0131ml\u0131 olabilir.\n      # \u00c7\u00f6kerse, t\u00fcm sistemi yeniden ba\u015flatmak mant\u0131kl\u0131 olabilir.\n      %{\n        id: PaymentGateway.DatabaseConnection,\n        start: {PaymentGateway.DatabaseConnection, :start_link, []},\n        restart: :permanent,\n        shutdown: :infinity, # Veritaban\u0131 ba\u011flant\u0131s\u0131 kritik, sonsuz bekle\n        type: :worker\n      },\n      # \u00d6deme sa\u011flay\u0131c\u0131 istemcisi, veritaban\u0131na ve i\u015flemciye ba\u011f\u0131ml\u0131 olabilir.\n      # Hata verirse, sadece kendini yeniden ba\u015flatmas\u0131 yeterli olabilir.\n      %{\n        id: PaymentGateway.PaymentProviderClient,\n        start: {PaymentGateway.PaymentProviderClient, :start_link, []},\n        restart: :permanent,\n        shutdown: 15_000, # 15 saniye i\u00e7inde sonland\u0131r\n        type: :worker\n      },\n      # \u0130\u015flem i\u015fleyici, hem veritaban\u0131na hem de \u00f6deme sa\u011flay\u0131c\u0131ya ba\u011f\u0131ml\u0131d\u0131r.\n      # \u00d6nceki s\u00fcre\u00e7ler yeniden ba\u015flat\u0131l\u0131rsa, bu da yeniden ba\u015flat\u0131lmal\u0131.\n      %{\n        id: PaymentGateway.TransactionProcessor,\n        start: {PaymentGateway.TransactionProcessor, :start_link, []},\n        restart: :permanent,\n        shutdown: 10_000, # 10 saniye i\u00e7inde sonland\u0131r\n        type: :worker\n      },\n      # Bildirim g\u00f6nderici, di\u011ferlerinden daha az kritik olabilir ve ba\u011f\u0131ms\u0131z \u00e7al\u0131\u015fabilir.\n      %{\n        id: PaymentGateway.NotificationSender,\n        start: {PaymentGateway.NotificationSender, :start_link, []},\n        restart: :permanent,\n        shutdown: 5_000, # 5 saniye i\u00e7inde sonland\u0131r\n        type: :worker\n      }\n    ]\n\n    # Strateji se\u00e7imi: E\u011fer veritaban\u0131 ba\u011flant\u0131s\u0131 \u00e7\u00f6kerse, t\u00fcm \u00f6deme a\u011f ge\u00e7idi bile\u015fenlerinin\n    # tutarl\u0131 bir duruma d\u00f6nmesi i\u00e7in :one_for_all stratejisi d\u00fc\u015f\u00fcn\u00fclebilir.\n    # Ancak, e\u011fer her bile\u015fen kendi ba\u015f\u0131na hata verebiliyor ve ba\u011f\u0131ms\u0131z olarak iyile\u015febiliyorsa,\n    # :one_for_one daha uygun olabilir. Bu \u00f6rnekte, genel bir tutarl\u0131l\u0131k i\u00e7in :one_for_all se\u00e7elim.\n    # Alternatif olarak, DatabaseConnection i\u00e7in ayr\u0131 bir Supervisor ve di\u011ferleri i\u00e7in :one_for_one\n    # kullanan bir \u00fcst Supervisor da yap\u0131labilir.\n    opts = [strategy: :one_for_all, name: __MODULE__]\n    Supervisor.init(children, opts)\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu <code>PaymentGateway.Supervisor<\/code>, <code>:one_for_all<\/code> stratejisi ile yap\u0131land\u0131r\u0131lm\u0131\u015ft\u0131r. Bunun anlam\u0131 \u015fudur: E\u011fer <code>PaymentGateway.DatabaseConnection<\/code> gibi kritik bir bile\u015fen \u00e7\u00f6kerse, t\u00fcm \u00f6deme a\u011f ge\u00e7idi bile\u015fenleri (istemci, i\u015flemci, bildirim g\u00f6nderici) de sonland\u0131r\u0131l\u0131r ve ard\u0131ndan hepsi birlikte yeniden ba\u015flat\u0131l\u0131r. Bu, sistemin tutarl\u0131 bir ba\u015flang\u0131\u00e7 durumuna d\u00f6nmesini sa\u011flar. E\u011fer sadece <code>PaymentGateway.PaymentProviderClient<\/code> ge\u00e7ici bir a\u011f hatas\u0131 nedeniyle \u00e7\u00f6kerse, yine de t\u00fcm di\u011fer bile\u015fenler yeniden ba\u015flat\u0131lacakt\u0131r. Bu, baz\u0131 durumlarda gereksiz olabilir ancak sistemin genel tutarl\u0131l\u0131\u011f\u0131n\u0131 garanti alt\u0131na al\u0131r.<\/p>\n<p>Alternatif bir yakla\u015f\u0131m olarak, <code>PaymentGateway.DatabaseConnection<\/code>&#8216;\u0131 ayr\u0131 bir Supervisor alt\u0131nda <code>:one_for_one<\/code> stratejisiyle y\u00f6netip, di\u011fer bile\u015fenleri de ba\u015fka bir Supervisor alt\u0131nda <code>:one_for_one<\/code> ile y\u00f6netebiliriz. Bu, daha mod\u00fcler bir yap\u0131 sa\u011flar ve hatalar\u0131n kapsam\u0131n\u0131 daralt\u0131r. Ancak, veritaban\u0131 ba\u011flant\u0131s\u0131n\u0131n kesilmesi durumunda di\u011fer t\u00fcm s\u00fcre\u00e7lerin de ge\u00e7ersiz hale gelece\u011fi bir senaryoda, <code>:one_for_all<\/code> daha basit ve g\u00fcvenli bir \u00e7\u00f6z\u00fcm sunar.<\/p>\n<p>Bu vaka analizi, Elixir Supervisor&#8217;lar\u0131n\u0131n karma\u015f\u0131k da\u011f\u0131t\u0131k sistemlerde hata tolerans\u0131n\u0131 nas\u0131l sa\u011flad\u0131\u011f\u0131n\u0131 g\u00f6stermektedir. Her bile\u015fen, kendi sorumlulu\u011funa odaklan\u0131rken, Supervisor onlar\u0131n ya\u015fam d\u00f6ng\u00fcs\u00fcn\u00fc denetleyerek sistemin genel kararl\u0131l\u0131\u011f\u0131n\u0131 garanti alt\u0131na al\u0131r. Bu sayede, geli\u015ftiriciler beklenmedik hatalarla ba\u015fa \u00e7\u0131kmak i\u00e7in karma\u015f\u0131k manuel mekanizmalar yazmak zorunda kalmaz, bunun yerine i\u015f mant\u0131\u011f\u0131na odaklanabilirler.<\/p>\n<h3>\u0130leri D\u00fczey Supervisor Kullan\u0131m\u0131 ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Supervisor&#8217;lar, temel yeniden ba\u015flatma stratejilerinin \u00f6tesinde, daha karma\u015f\u0131k senaryolar\u0131 y\u00f6netmek i\u00e7in de g\u00fc\u00e7l\u00fc yetenekler sunar. Deneyimli Elixir geli\u015ftiricileri i\u00e7in baz\u0131 ileri d\u00fczey kullan\u0131m ipu\u00e7lar\u0131 ve p\u00fcf noktalar\u0131 \u015funlard\u0131r:<\/p>\n<h4>Dinamik Denetim (Dynamic Supervision)<\/h4>\n<p>Daha \u00f6nce bahsetti\u011fimiz <code>:simple_one_for_one<\/code> stratejisi, dinamik olarak \u00e7ocuk s\u00fcre\u00e7leri ba\u015flatmak i\u00e7in harikad\u0131r. Ancak bazen, belirli bir adla ba\u015flat\u0131lan s\u00fcre\u00e7leri denetlemeniz veya mevcut bir Supervisor&#8217;a \u00e7al\u0131\u015fma zaman\u0131nda yeni \u00e7ocuk belirtimleri eklemeniz gerekebilir. <code>Supervisor.start_child\/2<\/code> veya <code>Supervisor.start_child\/3<\/code> fonksiyonlar\u0131, bu t\u00fcr dinamik ba\u015flatmalar i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong> Bir web soketi sunucusunda, her yeni kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 i\u00e7in ayr\u0131 bir oturum s\u00fcreci ba\u015flatman\u0131z gerekebilir. Bu oturum s\u00fcre\u00e7leri, kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 kesildi\u011finde otomatik olarak sonland\u0131r\u0131lmal\u0131d\u0131r.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# lib\/websocket_manager\/supervisor.ex\ndefmodule WebsocketManager.Supervisor do\n  use Supervisor\n\n  def start_link(opts) do\n    Supervisor.start_link(__MODULE__, :ok, opts)\n  end\n\n  @impl true\n  def init(:ok) do\n    children = [\n      # UserSession i\u00e7in bir \u015fablon tan\u0131ml\u0131yoruz.\n      # start fonksiyonundaki arg\u00fcmanlar bo\u015f b\u0131rak\u0131l\u0131r, \u00e7\u00fcnk\u00fc bunlar start_child \u00e7a\u011fr\u0131s\u0131nda sa\u011flanacakt\u0131r.\n      %{\n        id: UserSession,\n        start: {UserSession, :start_link, []},\n        type: :worker,\n        restart: :temporary # Kullan\u0131c\u0131 ayr\u0131ld\u0131\u011f\u0131nda oturum s\u00fcreci sonlanmal\u0131\n      }\n    ]\n\n    opts = [strategy: :simple_one_for_one, name: __MODULE__]\n    Supervisor.init(children, opts)\n  end\n\n  # Client API: Yeni bir kullan\u0131c\u0131 oturumu ba\u015flatmak i\u00e7in\n  def start_user_session(user_id, socket_pid) do\n    # UserSession'\u0131n start_link\/2 fonksiyonu i\u00e7in arg\u00fcmanlar\u0131 sa\u011fl\u0131yoruz\n    Supervisor.start_child(__MODULE__, [user_id, socket_pid])\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu sayede, <code>WebsocketManager.Supervisor.start_user_session(user_id, socket_pid)<\/code> \u00e7a\u011fr\u0131s\u0131 ile her yeni kullan\u0131c\u0131 i\u00e7in dinamik olarak bir <code>UserSession<\/code> s\u00fcreci ba\u015flat\u0131labilir. <code>:temporary<\/code> yeniden ba\u015flatma stratejisi, s\u00fcre\u00e7 normal bir \u015fekilde sonland\u0131\u011f\u0131nda (kullan\u0131c\u0131 ba\u011flant\u0131s\u0131 kesildi\u011finde) Supervisor&#8217;\u0131n onu yeniden ba\u015flatmamas\u0131n\u0131 sa\u011flar, ancak bir hata nedeniyle \u00e7\u00f6kerse yeniden ba\u015flat\u0131r.<\/p>\n<h4>\u00d6zel Yeniden Ba\u015flatma Mant\u0131\u011f\u0131 ve Hata E\u015fi\u011fi<\/h4>\n<p>Supervisor&#8217;lar, s\u00fcre\u00e7leri yeniden ba\u015flat\u0131rken bir hata e\u015fi\u011fi (<code>max_restarts<\/code> ve <code>max_seconds<\/code>) belirlemenize olanak tan\u0131r. Bu, bir s\u00fcrecin belirli bir s\u00fcre i\u00e7inde \u00e7ok s\u0131k \u00e7\u00f6kmesi durumunda Supervisor&#8217;\u0131n pes etmesini ve t\u00fcm Supervisor a\u011fac\u0131n\u0131 (veya \u00fcst Supervisor&#8217;\u0131) \u00e7\u00f6kertmesini sa\u011flar. Bu, sonsuz bir yeniden ba\u015flatma d\u00f6ng\u00fcs\u00fcne girmeyi \u00f6nler ve ciddi bir hatan\u0131n \u00fcst katmanlara bildirilmesini sa\u011flar.<\/p>\n<div class=\"code-container\">\n<pre><code>\n# Supervisor.init opts k\u0131sm\u0131nda\nopts = [\n  strategy: :one_for_one,\n  name: __MODULE__,\n  max_restarts: 3, # 5 saniye i\u00e7inde 3'ten fazla yeniden ba\u015flatma olursa\n  max_seconds: 5   # Supervisor da \u00e7\u00f6ker.\n]\n  <\/code><\/pre>\n<\/div>\n<p>Bu yap\u0131land\u0131rma, belirli bir \u00e7ocuk s\u00fcrecinin s\u00fcrekli olarak hata vermesi durumunda, Supervisor&#8217;\u0131n kendisinin de ba\u015far\u0131s\u0131z olmas\u0131n\u0131 sa\u011flayarak daha b\u00fcy\u00fck bir sorunun sinyalini verir. Bu, bir s\u00fcrecin s\u00fcrekli \u00e7\u00f6kmesine neden olan temel bir yaz\u0131l\u0131m hatas\u0131 oldu\u011funda \u00f6nemlidir.<\/p>\n<h4>Supervisor A\u011fa\u00e7lar\u0131n\u0131n Tasar\u0131m\u0131<\/h4>\n<p>Karma\u015f\u0131k uygulamalarda, tek bir Supervisor t\u00fcm \u00e7ocuk s\u00fcre\u00e7leri y\u00f6netmek i\u00e7in yeterli olmayabilir. Genellikle, uygulaman\u0131z\u0131n farkl\u0131 mant\u0131ksal alanlar\u0131 i\u00e7in ayr\u0131 Supervisor&#8217;lar olu\u015fturursunuz ve bu Supervisor&#8217;lar\u0131 daha \u00fcst d\u00fczey bir &#8220;uygulama Supervisor&#8217;\u0131&#8221; alt\u0131nda grupland\u0131r\u0131rs\u0131n\u0131z. Bu, Supervisor&#8217;lar\u0131 bir a\u011fa\u00e7 yap\u0131s\u0131nda d\u00fczenleyerek sorumluluklar\u0131 ay\u0131rman\u0131za ve hatalar\u0131n etkisini izole etmenize olanak tan\u0131r.<\/p>\n<p><strong>\u00d6rnek:<\/strong><\/p>\n<div class=\"code-container\">\n<pre><code>\n# lib\/my_app\/application.ex\ndefmodule MyApp.Application do\n  use Application\n\n  def start(_type, _args) do\n    children = [\n      # \u00d6deme A\u011f Ge\u00e7idi Supervisor'\u0131\n      PaymentGateway.Supervisor,\n      # Kullan\u0131c\u0131 Y\u00f6netimi Supervisor'\u0131\n      UserManager.Supervisor,\n      # Bildirimler Supervisor'\u0131\n      Notification.Supervisor\n    ]\n\n    opts = [strategy: :one_for_one, name: MyApp.Supervisor]\n    Supervisor.start_link(children, opts)\n  end\nend\n  <\/code><\/pre>\n<\/div>\n<p>Bu hiyerar\u015fik yap\u0131, uygulaman\u0131n farkl\u0131 domain&#8217;lerinin ba\u011f\u0131ms\u0131z olarak y\u00f6netilmesini sa\u011flar. \u00d6rne\u011fin, <code>UserManager.Supervisor<\/code> alt\u0131ndaki bir s\u00fcre\u00e7 \u00e7\u00f6kerse, bu durum <code>PaymentGateway.Supervisor<\/code>&#8216;\u0131 veya onun \u00e7ocuk s\u00fcre\u00e7lerini etkilemez. Bu, mod\u00fclerli\u011fi art\u0131r\u0131r ve bak\u0131m kolayl\u0131\u011f\u0131 sa\u011flar.<\/p>\n<p>Bu ileri d\u00fczey teknikler, Elixir&#8217;de daha sa\u011flam, \u00f6l\u00e7eklenebilir ve y\u00f6netilebilir da\u011f\u0131t\u0131k sistemler in\u015fa etmenize yard\u0131mc\u0131 olur. Supervisor&#8217;lar, Elixir&#8217;in &#8220;Let it crash&#8221; felsefesinin pratik uygulamas\u0131n\u0131 temsil eder ve sistemlerinizi beklenmedik durumlara kar\u015f\u0131 dayan\u0131kl\u0131 hale getirmenin anahtar\u0131d\u0131r.<\/p>\n<h3>Sonu\u00e7 ve S\u0131k\u00e7a Sorulan Sorular<\/h3>\n<p>Bu makalede, Elixir&#8217;in da\u011f\u0131t\u0131k sistemlerde hata tolerans\u0131 sa\u011flaman\u0131n temel ta\u015f\u0131 olan Supervisor mekanizmas\u0131n\u0131 s\u0131f\u0131rdan in\u015fa etmeyi \u00f6\u011frendik. OTP&#8217;nin &#8220;Let it crash&#8221; felsefesini benimseyerek, sistemlerimizi beklenmedik hatalara kar\u015f\u0131 daha diren\u00e7li hale getirebilir ve kendili\u011finden iyile\u015fen uygulamalar olu\u015fturabiliriz. \u00c7ocuk s\u00fcre\u00e7leri tan\u0131mlamaktan, Supervisor mod\u00fcl\u00fcn\u00fc uygulamaya ve farkl\u0131 yeniden ba\u015flatma stratejilerini anlamaya kadar, Elixir&#8217;in bu g\u00fc\u00e7l\u00fc yetene\u011fini nas\u0131l kullanaca\u011f\u0131m\u0131z\u0131 ad\u0131m ad\u0131m g\u00f6rd\u00fck. Ger\u00e7ek d\u00fcnya senaryolar\u0131yla peki\u015ftirilen bu bilgiler, Elixir ile sa\u011flam ve g\u00fcvenilir sistemler geli\u015ftirmeniz i\u00e7in size sa\u011flam bir temel sunmaktad\u0131r.<\/p>\n<p>Supervisor&#8217;lar, karma\u015f\u0131k da\u011f\u0131t\u0131k sistemlerin y\u00f6netimini basitle\u015ftirir, geli\u015ftiricilerin hata y\u00f6netimi yerine i\u015f mant\u0131\u011f\u0131na odaklanmas\u0131n\u0131 sa\u011flar ve uygulaman\u0131n genel kararl\u0131l\u0131\u011f\u0131n\u0131 art\u0131r\u0131r. Dinamik denetim, hata e\u015fikleri ve hiyerar\u015fik Supervisor a\u011fa\u00e7lar\u0131 gibi ileri d\u00fczey teknikler sayesinde, Elixir ile in\u015fa etti\u011finiz sistemler sadece \u00e7al\u0131\u015fmakla kalmaz, ayn\u0131 zamanda zorlu ko\u015fullar alt\u0131nda bile g\u00fcvenilirli\u011fini korur.<\/p>\n<h4>S\u0131k\u00e7a Sorulan Sorular<\/h4>\n<p><strong>1. Supervisor&#8217;lar sadece GenServer&#8217;lar\u0131 m\u0131 denetleyebilir?<\/strong><\/p>\n<p>Hay\u0131r, Supervisor&#8217;lar sadece GenServer&#8217;lar\u0131 de\u011fil, ayn\u0131 zamanda di\u011fer Supervisor&#8217;lar\u0131, Task&#8217;lar\u0131 ve hatta temel Elixir s\u00fcre\u00e7lerini de denetleyebilir. \u00c7ocuk belirtiminde <code>:start<\/code> anahtar\u0131n\u0131 kullanarak s\u00fcrecin nas\u0131l ba\u015flat\u0131laca\u011f\u0131n\u0131 belirtmeniz yeterlidir.<\/p>\n<p><strong>2. Bir \u00e7ocuk s\u00fcreci neden <code>:temporary<\/code> olarak ba\u015flat\u0131l\u0131r?<\/strong><\/p>\n<p><code>:temporary<\/code> (ge\u00e7ici) yeniden ba\u015flatma stratejisi, bir s\u00fcrecin normal bir \u015fekilde sonland\u0131\u011f\u0131nda (yani, hata vermeden) Supervisor taraf\u0131ndan yeniden ba\u015flat\u0131lmamas\u0131n\u0131 sa\u011flar. Ancak, s\u00fcre\u00e7 beklenmedik bir hata nedeniyle \u00e7\u00f6kerse, Supervisor onu yeniden ba\u015flat\u0131r. Bu, genellikle dinamik olarak ba\u015flat\u0131lan ve belirli bir g\u00f6revi tamamlad\u0131ktan sonra sonlanmas\u0131 beklenen s\u00fcre\u00e7ler (\u00f6rne\u011fin, bir kullan\u0131c\u0131n\u0131n web soketi oturumu) i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong>3. <code>:shutdown<\/code> se\u00e7ene\u011fi ne i\u015fe yarar?<\/strong><\/p>\n<p><code>:shutdown<\/code> se\u00e7ene\u011fi, bir Supervisor bir \u00e7ocuk s\u00fcreci sonland\u0131rmaya \u00e7al\u0131\u015ft\u0131\u011f\u0131nda ona ne kadar s\u00fcre tan\u0131naca\u011f\u0131n\u0131 belirtir. De\u011fer bir tamsay\u0131 ise (milisaniye cinsinden), s\u00fcre\u00e7 bu s\u00fcre i\u00e7inde nazik\u00e7e sonlanmazsa <code>:brutal_kill<\/code> ile zorla \u00f6ld\u00fcr\u00fcl\u00fcr. <code>:infinity<\/code> de\u011feri, s\u00fcrecin sonsuza kadar nazik\u00e7e sonlanmas\u0131n\u0131 bekleyece\u011fi anlam\u0131na gelir. <code>:brutal_kill<\/code> de\u011feri ise s\u00fcrecin hemen zorla sonland\u0131r\u0131laca\u011f\u0131n\u0131 belirtir. Bu, sistemin kapan\u0131\u015f\u0131nda veya yeniden ba\u015flatmalarda kaynaklar\u0131n d\u00fczg\u00fcn bir \u015fekilde serbest b\u0131rak\u0131lmas\u0131 i\u00e7in \u00f6nemlidir.<\/p>\n<p><strong>4. Supervisor stratejisini ne zaman de\u011fi\u015ftirmeliyim?<\/strong><\/p>\n<p>Supervisor stratejisi, \u00e7ocuk s\u00fcre\u00e7lerinizin birbirine olan ba\u011f\u0131ml\u0131l\u0131k derecesine g\u00f6re se\u00e7ilmelidir. E\u011fer s\u00fcre\u00e7ler tamamen ba\u011f\u0131ms\u0131zsa ve birinin \u00e7\u00f6kmesi di\u011ferlerini etkilemiyorsa <code>:one_for_one<\/code> idealdir. E\u011fer bir s\u00fcrecin \u00e7\u00f6kmesi, di\u011fer t\u00fcm s\u00fcre\u00e7lerin de ge\u00e7ersiz hale gelmesine neden oluyorsa <code>:one_for_all<\/code> uygundur. S\u00fcre\u00e7lerin belirli bir s\u0131raya g\u00f6re ba\u015flat\u0131ld\u0131\u011f\u0131 ve sonraki s\u00fcre\u00e7lerin \u00f6nceki s\u00fcre\u00e7lere ba\u011f\u0131ml\u0131 oldu\u011fu durumlarda ise <code>:rest_for_one<\/code> tercih edilebilir. Dinamik olarak \u00e7ocuk s\u00fcreci ba\u015flatman\u0131z gerekti\u011finde <code>:simple_one_for_one<\/code> kullanmal\u0131s\u0131n\u0131z.<\/p>\n<p>#Elixir #OTP #Supervisor #Da\u011f\u0131t\u0131kSistemler #HataTolerans\u0131 #Yaz\u0131l\u0131mMimarisi #GenServer #S\u00fcre\u00e7Y\u00f6netimi<\/p>\n<div class=\"github-example-link\"><strong>\u00d6rnek kod:<\/strong> <a href=\"https:\/\/github.com\/fatihsoysalcom\/elixir-supervisor-from-scratch-demo\" target=\"_blank\" rel=\"noopener noreferrer\">github.com\/fatihsoysalcom\/elixir-supervisor-from-scratch-demo<\/a><\/div>\n","protected":false},"excerpt":{"rendered":"Da\u011f\u0131t\u0131k sistemler geli\u015ftirirken, beklenmedik hatalar\u0131n ve sistem kesintilerinin \u00f6n\u00fcne ge\u00e7mek 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":[1],"tags":[],"class_list":{"0":"post-44168","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>Elixir&#039;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#039;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek - 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\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Elixir&#039;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#039;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek\" \/>\n<meta property=\"og:description\" content=\"Da\u011f\u0131t\u0131k sistemler geli\u015ftirirken, beklenmedik hatalar\u0131n ve sistem kesintilerinin \u00f6n\u00fcne ge\u00e7mek kritik bir \u00f6neme sahiptir.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2026-08-18T06:05:21+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-08-18T06:05:52+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=\"25 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek\",\"datePublished\":\"2026-08-18T06:05:21+00:00\",\"dateModified\":\"2026-08-18T06:05:52+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\"},\"wordCount\":3739,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#respond\"]}],\"copyrightYear\":\"2026\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\",\"name\":\"Elixir'de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor'\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2026-08-18T06:05:21+00:00\",\"dateModified\":\"2026-08-18T06:05:52+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek\"}]},{\"@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":"Elixir'de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor'\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek - 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\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/","og_locale":"tr_TR","og_type":"article","og_title":"Elixir'de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor'\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek","og_description":"Da\u011f\u0131t\u0131k sistemler geli\u015ftirirken, beklenmedik hatalar\u0131n ve sistem kesintilerinin \u00f6n\u00fcne ge\u00e7mek kritik bir \u00f6neme sahiptir.","og_url":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2026-08-18T06:05:21+00:00","article_modified_time":"2026-08-18T06:05:52+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"25 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek","datePublished":"2026-08-18T06:05:21+00:00","dateModified":"2026-08-18T06:05:52+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/"},"wordCount":3739,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#respond"]}],"copyrightYear":"2026","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/","url":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/","name":"Elixir'de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor'\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2026-08-18T06:05:21+00:00","dateModified":"2026-08-18T06:05:52+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/elixirde-dagitik-sistemler-olusturma-bolum-5-supervisori-sifirdan-insa-etmek\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Elixir&#8217;de Da\u011f\u0131t\u0131k Sistemler Olu\u015fturma: B\u00f6l\u00fcm 5 \u2014 Supervisor&#8217;\u0131 S\u0131f\u0131rdan \u0130n\u015fa Etmek"}]},{"@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\/44168","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=44168"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44168\/revisions"}],"predecessor-version":[{"id":44169,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/44168\/revisions\/44169"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=44168"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=44168"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=44168"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}