﻿
{"id":28864,"date":"2026-08-14T11:06:09","date_gmt":"2026-08-14T11:06:09","guid":{"rendered":"https:\/\/www.gencayyildiz.com\/blog\/?p=28864"},"modified":"2026-08-14T11:06:09","modified_gmt":"2026-08-14T11:06:09","slug":"nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi","status":"publish","type":"post","link":"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/","title":{"rendered":".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131"},"content":{"rendered":"<div id=\"fb-root\"><\/div>\n<p><br \/>\nMerhaba,<\/p>\n<p>Bu i\u00e7eri\u011fimizde son d\u00f6nemlerde zamanlanm\u0131\u015f i\u015fler (scheduled jobs) i\u00e7in ciddi \u015fekilde ilgin\u00e7 bir alternatif haline gelmi\u015f olan TickerQ&#8217;yu inceleyecek ve \u00f6zellikle <a href=\"https:\/\/www.gencayyildiz.com\/blog\/c-quartz-net-kutuphanesi-ile-zamanlanmis-gorevler-olusturma\/\" target=\"_blank\">Quartz.NET<\/a>&#8216;in ve <a href=\"https:\/\/www.gencayyildiz.com\/blog\/asp-net-coreda-hangfire-kutuphanesi-ile-zamanlanmis-gorevler-olusturma\/\" target=\"_blank\">Hangfire<\/a>&#8216;nin y\u0131llard\u0131r \u00e7\u00f6zemedi\u011fi hangi problemlere dair \u00e7\u00f6z\u00fcmlerle geldi\u011fini de\u011ferlendiriyor olaca\u011f\u0131z. Ayr\u0131ca, bu teknolojiler aras\u0131nda kullan\u0131m durumlar\u0131na g\u00f6re hangilerini se\u00e7memiz gerekti\u011fine dair mukayesede bulunaca\u011f\u0131z. O halde haz\u0131rsan\u0131z ba\u015flayal\u0131m&#8230;<\/p>\n<div id=\"ez-toc-container\" class=\"ez-toc-v2_0_88 counter-hierarchy ez-toc-counter ez-toc-light-blue ez-toc-container-direction\">\n<div class=\"ez-toc-title-container\">\n<p class=\"ez-toc-title\" style=\"cursor:inherit\">Ba\u015fl\u0131klar<\/p>\n<span class=\"ez-toc-title-toggle\"><a href=\"#\" class=\"ez-toc-pull-right ez-toc-btn ez-toc-btn-xs ez-toc-btn-default ez-toc-toggle\" aria-label=\"\u0130\u00e7indekiler Tablosunu A\u00e7\/Kapat\"><span class=\"ez-toc-js-icon-con\"><span class=\"\"><span class=\"eztoc-hide\" style=\"display:none;\">Toggle<\/span><span class=\"ez-toc-icon-toggle-span\"><svg style=\"fill: #999;color:#999\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" class=\"list-377408\" width=\"20px\" height=\"20px\" viewBox=\"0 0 24 24\" fill=\"none\"><path d=\"M6 6H4v2h2V6zm14 0H8v2h12V6zM4 11h2v2H4v-2zm16 0H8v2h12v-2zM4 16h2v2H4v-2zm16 0H8v2h12v-2z\" fill=\"currentColor\"><\/path><\/svg><svg style=\"fill: #999;color:#999\" class=\"arrow-unsorted-368013\" xmlns=\"http:\/\/www.w3.org\/2000\/svg\" width=\"10px\" height=\"10px\" viewBox=\"0 0 24 24\" version=\"1.2\" baseProfile=\"tiny\"><path d=\"M18.2 9.3l-6.2-6.3-6.2 6.3c-.2.2-.3.4-.3.7s.1.5.3.7c.2.2.4.3.7.3h11c.3 0 .5-.1.7-.3.2-.2.3-.5.3-.7s-.1-.5-.3-.7zM5.8 14.7l6.2 6.3 6.2-6.3c.2-.2.3-.5.3-.7s-.1-.5-.3-.7c-.2-.2-.4-.3-.7-.3h-11c-.3 0-.5.1-.7.3-.2.2-.3.5-.3.7s.1.5.3.7z\"\/><\/svg><\/span><\/span><\/span><\/a><\/span><\/div>\n<nav><ul class='ez-toc-list ez-toc-list-level-1 ' ><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-1\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#Her_seyden_Once_Problemler_Nelerdir\" >Her \u015feyden \u00d6nce Problem(ler) Nelerdir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-2\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#TickerQnun_QuartzNET_ve_Hangfiredan_Farki_Nedir\" >TickerQ&#8217;nun Quartz.NET ve Hangfire&#8217;dan Fark\u0131 Nedir?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-3\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#QuartzNET_Hangfire_ve_TickerQ_Tam_Olarak_Ayni_Sey_mi\" >Quartz.NET, Hangfire ve TickerQ Tam Olarak Ayn\u0131 \u015eey mi?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-4\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#Avantajlari_Dezavantajlari\" >Avantajlar\u0131 &#038; Dezavantajlar\u0131<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-5\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#AspNET_Coreda_TickerQ_Nasil_Kullanilir\" >Asp.NET Core&#8217;da TickerQ Nas\u0131l Kullan\u0131l\u0131r?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-6\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#Concurrency_Nasil_Saglanir\" >Concurrency Nas\u0131l Sa\u011flan\u0131r?<\/a><\/li><li class='ez-toc-page-1 ez-toc-heading-level-4'><a class=\"ez-toc-link ez-toc-heading-7\" href=\"https:\/\/www.gencayyildiz.com\/blog\/nette-background-job-ve-scheduling-tickerq-hangfire-ve-quartz-net-karsilastirmasi\/#Dashboard_Ekleyelim\" >Dashboard Ekleyelim<\/a><\/li><\/ul><\/nav><\/div>\n<h4><span class=\"ez-toc-section\" id=\"Her_seyden_Once_Problemler_Nelerdir\"><\/span>Her \u015feyden \u00d6nce Problem(ler) Nelerdir?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>\u00c7o\u011fu ki\u015fi i\u00e7in scheduler denince ak\u0131llarda \u015fu canlanmaktad\u0131r; &#8220;her gece 02:00&#8217;da rapor \u00fcret&#8221;<\/p>\n<p>Ancak scheduler bundan \u00e7ok daha fazlas\u0131na kar\u015f\u0131l\u0131k gelmektedir; bir i\u015flemden 10 dakika sonra e-posta g\u00f6ndermeden tutun sipari\u015f verildikten 24 saat sonra \u00f6deme gelmediyse iptal edilmesine kadar davran\u0131\u015fsal planlamalar\u0131n \u00f6tesinde, belirli bir zamanda \u00e7al\u0131\u015facak i\u015flerin delayed event olarak planlanmas\u0131, periyodik g\u00f6revlerin ne zaman \u00e7al\u0131\u015faca\u011f\u0131n\u0131 belirlemek \u00fczere cron yap\u0131land\u0131rmalar\u0131n\u0131n tan\u0131mlanmas\u0131 ve hatta bu planlamalar\u0131n s\u00fcrd\u00fcr\u00fclebilirli\u011fini sa\u011flamak amac\u0131yla persistence mekanizmalar\u0131n\u0131n kullan\u0131lmas\u0131 gibi yetenekler de scheduler&#8217;\u0131n temel sorumluluk alan\u0131na girmektedir. Dolay\u0131s\u0131yla bunlar\u0131n tamam\u0131, scheduler&#8217;\u0131n ihtiya\u00e7 duydu\u011fu yard\u0131mc\u0131 kabiliyetlerdir.<\/p>\n<p>Ancak scheduler&#8217;\u0131n bu sorumluluklar\u0131 yerine getirebilmesi, beraberinde \u00e7\u00f6z\u00fclmesi gereken birtak\u0131m tasar\u0131m problemlerini ve \u00e7al\u0131\u015fma zaman\u0131 risklerini de ortaya \u00e7\u0131karmaktad\u0131r. \u015eimdi gelin bu riskleri tek tek masaya yat\u0131rarak fark\u0131ndal\u0131k olu\u015fturmaya \u00e7al\u0131\u015fal\u0131m;<\/p>\n<ul style=\"font-size:14px;\">\n<li><strong><em>Uygulaman\u0131n yeniden ba\u015flarsa ne olacak?<\/em><\/strong><br \/>\nDiyelim ki; 02:00&#8217;da rapor \u00fcretilecek. Ya uygulama 01:59&#8217;da \u00e7\u00f6ker ve 02:00&#8217;da \u00e7al\u0131\u015fmayarak 02:15&#8217;te tekrar aya\u011fa kalkarsa! B\u00f6yle bir durumda ideal olan scheduler&#8217;\u0131n planlanan i\u015fi kaybetmemesi gerekmektedir. Dolay\u0131s\u0131yla schedule bilgisinin sadece RAM&#8217;de tutulmas\u0131 yeterli de\u011fildir.\n<\/li>\n<li><strong><em>Uygulaman\u0131n birden fazla instance&#8217;\u0131 varsa?<\/em><\/strong>\n<div style=\"display:flex;gap:20px;align-items:flex-start;\">\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:200px;font-size:12.5px;\">\n         Load Balancer<br \/>\n              \u2502<br \/>\n   \u250c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u253c\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2500\u2510<br \/>\n   \u2193          \u2193          \u2193<br \/>\nAPI #1     API #2     API #3\n<\/div>\n<div style=\"flex:1;\">\nModern uygulamalar genellikle yandaki gibi load balancer e\u015fli\u011finde \u00f6l\u00e7eklendirilerek tasarlanmaktad\u0131r. Haliyle t\u00fcm instance&#8217;lar da scheduler yap\u0131land\u0131r\u0131lmaktad\u0131r. B\u00f6yle bir tasar\u0131mdaki en b\u00fcy\u00fck risk ayn\u0131 i\u015fin \u00f6l\u00e7eklendirilmenin yap\u0131ld\u0131\u011f\u0131 instance say\u0131s\u0131 kadar \u00e7al\u0131\u015fabilme ihtimalidir.\n<\/div>\n<\/div>\n<p>Dolay\u0131s\u0131yla burada scheduler&#8217;\u0131n \u00e7\u00f6zmesi gereken bir problem ortaya \u00e7\u0131kmaktad\u0131r: <em>&#8220;bu i\u015fi hangi instance \u00e7al\u0131\u015ft\u0131racakt\u0131r?&#8221;<\/em>\n<\/li>\n<li><strong><em>Job ba\u015far\u0131s\u0131z olursa ne olacak?<\/em><\/strong><br \/>\nScheduler taraf\u0131ndan \u00e7al\u0131\u015ft\u0131r\u0131lan i\u015f exception f\u0131rlat\u0131rsa e\u011fer bu taktirde yine ideal olan i\u015fin tekrar \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131 olacakt\u0131r. B\u00f6yle durumlarda scheduler&#8217;\u0131n kendisinden ziyade job execution\/retry politikalar\u0131 devreye girecektir.\n<\/li>\n<li><strong><em>Job&#8217;\u0131n state&#8217;i bir yerde tutulmal\u0131d\u0131r!<\/em><\/strong><br \/>\nJob&#8217;\u0131n ne zaman \u00e7al\u0131\u015faca\u011f\u0131, en son ne zaman \u00e7al\u0131\u015ft\u0131\u011f\u0131, ba\u015far\u0131l\u0131 m\u0131yd\u0131, ba\u015far\u0131s\u0131z m\u0131yd\u0131, ka\u00e7 kere retry edildi\u011fi yahut bir sonraki \u00e7al\u0131\u015fman\u0131n ne zaman oldu\u011fu gibi sorular\u0131n cevaplar\u0131n\u0131 bir yerden alabiliyor olmam\u0131z gerekmektedir. E\u011fer ki bu sorular\u0131n cevaplar\u0131 RAM&#8217;de tutuluyorsa bu ciddi bir risk te\u015fkil etmektedir. Haliyle SQL Server, PostgreSQL yahut Redis gibi persistence mekanizmalar\u0131yla kal\u0131c\u0131 hale getirilmelidir!\n<\/li>\n<\/ul>\n<p><em><strong>Peki t\u00fcm bunlar neden problemdir?<\/strong><\/em><br \/>\nEn saf haliyle ba\u015flang\u0131\u00e7taki amac\u0131m\u0131z <em>her gece 02:00\u2019da rapor \u00fcretmekti<\/em>. Ancak olay \u00f6yle bir noktaya geliyor ki production&#8217;da <span style=\"font-size:14px;\">Schedule \u2192 Persistence \u2192 Concurrency \u2192 Distributed Execution \u2192 Retry \u2192 Failure Handling \u2192 Recovery \u2192 Monitoring<\/span> gibi bir sisteme ihtiya\u00e7 oldu\u011fu ortaya \u00e7\u0131k\u0131yor!<\/p>\n<p>Evet, Quartz.NET ve Hangfire&#8217;\u0131n tam da \u00e7\u00f6zd\u00fc\u011f\u00fc problem bu ihtiya\u00e7 silsilesidir&#8230;<\/p>\n<p><em><strong>Peki Quartz.NET ve Hangfire neye yetmiyor?<\/strong><\/em><br \/>\nAsl\u0131nda Quartz.NET ve Hangfire&#8217;\u0131n \u00e7\u00f6zemedi\u011fi temel bir scheduling problemi yoktur! \u0130kisi de bu tarz ihtiya\u00e7 s\u00fcre\u00e7lerinde tercih edilebilecek kadar olgun \u00e7\u00f6z\u00fcmlerdir. Zaten TickerQ&#8217;nun da ortaya \u00e7\u0131k\u0131\u015f\u0131n\u0131 &#8220;Quartz.NET ve Hangfire yetersizdi, TickerQ geldi&#8221; \u015feklinde anlatmak hem niyet hem de teknik olarak olduk\u00e7a yan\u0131lt\u0131c\u0131 olacakt\u0131r! Do\u011frusu \u015fudur; Quartz.NET ve Hangfire&#8217;\u0131n \u00e7\u00f6zd\u00fc\u011f\u00fc problemlere kar\u015f\u0131n TickerQ daha modern bir yakla\u015f\u0131m sergileyerek \u00e7\u00f6z\u00fcm getirmektedir&#8230;<\/p>\n<p>\u015e\u00f6yle ki; Quartz.NET ve Hangfire geleneksel reflection altyap\u0131s\u0131na sahipken, TickerQ&#8217;nun yap\u0131s\u0131 ise .NET d\u00fcnyas\u0131nda de\u011fi\u015fiklik g\u00f6steren source generators, native AOT vs. gibi beklentilere ayak uydurabilmektedir&#8230; <\/p>\n<h4><span class=\"ez-toc-section\" id=\"TickerQnun_QuartzNET_ve_Hangfiredan_Farki_Nedir\"><\/span>TickerQ&#8217;nun Quartz.NET ve Hangfire&#8217;dan Fark\u0131 Nedir?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>TickerQ, Quartz.NET ve Hangfire ile ayn\u0131 temel probleme \u00e7\u00f6z\u00fcm getirmektedir. Yani \u00fc\u00e7\u00fc de, bir i\u015fi \u015fimdi de\u011fil, belirli bir zamanda veya belirli aral\u0131klarla g\u00fcvenli \u015fekilde \u00e7al\u0131\u015ft\u0131rmaya odakl\u0131d\u0131rlar. Ama \u00e7\u00f6z\u00fcm s\u00fcre\u00e7lerindeki yakla\u015f\u0131mlar\u0131 olduk\u00e7a farkl\u0131d\u0131r:<\/p>\n<table style=\"border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:1.35;width:auto;border:1px solid #ddd;width:100%;\">\n<thead>\n<tr style=\"background:#f5f5f5;\">\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:left;\"><\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:left;text-align:center;\">Quartz.NET<\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:left;text-align:center;\">Hangfire<\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:left;text-align:center;\">TickerQ<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Ana fikir<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">G\u00fc\u00e7l\u00fc scheduler<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Persistent background jobs<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Modern .NET scheduler<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Job ke\u015ffi<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Runtime\/reflection<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Runtime\/reflection<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Compile-time source generator<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Native AOT<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u274c<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u274c<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Persistence<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">ADO.NET JobStore<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">SQL\/Redis vb.<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">EF Core \/ Redis<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Dashboard<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Yerle\u015fik de\u011fil<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Cron<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u00c7ok g\u00fc\u00e7l\u00fc<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">G\u00fc\u00e7l\u00fc<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Delayed job<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Retry<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705 \/ yap\u0131land\u0131r\u0131labilir<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705 \u00e7ok g\u00fc\u00e7l\u00fc<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Job chaining<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Listener vb.<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Continuations<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Parent\/child<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Modern .NET yakla\u015f\u0131m\u0131<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Orta<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Orta<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u00c7ok g\u00fc\u00e7l\u00fc<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Olgunluk<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udfe2 \u00c7ok y\u00fcksek<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udfe2 \u00c7ok y\u00fcksek<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udfe1 Yeni<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<blockquote style=\"font-size:14px;\"><p><em>TickerQ&#8217;nun en b\u00fcy\u00fck numaras\u0131 source generator&#8217;d\u0131r! Kodu otomatik \u00fcretmekte ve compile etmektedir.<\/em><\/p><\/blockquote>\n<p>Quartz.NET ve Hangfire etraf\u0131nda y\u0131llarca olu\u015fmu\u015f <span style=\"font-size:14px;\">(persistence, recovery, concurrency, retry, clustering, scheduling semantics, monitoring, job lifecycle vs. gibi)<\/span> kocaman bir ekosistem mevcuttur. Haliyle bu k\u00fct\u00fcphanelerin \u00e7\u00f6zd\u00fc\u011f\u00fc scheduling\/background-job problemlerini TickerQ, modern .NET&#8217;in compile-time ve AOT d\u00fcnyas\u0131na daha uygun bir mimariyle \u00e7\u00f6zmeye \u00e7al\u0131\u015fmakta ve bu ekosistemin \u00f6nemli bir b\u00f6l\u00fcm\u00fcn\u00fc sunmaktad\u0131r.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"QuartzNET_Hangfire_ve_TickerQ_Tam_Olarak_Ayni_Sey_mi\"><\/span>Quartz.NET, Hangfire ve TickerQ Tam Olarak Ayn\u0131 \u015eey mi?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Hay\u0131r, ayn\u0131 \u015fey de\u011filler! Ama ayn\u0131 problem alan\u0131nda kesi\u015fmektedirler.<\/p>\n<blockquote style=\"font-size:14px;\"><p><em>Quartz.NET, Hangfire ve TickerQ birbirlerinin birebir alternatifleri de\u011fildir; fakat \u00fc\u00e7\u00fcn\u00fcn de &#8220;zamanlanm\u0131\u015f\/arka plan i\u015flerini g\u00fcvenilir bi\u00e7imde \u00e7al\u0131\u015ft\u0131rma&#8221; yetenekleri vard\u0131r.<\/em><\/p><\/blockquote>\n<p>Dolay\u0131s\u0131yla \u00fc\u00e7\u00fc de scheduler m\u0131? diye sorarsan\u0131z, evet \u00fc\u00e7\u00fcn\u00fcn de scheduler yeteni vard\u0131r. Ancak \u00fc\u00e7\u00fc ayn\u0131 scheduler&#8217;\u0131n \u00fc\u00e7 farkl\u0131 implementasyonu de\u011fildir! <\/p>\n<h4><span class=\"ez-toc-section\" id=\"Avantajlari_Dezavantajlari\"><\/span>Avantajlar\u0131 &#038; Dezavantajlar\u0131<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<table style=\"border-collapse:collapse;font-family:Arial,Helvetica,sans-serif;font-size:12px;line-height:1.35;width:100%;border:1px solid #ddd;\">\n<thead>\n<tr style=\"background:#f5f5f5;\">\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:left;\"><\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:center;\">Quartz.NET<\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:center;\">Hangfire<\/th>\n<th style=\"border:1px solid #ddd;padding:6px 8px;text-align:center;\">TickerQ<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">En g\u00fc\u00e7l\u00fc taraf\u0131<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u00c7ok geli\u015fmi\u015f scheduling<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Kullan\u0131m kolayl\u0131\u011f\u0131 + dashboard<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Modern .NET + source generation<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">En b\u00fcy\u00fck avantaj\u0131<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Scheduling konusunda \u00e7ok olgun<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Background job y\u00f6netimi \u00e7ok rahat<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Reflection&#8217;s\u0131z, AOT uyumlu yakla\u015f\u0131m<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">En b\u00fcy\u00fck dezavantaj\u0131<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Karma\u015f\u0131k ve a\u011f\u0131r gelebilir<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Scheduler&#8217;dan \u00e7ok job platformu yakla\u015f\u0131m\u0131<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">Daha gen\u00e7 ekosistem<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">\u00d6\u011frenme<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udd34 Zor<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udfe2 Kolay<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\ud83d\udfe2 Kolay \/ Orta<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Dashboard<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u274c<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705 \u00c7ok iyi<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Cron<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Persistence<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Retry<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Native AOT<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u274c<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u274c<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2705<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Ekosistem<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50<\/td>\n<\/tr>\n<tr>\n<td style=\"border:1px solid #ddd;padding:5px 8px;font-weight:bold;background:#fafafa;text-align:left;\">Production ge\u00e7mi\u015fi<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50\u2b50\u2b50\u2b50<\/td>\n<td style=\"border:1px solid #ddd;padding:5px 8px;\">\u2b50\u2b50<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Yukar\u0131daki tablodan da g\u00f6r\u00fclece\u011fi \u00fczere scheduling i\u015flemlerinde kullanabilece\u011fimiz bu k\u00fct\u00fcphanelerin avantaj ve dezavantajlar\u0131n\u0131 gayet g\u00fczel bir \u015fekilde mukayese etmi\u015f bulunuyoruz. Ancak konuya dair daha iyi sindirilebilmesi i\u00e7in bir ka\u00e7 kelam s\u00f6ylemekte fayda g\u00f6rmekteyim. \u00d6ncelikle Quartz.NET&#8217;i ele alal\u0131m. Bu k\u00fct\u00fcphanenin en b\u00fcy\u00fck avantaj\u0131 \u00e7ok olgun olmas\u0131d\u0131r. Y\u0131llard\u0131r mevzu bahis olan problemler \u00fczerine odaklanmas\u0131 ve scheduling senaryolar\u0131nda say\u0131s\u0131z kez varl\u0131k g\u00f6stermesi bu k\u00fct\u00fcphaneyi ister istemez \u00e7ok g\u00fc\u00e7l\u00fc k\u0131lmaktad\u0131r. Ancak bu g\u00fcc\u00fcn en b\u00fcy\u00fck bedeli ise getirdi\u011fi karma\u015f\u0131kl\u0131kt\u0131r. Basit bir i\u015f i\u00e7in bile Quartz.NET&#8217;te abstraction&#8217;larla u\u011fra\u015fmak ikrah ettirecek derecede ka\u00e7\u0131n\u0131lmaz olacakt\u0131r.<\/p>\n<p>Hangfire&#8217;a gelirsek e\u011fer kullan\u0131m\u0131n\u0131n kolay olmas\u0131 en b\u00fcy\u00fck avantaj\u0131d\u0131r. \u00dcstelik \u00e7ok g\u00fczel bir dashboard&#8217;a sahiptir. Ancak bu kolayl\u0131k Quartz.NET&#8217;e nazaran biraz y\u00fczeysel kalmas\u0131na sebebiyet vermekte ve scheduling s\u00fcre\u00e7lerinde derin yap\u0131land\u0131rmalara kadar inememektedir. Yani demek istedi\u011fim o ki, \u00e7ok karma\u015f\u0131k scheduling politikalar\u0131n\u0131n s\u00f6z konusu oldu\u011fu senaryolarda Hangfire&#8217;a nazaran Quartz daha rahat e\u015flik edebilmektedir.<\/p>\n<p>TickerQ ise modern .NET yakla\u015f\u0131mlar\u0131yla yap\u0131land\u0131r\u0131lm\u0131\u015f yeni bir scheduling k\u00fct\u00fcphanesidir. \u00d6nceki sat\u0131rlarda vurguland\u0131\u011f\u0131 gibi en b\u00fcy\u00fck avantaj\u0131 source generator altyap\u0131s\u0131na sahip olmas\u0131d\u0131r. Yani job&#8217;lar\u0131 runtime&#8217;da reflection ile ke\u015ffetmektense compile-time&#8217;da bulup, \u00e7al\u0131\u015ft\u0131rabilmektedir. Bu da s\u00fcre\u00e7te bizlere ciddi performans getirmekte ve maliyeti d\u00fc\u015f\u00fcrmektedir.<\/p>\n<blockquote style=\"font-size:14px;\"><p><em>TickerQ kesinlikle Quartz.NET&#8217;ten daha h\u0131zl\u0131d\u0131r!<\/em><\/p><\/blockquote>\n<p>Ancak TickerQ&#8217;nun hen\u00fcz yeni tasarlanm\u0131\u015f olmas\u0131 daha k\u00fc\u00e7\u00fck community ve daha az tecr\u00fcbe getirmektedir. Bu tecr\u00fcbe yoksunlu\u011fundan kaynakl\u0131 Quartz.NET ve Hangfire&#8217;da oldu\u011fu gibi t\u00fcrl\u00fc ihtiya\u00e7 senaryolar\u0131na kar\u015f\u0131 \u00f6rnek olaylar\u0131n bulunabilmesi pek m\u00fcmk\u00fcn de\u011fildir!<\/p>\n<p>Bundan kaynakl\u0131 TickerQ&#8217;nun se\u00e7iminde k\u0131stas\u0131n performans odakl\u0131 de\u011fil, mimarisel yakla\u015f\u0131m odakl\u0131 olmas\u0131 gerekti\u011fine dikkatinizi \u00e7ekerim&#8230;<\/p>\n<h4><span class=\"ez-toc-section\" id=\"AspNET_Coreda_TickerQ_Nasil_Kullanilir\"><\/span>Asp.NET Core&#8217;da TickerQ Nas\u0131l Kullan\u0131l\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>TickerQ&#8217;yu scheduling i\u015flemlerinde kullanabilmek i\u00e7in tabi ki de \u00f6ncelikle <a href=\"https:\/\/www.nuget.org\/packages\/TickerQ\" target=\"_blank\">TickerQ<\/a> k\u00fct\u00fcphanesinin y\u00fcklenmesi ve ard\u0131ndan a\u015fa\u011f\u0131daki yap\u0131land\u0131rma ile projeye entegrasyonu ger\u00e7ekle\u015ftirilmelidir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nvar builder = WebApplication.CreateBuilder(args);\r\n\r\nbuilder.Services.AddTickerQ();\r\n\r\nvar app = builder.Build();\r\n\r\n.\r\n.\r\n.\r\n\r\napp.UseTickerQ();\r\n\r\napp.Run();\r\n<\/pre>\n<\/div>\n<p>Bu temel yap\u0131land\u0131rmadan sonra genel mant\u0131k job tan\u0131mlama ve \u00e7al\u0131\u015ft\u0131rma \u00fczerine kuruludur. Dolay\u0131s\u0131yla en yal\u0131n haliyle a\u015fa\u011f\u0131daki gibi bir job tan\u0131mlamas\u0131n\u0131 ger\u00e7ekle\u015ftirebiliriz:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class OrderJobs\r\n    {\r\n        &#x5B;TickerFunction(FunctionNames.SendOrderEmail)]\r\n        public async Task SendOrderEmailAsync(TickerFunctionContext&lt;SendOrderEmailRequest&gt; tickerFunctionContext, CancellationToken cancellationToken)\r\n        {\r\n            await Task.Delay(500, cancellationToken);\r\n\r\n            await Console.Out.WriteLineAsync(@$&quot;Sipari\u015f e-postas\u0131 g\u00f6nderildi. Job Id : {tickerFunctionContext.Id}\r\nOrder Id : {tickerFunctionContext.Request.OrderId} | E-posta : {tickerFunctionContext.Request.Email}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada dikkat edilirse e\u011fer TickerQ&#8217;da tan\u0131mlanan job&#8217;lar <code>TickerFunction<\/code> attribute&#8217;u ile i\u015faretlenmektedir. TickerQ&#8217;nun source generator&#8217;\u0131 bu attribute&#8217;u compile-time&#8217;da ke\u015ffedecektir ve ilgili job&#8217;\u0131n dependency injection \u00fczerinden resolve edilmesi ve \u00e7a\u011fr\u0131labilmesi i\u00e7in gerekli olan wiring&#8217;i \u00fcretecektir.<\/p>\n<p>Ard\u0131ndan yap\u0131lmas\u0131 gereken job&#8217;\u0131n a\u015fa\u011f\u0131daki gibi \u00e7al\u0131\u015ft\u0131r\u0131lmas\u0131d\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapPost(&quot;\/orders\/schedule-email&quot;, async (SendOrderEmailRequest sendOrderEmailRequest, ITimeTickerManager&lt;TimeTickerEntity&gt; timeTickerManager) =&gt;\r\n{\r\n    var result = await timeTickerManager.AddAsync(new TimeTickerEntity\r\n    {\r\n        Function = FunctionNames.SendOrderEmail,\r\n        ExecutionTime = DateTime.UtcNow.AddSeconds(15),\r\n        Request = TickerHelper.CreateTickerRequest(sendOrderEmailRequest)\r\n    });\r\n\r\n    return Results.Ok(new\r\n    {\r\n        sendOrderEmailRequest.OrderId,\r\n        jobId = result.Result?.Id\r\n    });\r\n});\r\n<\/pre>\n<\/div>\n<p>Dikkat ederseniz \u00e7al\u0131\u015ft\u0131r\u0131lacak job&#8217;\u0131n ne zaman \u00e7al\u0131\u015faca\u011f\u0131 da <code>ExecutionTime<\/code> property&#8217;siyle belirlenmektedir.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"431\" height=\"340\" class=\"aligncenter size-full wp-image-28873\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi.png 431w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-300x237.png 300w\" sizes=\"auto, (max-width: 431px) 100vw, 431px\" \/><\/a>G\u00f6r\u00fcld\u00fc\u011f\u00fc \u00fczere ilgili endpoint&#8217;e istek att\u0131\u011f\u0131m\u0131z zaman job hedeflenen zamanda \u00e7al\u0131\u015ft\u0131r\u0131lacak \u015fekilde yap\u0131land\u0131r\u0131lmaktad\u0131r.<\/p>\n<p><em><strong>Peki hoca! Belirlenen periyotta bir \u00e7al\u0131\u015fan job nas\u0131l yap\u0131land\u0131rabiliriz?<\/strong><\/em> diye sordu\u011funuzu duyar gibiyim&#8230; Diyelim ki her gece saat 02:00&#8217;da eski sipari\u015f kay\u0131tlar\u0131 temizlensin. Bunun i\u00e7in a\u015fa\u011f\u0131daki gibi bir job&#8217;\u0131n tan\u0131mlanmas\u0131 gerekmektedir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n    public class OrderJobs\r\n    {\r\n        .\r\n        .\r\n        .\r\n\r\n        &#x5B;TickerFunction(FunctionNames.CleanupOrders, cronExpression: &quot;0 0 2 * * *&quot;)]\r\n        public async Task CleanupOrdersAsync(TickerFunctionContext&lt;SendOrderEmailRequest&gt; tickerFunctionContext, CancellationToken cancellationToken)\r\n        {\r\n            await Console.Out.WriteLineAsync(@$&quot;Sipari\u015f temizleme ba\u015flad\u0131. {DateTime.UtcNow}&quot;);\r\n\r\n            await Task.Delay(500, cancellationToken);\r\n\r\n            await Console.Out.WriteLineAsync(@$&quot;Sipari\u015f temizleme tamamland\u0131. {DateTime.UtcNow}&quot;);\r\n        }\r\n    }\r\n<\/pre>\n<\/div>\n<p>Burada, job&#8217;a attribute \u00fczerinden tan\u0131mlanm\u0131\u015f olan <em>cronExpression<\/em> ile bu job&#8217;\u0131n hangi periyotta bir \u00e7al\u0131\u015faca\u011f\u0131n\u0131 cron format\u0131nda ifade etmekteyiz. Ayr\u0131ca burada dikkat ederseniz e\u011fer attribute \u00fczerinden verilen bu cron de\u011feri ile bu recurring schedule&#8217;\u0131 ekstradan herhangi bir yap\u0131land\u0131rmaya gerek duymaks\u0131z\u0131n startup s\u0131ras\u0131nda otomatik seed edebilmekteyiz.<\/p>\n<p><em><strong>Peki hoca! T\u00fcm \u00e7al\u0131\u015fmada memory kullan\u0131lmaktad\u0131r \u00f6yle de\u011fil mi?<\/strong><\/em><br \/>\nEvet, yani bu vaziyette uygulama kapand\u0131\u011f\u0131 taktirde planlanan t\u00fcm i\u015fler kaybolacakt\u0131r. Haliyle Quartz.NET&#8217;te yahut Hangfire&#8217;da oldu\u011fu gibi TickerQ&#8217;yu kullan\u0131rken de bir persistence provider kullan\u0131lmas\u0131 gerekmektedir.<\/p>\n<p>Bunun i\u00e7in <a href=\"https:\/\/www.nuget.org\/packages\/TickerQ.EntityFrameworkCore\" target=\"_blank\">TickerQ.EntityFrameworkCore<\/a> k\u00fct\u00fcphanesinden istifade edilebilir. Bu k\u00fct\u00fcphane ile ad\u0131 \u00fczerinde TickerQ&#8217;ya uygun Entity Framework Core yap\u0131lanmas\u0131nda bulunabilir ve h\u0131zl\u0131ca veritaban\u0131 i\u015flemlerini y\u00fcr\u00fctebiliriz. Tabi veritaban\u0131 i\u015flemleri i\u00e7in de uygun paketin y\u00fcklenmesi gerekecektir. Misal olarak SQL Server kullan\u0131lacaksa <a href=\"https:\/\/www.nuget.org\/packages\/Microsoft.EntityFrameworkCore.SqlServer\" target=\"_blank\">Microsoft.EntityFrameworkCore.SqlServer<\/a> paketinin y\u00fcklenmesi gerekmektedir.<\/p>\n<p>\u015eimdi burada yap\u0131lmas\u0131 gereken olduk\u00e7a basittir. \u015e\u00f6yle ki; <em>Program.cs<\/em>&#8216;de a\u015fa\u011f\u0131daki yap\u0131land\u0131rmada bulunulmal\u0131d\u0131r:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services.AddTickerQ(options =&gt;\r\n{\r\n    options.AddOperationalStore(efConfiguration =&gt;\r\n    {\r\n        efConfiguration.UseTickerQDbContext&lt;TickerQDbContext&gt;(optionsAction =&gt;\r\n        {\r\n            optionsAction.UseSqlServer(builder.Configuration.GetConnectionString(&quot;SQLServer&quot;), sqlServerOptionsAction =&gt; sqlServerOptionsAction.MigrationsAssembly(typeof(Program).Assembly.GetName().Name));\r\n        });\r\n    });\r\n});\r\n<\/pre>\n<\/div>\n<p>Bu yap\u0131land\u0131rman\u0131n ard\u0131ndan <code>add-migration mig_1<\/code> ve <code>update-database<\/code> talimatlar\u0131n\u0131n verilmesiyle veritaban\u0131 migrate edilmi\u015f olacakt\u0131r.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-1.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-1.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"356\" height=\"329\" class=\"aligncenter size-full wp-image-28878\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-1.png 356w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-1-300x277.png 300w\" sizes=\"auto, (max-width: 356px) 100vw, 356px\" \/><\/a>Bu yap\u0131land\u0131rmadan sonra a\u015fa\u011f\u0131daki gibi bir \u00e7al\u0131\u015fma neticesinde olu\u015fturulan job veritaban\u0131na kaydedilecek ve uygulama kapansa dahi, daha sonradan aya\u011fa kald\u0131r\u0131ld\u0131\u011f\u0131nda kald\u0131\u011f\u0131 yerden devam edecektir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\napp.MapPost(&quot;\/orders\/schedule-email\/persistence&quot;, async (SendOrderEmailRequest sendOrderEmailRequest, ITimeTickerManager&lt;TimeTickerEntity&gt; timeTickerManager) =&gt;\r\n{\r\n    var result = await timeTickerManager.AddAsync(new TimeTickerEntity\r\n    {\r\n        Function = FunctionNames.SendOrderEmail,\r\n        ExecutionTime = DateTime.UtcNow.AddSeconds(5),\r\n        Request = TickerHelper.CreateTickerRequest(sendOrderEmailRequest),\r\n        Retries = 3,\r\n        RetryIntervals = new&#x5B;] { 30, 120, 600 }\r\n    });\r\n\r\n    return Results.Ok(new\r\n    {\r\n        sendOrderEmailRequest.OrderId,\r\n        jobId = result.Result?.Id\r\n    });\r\n});\r\n<\/pre>\n<\/div>\n<p><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"1760\" height=\"503\" class=\"aligncenter size-full wp-image-28881\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2.png 1760w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2-300x86.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2-1024x293.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2-768x219.png 768w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-2-1536x439.png 1536w\" sizes=\"auto, (max-width: 1760px) 100vw, 1760px\" \/><\/a><\/p>\n<h4><span class=\"ez-toc-section\" id=\"Concurrency_Nasil_Saglanir\"><\/span>Concurrency Nas\u0131l Sa\u011flan\u0131r?<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Diyelim ki, ayn\u0131 anda 10.000 sipari\u015f geldi. Ee haliyle t\u00fcm bu sipari\u015flerin email job&#8217;\u0131 devreye girecektir ve hepsinin ayn\u0131 anda girmesi ciddi bir darbo\u011faz yaratacakt\u0131r. \u0130\u015fte b\u00f6yle bir durumda TickerQ&#8217;da fonksiyon baz\u0131nda concurrency s\u0131n\u0131r\u0131n\u0131 belirleyebilmekte ve sistemi \u00f6l\u00e7eklendirebilmekteyiz. Bunun i\u00e7in <code>TickerFunction<\/code> attribute&#8217;unda a\u015fa\u011f\u0131daki gibi <code>maxConcurrency<\/code> parametresini kullanabiliriz:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\n&#x5B;TickerFunction(FunctionNames.SendOrderEmail, maxConcurrency: 3)]\r\n<\/pre>\n<\/div>\n<p>Bu durumda;<\/p>\n<div style=\"background:#0d0d0d;color:#e6e6e6;font-family:Consolas,'Courier New',monospace;white-space:pre;line-height:0.8;padding:12px;width:380px;font-size:12px;\">\nsend-order-email #01 \u2500\u2500\u2510<br \/>\nsend-order-email #02 \u2500\u2500\u2524 \u2190 3 i\u015flem e\u015fzamanl\u0131<br \/>\nsend-order-email #03 \u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\nsend-order-email #04 \u2500\u2500\u2510<br \/>\nsend-order-email #05 \u2500\u2500\u2524 \u2190 \u00f6nceki 3&#8217;\u00fcn\u00fcn bitmesini bekler<br \/>\nsend-order-email #06 \u2500\u2500\u2518<br \/>\n                         \u2502<br \/>\n                         \u25bc<br \/>\nsend-order-email #07 \u2500\u2500\u2510<br \/>\nsend-order-email #08 \u2500\u2500\u2524 \u2190 \u00f6nceki 3&#8217;\u00fcn\u00fcn bitmesini bekler<br \/>\nsend-order-email #09 \u2500\u2500\u2518\n<\/div>\n<p>\u015feklinde \u00e7al\u0131\u015fma sergileyecektir.<\/p>\n<h4><span class=\"ez-toc-section\" id=\"Dashboard_Ekleyelim\"><\/span>Dashboard Ekleyelim<span class=\"ez-toc-section-end\"><\/span><\/h4>\n<p>Ve son olarak da job&#8217;lar\u0131n \u00e7al\u0131\u015fmas\u0131n\u0131 anl\u0131k olarak g\u00f6zlemleyebilece\u011fimiz ve TickerQ&#8217;nun en g\u00fczel \u00f6zelliklerinden biri olan Dashboard&#8217;un y\u00fcklenmesini ele alal\u0131m. \u0130lk olarak <a href=\"https:\/\/www.nuget.org\/packages\/TickerQ.Dashboard\" target=\"_blank\">TickerQ.Dashboard<\/a> paketinin y\u00fcklenmesi gerekmekte ve ard\u0131ndan a\u015fa\u011f\u0131daki yap\u0131land\u0131rmalar <em>Program.cs<\/em>&#8216;de ger\u00e7ekle\u015ftirilmelidir:<\/p>\n<div style=\"font-size:12px;\">\n<pre class=\"brush: jscript; title: ; notranslate\" title=\"\">\r\nbuilder.Services.AddTickerQ(options =&gt;\r\n{\r\n    .\r\n    .\r\n    .\r\n\r\n    options.AddDashboard(configure =&gt; configure.WithBasicAuth(username: &quot;admin&quot;, password: &quot;admin&quot;));\r\n    options.AddOperationalStore(configurator =&gt; configurator.UseTickerQDbContext&lt;TickerQDbContext&gt;(options =&gt; options.UseSqlServer(builder.Configuration.GetConnectionString(&quot;SQLServer&quot;))));\r\n});\r\n<\/pre>\n<\/div>\n<p>Bu yap\u0131land\u0131rmadan sonra <em>https:\/\/localhost:{port}\/tickerq\/dashboard\/<\/em> adresi \u00fczerinden dashboard&#8217;a eri\u015febilir ve job&#8217;lar\u0131n s\u00fcrecine dair g\u00f6zlemde bulunabiliriz.<a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"1151\" height=\"881\" class=\"aligncenter size-full wp-image-28884\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3.png 1151w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3-300x230.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3-1024x784.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-3-768x588.png 768w\" sizes=\"auto, (max-width: 1151px) 100vw, 1151px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"1177\" height=\"949\" class=\"aligncenter size-full wp-image-28885\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4.png 1177w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4-300x242.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4-1024x826.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-4-768x619.png 768w\" sizes=\"auto, (max-width: 1177px) 100vw, 1177px\" \/><\/a><a href=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5.png\"><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5.png\" alt=\".NET\u2019te Background Job ve Scheduling: TickerQ, Hangfire ve Quartz.NET Kar\u015f\u0131la\u015ft\u0131rmas\u0131\" width=\"1172\" height=\"864\" class=\"aligncenter size-full wp-image-28886\" srcset=\"https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5.png 1172w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5-300x221.png 300w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5-1024x755.png 1024w, https:\/\/www.gencayyildiz.com\/blog\/wp-content\/uploads\/2026\/08\/NETte-Background-Job-ve-Scheduling-TickerQ-Hangfire-ve-Quartz.NET-Karsilastirmasi-5-768x566.png 768w\" sizes=\"auto, (max-width: 1172px) 100vw, 1172px\" \/><\/a><\/p>\n<p>\u0130lgilenenlerin faydalanmas\u0131 dile\u011fiyle&#8230;<br \/>\nSonraki yaz\u0131lar\u0131mda g\u00f6r\u00fc\u015fmek \u00fczere&#8230;<br \/>\n\u0130yi \u00e7al\u0131\u015fmalar&#8230;<\/p>\n<div style=\"max-width:720px;margin:24px auto;padding:18px 20px;border-radius:12px;background:linear-gradient(135deg,#0d1117,#161b22);border:1px solid #30363d;font-family:-apple-system,BlinkMacSystemFont,'Segoe UI',Roboto,Arial,sans-serif;color:#e6edf3;box-shadow:0 10px 30px rgba(0,0,0,.35);\">\n<div style=\"display:flex;align-items:center;gap:14px;margin-bottom:12px;\">\n    <svg style=\"width:34px;height:34px;fill:#58a6ff;flex-shrink:0;\" viewBox=\"0 0 16 16\" aria-hidden=\"true\">\n      <path d=\"M8 0C3.58 0 0 3.58 0 8c0 3.54 2.29 6.53 5.47 7.59.4.07.55-.17.55-.38 0-.19-.01-.82-.01-1.49-2.01.37-2.53-.49-2.69-.94-.09-.23-.48-.94-.82-1.13-.28-.15-.68-.52-.01-.53.63-.01 1.08.58 1.23.82.72 1.21 1.87.87 2.33.66.07-.52.28-.87.51-1.07-1.78-.2-3.64-.89-3.64-3.95 0-.87.31-1.59.82-2.15-.08-.2-.36-1.02.08-2.12 0 0 .67-.21 2.2.82a7.65 7.65 0 012-.27c.68 0 1.36.09 2 .27 1.53-1.04 2.2-.82 2.2-.82.44 1.1.16 1.92.08 2.12.51.56.82 1.27.82 2.15 0 3.07-1.87 3.75-3.65 3.95.29.25.54.73.54 1.48 0 1.07-.01 1.93-.01 2.2 0 .21.15.46.55.38A8.013 8.013 0 0016 8c0-4.42-3.58-8-8-8z\"><\/path>\n    <\/svg><\/p>\n<div>\n<div style=\"font-size:18px;font-weight:600;line-height:1.2;\">\u00d6rnek \u00e7al\u0131\u015fmaya a\u015fa\u011f\u0131daki GitHub reposundan eri\u015febilirsiniz.<\/div>\n<div style=\"font-size:13px;color:#8b949e;\">https:\/\/github.com\/gncyyldz\/TickerQ.Example<\/div>\n<\/p><\/div>\n<\/p><\/div>\n<div style=\"font-size:14px;line-height:1.6;color:#c9d1d9;margin-bottom:14px;\">\n    Bu repository, ilgili konuya dair \u00f6rnek \u00e7al\u0131\u015fman\u0131n kaynak kodlar\u0131n\u0131 ve mimari yap\u0131s\u0131n\u0131 i\u00e7ermektedir. Detaylar i\u00e7in GitHub \u00fczerinden incelemede bulunabilirsiniz.\n  <\/div>\n<p>  <a href=\"https:\/\/github.com\/gncyyldz\/TickerQ.Example\" target=\"_blank\" rel=\"noopener noreferrer\"\n     style=\"display:inline-block;padding:10px 16px;border-radius:8px;background:#238636;color:#ffffff;text-decoration:none;font-size:14px;font-weight:600;transition:all .2s ease;\"><br \/>\n    GitHub\u2019da G\u00f6r\u00fcnt\u00fcle \u2192<br \/>\n  <\/a><\/p>\n<\/div>\n<!-- AddThis Advanced Settings generic via filter on the_content --><!-- AddThis Share Buttons generic via filter on the_content -->","protected":false},"excerpt":{"rendered":"<p>Merhaba, Bu i\u00e7eri\u011fimizde son d\u00f6nemlerde zamanlanm\u0131\u015f i\u015fler (scheduled jobs) i\u00e7in ciddi \u015fekilde ilgin\u00e7 bir alternatif haline gelmi\u015f olan TickerQ&#8217;yu inceleyecek ve \u00f6zellikle Quartz.NET&#8216;in ve Hangfire&#8216;nin y\u0131llard\u0131r \u00e7\u00f6zemedi\u011fi hangi problemlere dair \u00e7\u00f6z\u00fcmlerle geldi\u011fini de\u011ferlendiriyor olaca\u011f\u0131z.&#46;&#46;&#46;<!-- AddThis Advanced Settings generic via filter on get_the_excerpt --><!-- AddThis Share Buttons generic via filter on get_the_excerpt --><\/p>\n","protected":false},"author":1,"featured_media":28888,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5206,3102],"tags":[2808,1025,5749],"class_list":["post-28864","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-asp-net-core","tag-hangfire","tag-quartz-net","tag-tickerq"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28864","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/comments?post=28864"}],"version-history":[{"count":17,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28864\/revisions"}],"predecessor-version":[{"id":28887,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/posts\/28864\/revisions\/28887"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media\/28888"}],"wp:attachment":[{"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/media?parent=28864"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/categories?post=28864"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.gencayyildiz.com\/blog\/wp-json\/wp\/v2\/tags?post=28864"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}