{"id":1195,"date":"2017-05-01T16:00:28","date_gmt":"2017-05-01T13:00:28","guid":{"rendered":"https:\/\/gokhan-gokalp.com\/?p=1195"},"modified":"2017-05-03T15:07:30","modified_gmt":"2017-05-03T12:07:30","slug":"messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling","status":"publish","type":"post","link":"https:\/\/gokhan-gokalp.com\/tr\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/","title":{"rendered":"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling"},"content":{"rendered":"<p>Merhaba arkada\u015flar.<\/p>\n<p>Bu makale konumda sizlere messaging yap\u0131lar\u0131na ge\u00e7i\u015f s\u00fcre\u00e7lerimizde consumer&#8217;lar \u00fczerinde kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z <strong>Error <\/strong>ve <strong>Redeliver <\/strong>handling gibi concern&#8217;lerden bahsedip, nas\u0131l bir yakla\u015f\u0131m uygulad\u0131\u011f\u0131m\u0131z konusunda ve service bus olarak kulland\u0131\u011f\u0131m\u0131z MassTransit k\u00fct\u00fcphanesinin nas\u0131l\u00a0\u00e7\u00f6z\u00fcmler sundu\u011fu konusunda bilgiler payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m.<\/p>\n<h2>Consumer ile Error Handling<\/h2>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/masstransit-error-handling.png\"><img decoding=\"async\" class=\"aligncenter wp-image-1209 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/masstransit-error-handling.png\" alt=\"\" width=\"462\" height=\"346\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-error-handling.png 615w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-error-handling-300x225.png 300w\" data-sizes=\"(max-width: 462px) 100vw, 462px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 462px; --smush-placeholder-aspect-ratio: 462\/346;\" \/><\/a><\/p>\n<p>Bir e-commerce sistemi \u00fczerinde\u00a0\u00e7al\u0131\u015ft\u0131\u011f\u0131m\u0131z\u0131 d\u00fc\u015f\u00fcnelim. Sistem \u00fczerinde bir sipari\u015f ba\u015far\u0131yla ger\u00e7ekle\u015fti\u011fi an, sistem taraf\u0131ndan &#8220;IPaymentApproved&#8221; tipinde bir event f\u0131rlat\u0131ld\u0131\u011f\u0131n\u0131 varsayal\u0131m. &#8220;IPaymentApproved&#8221; event&#8217;\u0131n\u0131 dinleyen farkl\u0131 consumer&#8217;lar olabilece\u011fi gibi,\u00a0bunlardan birisinin \u00f6rne\u011fimiz gere\u011fi sipari\u015f detaylar\u0131n\u0131 m\u00fc\u015fteriye e-mail g\u00f6nderen bir servis oldu\u011funu d\u00fc\u015f\u00fcnerek ele alal\u0131m.<\/p>\n<p>&#8220;IPaymentApproved&#8221; event&#8217;\u0131, a\u015fa\u011f\u0131daki gibi\u00a0tan\u0131ml\u0131 olsun.<\/p>\n<pre class=\"lang:c# decode:true\">namespace ErrorAndRedeliverHandlingSample.Contracts\r\n{\r\n    public interface IPaymentApproved\r\n    {\r\n        string OrderNumber { get; set; }\r\n    }\r\n}<\/pre>\n<p>&#8220;IPaymentApproved&#8221; event&#8217;\u0131n\u0131 dinleyen consumer ise, \u015fimdilik a\u015fa\u011f\u0131daki gibi implemente edilmi\u015f olsun.<\/p>\n<pre class=\"lang:c# mark:7 decode:true\">namespace ErrorAndRedeliverHandlingSample\r\n{\r\n    public class PaymentApprovedConsumer : IConsumer<IPaymentApproved>\r\n    {\r\n        public async Task Consume(ConsumeContext<IPaymentApproved> context)\r\n        {\r\n            \/\/send an e-mail logic...\r\n        }\r\n    }\r\n}<\/pre>\n<p>Peki consume i\u015flemi s\u0131ras\u0131nda, herhangi bir exceptional durum ile kar\u015f\u0131la\u015f\u0131rsak ne olacak? Bu exception hatal\u0131 kodlamadan kaynakl\u0131 olabilece\u011fi gibi,\u00a0<strong>eksik<\/strong>\/<strong>tutars\u0131z<\/strong> produce edilen bir message&#8217;dan kaynakl\u0131 da olabilir.\u00a0Bu tarz durumlarda\u00a0kullan\u0131lmak \u00fczere MassTransit i\u00e7erisinde implemente edilmi\u015f baz\u0131 \u00e7\u00f6z\u00fcmler mevcuttur.<\/p>\n<p>Default bus ile exception MassTransit middleware&#8217;i taraf\u0131ndan yakalan\u0131r ve ilgili message, &#8220;<em>{queue_name}_error<\/em>&#8221; isimli bir queue&#8217;ya otomatik olarak ta\u015f\u0131n\u0131r. Exception&#8217;\u0131n detaylar\u0131na ise ta\u015f\u0131nan message&#8217;\u0131n header&#8217;\u0131 \u00fczerinden eri\u015febilmek m\u00fcmk\u00fcnd\u00fcr. Bu tarz problemlerden haberdar olabilmek i\u00e7in ise olu\u015fan &#8220;<em>{queue_name}<\/em><em>_error<\/em>&#8221; gibi \u00f6nemli queue&#8217;lar\u0131, \u00f6zellikle production ortamlar\u0131 i\u00e7in network monitoring tool&#8217;lar\u0131 ile <strong>sensor<\/strong> ekleyerek takip etmek, do\u011fru bir hareket olacakt\u0131r.<\/p>\n<h4>1. Retrying Messages<\/h4>\n<p>Baz\u0131 durumlarda bir web service&#8217;in o an cevap verememesi, database taraf\u0131nda deadlock olu\u015fabilmesi gibi transient exceptionlar ger\u00e7ekle\u015febilmektedir. Bu tarz durumlarda ilgili message&#8217;\u0131 o an kaybetmemek i\u00e7in kullanabilece\u011fimiz baz\u0131 <em>retrying<\/em> function&#8217;lar\u0131 bulunmaktad\u0131r.<\/p>\n<p>\u00d6rne\u011fin:<\/p>\n<pre class=\"lang:c# mark:8 decode:true\">namespace ErrorAndRedeliverHandlingSample\r\n{\r\n    public class PaymentApprovedConsumer : IConsumer<IPaymentApproved>\r\n    {\r\n        public async Task Consume(ConsumeContext<IPaymentApproved> context)\r\n        {\r\n            \/\/send an e-mail logic...\r\n            throw new Exception(\"Something's happened during processing...\");\r\n        }\r\n    }\r\n}<\/pre>\n<p>Yukar\u0131daki kod blo\u011funa bakal\u0131m ve e-mail g\u00f6nderim i\u015flemi\u00a0s\u0131ras\u0131nda kullan\u0131yor\u00a0oldu\u011fumuz e-mail provider&#8217;\u0131na ait web service&#8217;in, cevap vermedi\u011fini ve bu y\u00fczden transient bir exception olu\u015ftu\u011funu d\u00fc\u015f\u00fcnelim. Bu tarz durumlar genelde ikinci defa denemeler sonucunda ba\u015far\u0131yla ger\u00e7ekle\u015febilmektedir.<\/p>\n<p>Retry i\u015flemini devreye sokabilmek i\u00e7in a\u015fa\u011f\u0131daki gibi consumer&#8217;\u0131 initialize ederken, &#8220;UseRetry&#8221; method&#8217;unu kullanmak yeterli olacakt\u0131r.<\/p>\n<pre class=\"lang:c# mark:5 decode:true\">IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>\r\n{\r\n    cfg.ReceiveEndpoint(host, \"queue_name\", e =>\r\n    {\r\n        e.UseRetry(r => r.Immediate(5));\r\n        e.Consumer(() => new PaymentApprovedConsumer());\r\n    });\r\n}<\/pre>\n<p>&#8220;<em>e.UseRetry(r => r.Immediate(5));<\/em>&#8221; k\u0131sm\u0131na dikkat edersek, &#8220;Immediate&#8221; policy&#8217;si ile herhangi bir exception an\u0131nda ilgili message&#8217;\u0131 <strong>error queue<\/strong>&#8216;ya ta\u015f\u0131madan \u00f6nce, &#8220;5&#8221; kere daha denemesi gerekti\u011fini bildirdik. &#8220;Immediate&#8221; gibi birden fazla retry policy&#8217;leri bulunmaktad\u0131r. Bu policy&#8217;ler aras\u0131nda benim en yayg\u0131n olarak kulland\u0131\u011f\u0131m ise, &#8220;Incremental&#8221; retry policy olan\u0131d\u0131r. Bu policy ile ne kadar retry i\u015fleminin tekrar yap\u0131laca\u011f\u0131n\u0131, her denemenin ard\u0131ndan ne kadar s\u00fcre beklenece\u011fi ve her bekleme s\u00fcresinin de incremental olarak ne kadar artmas\u0131 gerekti\u011fi gibi bilgileri de set edebilmekteyiz.<\/p>\n<p>Bununla ilgili \u00f6rne\u011fi ise, MassTransit&#8217;in s\u0131k kullan\u0131yor oldu\u011fum\u00a0function&#8217;lar\u0131n\u0131 wrapledi\u011fim <em><a href=\"https:\/\/github.com\/GokGokalp\/MetroBus\" target=\"_blank\" rel=\"noopener noreferrer\">MetroBus<\/a><\/em> library&#8217;si \u00fczerinden g\u00f6stermek istiyorum.<\/p>\n<pre class=\"lang:c# mark:2 decode:true\">IBusControl busControl = MetroBusInitializer.Instance.UseRabbitMq(\"rabbitMqUri\", \"rabbitMqUserName\", \"rabbitMqPassword\")\r\n    .UseIncrementalRetryPolicy(retryLimit: 5, initialIntervalFromMinute: 10, intervalIncrementFromMinute: 10)\r\n    .InitializeConsumer<PaymentApprovedConsumer>(\"queueName\").Build();\r\n<\/pre>\n<p>Bunlara ek olarak MassTransit \u00fczerinde bulunan di\u011fer retry policy&#8217;ler ise:<\/p>\n<ul>\n<li>None<\/li>\n<li>Immediate<\/li>\n<li>Intervals<\/li>\n<li>Exponential<\/li>\n<li>Incremental<\/li>\n<\/ul>\n<p>\u015feklindedir.<\/p>\n<p>Bir di\u011fer yandan\u00a0retrying i\u015flemleri s\u0131ras\u0131nda meydana gelen exception&#8217;lar\u0131, <strong>retry filter<\/strong>&#8216;lar\u0131n\u0131 kullanarak handle ve ignore edebilmek de m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<p>\u00d6rne\u011fin:<\/p>\n<pre class=\"lang:default mark:3 decode:true\">cfg.UseRetry(r => \r\n{\r\n    c.Ignore(typeof(InvalidOperationException), typeof(InvalidCastException));\r\n});<\/pre>\n<p>Daha detayl\u0131 bilgilere\u00a0ise <em><a href=\"http:\/\/masstransit-project.com\/MassTransit\/usage\/retries.html\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> ula\u015fabilirsiniz. Dilerseniz retry i\u015flemi i\u00e7in bir \u00f6rnek ger\u00e7ekle\u015ftirelim.<\/p>\n<blockquote>\n<p><strong>NOT<\/strong>: Makale boyunca consumer&#8217;a y\u00f6nelik \u00f6rnekleri ger\u00e7ekle\u015ftirebilmek i\u00e7in, queue \u00fczerine &#8220;IPaymentApproved&#8221; interface&#8217;ini kullanarak bir ka\u00e7 message produce edece\u011fim.<\/p>\n<\/blockquote>\n<p>Bunun i\u00e7in \u00f6ncelikle &#8220;PaymentApprovedConsumer&#8221; class&#8217;\u0131n\u0131, a\u015fa\u011f\u0131daki gibi initialize edelim.<\/p>\n<pre class=\"lang:c# mark:20 decode:true\">namespace ErrorAndRedeliverHandlingSample\r\n{\r\n    public class PaymentApprovedConsumerService\r\n    {\r\n        private readonly IBusControl _consumerBusControl;\r\n        private readonly string _rabbitMqUri;\r\n        private readonly string _rabbitMqUserName;\r\n        private readonly string _rabbitMqPassword;\r\n        private readonly string _queueName;\r\n\r\n        public PaymentApprovedConsumerService()\r\n        {\r\n            _rabbitMqUri = ConfigurationManager.AppSettings[\"RabbitMqUri\"];\r\n            _rabbitMqUserName = ConfigurationManager.AppSettings[\"RabbitMqUserName\"];\r\n            _rabbitMqPassword = ConfigurationManager.AppSettings[\"RabbitMqPassword\"];\r\n            _queueName = ConfigurationManager.AppSettings[\"FooQueue\"];\r\n\r\n            _consumerBusControl =\r\n                MetroBusInitializer.Instance.UseRabbitMq(_rabbitMqUri, _rabbitMqUserName, _rabbitMqPassword)\r\n                .UseIncrementalRetryPolicy(3, 1, 1)\r\n                .InitializeConsumer<PaymentApprovedConsumer>(_queueName).Build();\r\n        }\r\n\r\n        public void Start()\r\n        {\r\n            _consumerBusControl.Start();\r\n        }\r\n\r\n        public void Stop()\r\n        {\r\n            _consumerBusControl.Stop();\r\n        }\r\n    }\r\n}<\/pre>\n<p>ve ard\u0131ndan &#8220;Program.cs&#8221; i\u00e7erisini a\u015fa\u011f\u0131daki gibi kodlay\u0131p, start&#8217;a basal\u0131m.<\/p>\n<pre class=\"lang:c# decode:true \">namespace ErrorAndRedeliverHandlingSample\r\n{\r\n    class Program\r\n    {\r\n        static void Main(string[] args)\r\n        {\r\n            var paymentApprovedConsumerService = new PaymentApprovedConsumerService();\r\n\r\n            paymentApprovedConsumerService.Start();\r\n        }\r\n    }\r\n}<\/pre>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/masstransit-retry.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-1244 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/masstransit-retry.jpg\" alt=\"\" width=\"790\" height=\"160\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry.jpg 1425w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-300x61.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-768x156.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-1024x208.jpg 1024w\" data-sizes=\"(max-width: 790px) 100vw, 790px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 790px; --smush-placeholder-aspect-ratio: 790\/160;\" \/><\/a><\/p>\n<p>Console \u00e7\u0131kt\u0131s\u0131na bakt\u0131\u011f\u0131m\u0131zda, consume ederken bir exception throw oldu ve bu i\u015flem sonucunda <strong>retry<\/strong> mekanizmas\u0131 devreye girdi.<\/p>\n<p>Queue \u00fczerine bakt\u0131\u011f\u0131m\u0131zda ise:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/rabbitmq-queue.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-1245 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/rabbitmq-queue.jpg\" alt=\"\" width=\"934\" height=\"330\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-queue.jpg 1767w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-queue-300x106.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-queue-768x272.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-queue-1024x362.jpg 1024w\" data-sizes=\"(max-width: 934px) 100vw, 934px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 934px; --smush-placeholder-aspect-ratio: 934\/330;\" \/><\/a><\/p>\n<p>message&#8217;\u0131n &#8220;unacked&#8221; olarak bekledi\u011fini g\u00f6rebiliriz.<\/p>\n<p>Incremental retry policy ile &#8220;1&#8221; er dakika arayla toplam &#8220;3&#8221; kere retry i\u015flemi ger\u00e7ekle\u015ftirilecektir\u00a0ve her bir denemenin ard\u0131ndan interval time&#8217;a\u00a0&#8220;1&#8221; er dakika daha eklenerek, retry i\u015flemi retry limit&#8217;e kadar\u00a0devam\u00a0edecektir. Retry limit&#8217;e ula\u015f\u0131ld\u0131\u011f\u0131nda hala failure durumu mevcut ise a\u015fa\u011f\u0131daki gibi message, error queue&#8217;ya ta\u015f\u0131nacakt\u0131r.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-1246 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure.jpg\" alt=\"\" width=\"833\" height=\"120\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure.jpg 1587w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure-300x43.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure-768x111.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/masstransit-retry-failure-1024x148.jpg 1024w\" data-sizes=\"(max-width: 833px) 100vw, 833px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 833px; --smush-placeholder-aspect-ratio: 833\/120;\" \/><\/a><\/p>\n<h4>2. Circuit Breaker Kullan\u0131m\u0131<\/h4>\n<p>MassTransit i\u00e7erisindeki exception handling unsurlar\u0131ndan \u00f6nemli birisi de, Circuit Breaker pattern&#8217;\u0131d\u0131r. Kullan\u0131m amac\u0131 ise belirli bir zaman diliminde sistem hata vermeye ba\u015flad\u0131\u011f\u0131nda ve failure threshold de\u011ferine ula\u015f\u0131ld\u0131\u011f\u0131nda, resource&#8217;lar\u0131 bu failure state durumlar\u0131ndaki overloaded&#8217;dan\u00a0koruyabilmek i\u00e7indir diyebilirim.<\/p>\n<p>Bu pattern&#8217;\u0131n genel ak\u0131\u015f\u0131 ise a\u015fa\u011f\u0131daki gibidir:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern.png\"><img decoding=\"async\" class=\"aligncenter wp-image-1234 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern.png\" alt=\"\" width=\"602\" height=\"214\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern.png 1061w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern-300x107.png 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern-768x273.png 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/circuit-breaker-pattern-1024x364.png 1024w\" data-sizes=\"(max-width: 602px) 100vw, 602px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 602px; --smush-placeholder-aspect-ratio: 602\/214;\" \/><\/a><\/p>\n<p>\u00d6rne\u011fin &#8220;IPaymentApproved&#8221; event&#8217;\u0131n\u0131 consume ederken, e-mail g\u00f6nderim i\u015flemi s\u0131ras\u0131nda kulland\u0131\u011f\u0131m\u0131z \u00a0e-mail provider&#8217;\u0131na ait web service&#8217;in bir s\u00fcre cevap vermedi\u011fini ve request&#8217;lerin 30 sn gibi bir s\u00fcre sonunda timed out&#8217;a u\u011frad\u0131\u011f\u0131n\u0131 d\u00fc\u015f\u00fcnelim. Peki ya t an\u0131nda bir \u00e7ok event olu\u015fursa ne olacak? T\u00fcm request&#8217;ler 30 sn timeout s\u00fcreleri sonunda failure state&#8217;ine u\u011frayacaklar ve resource&#8217;u gereksiz bir yere me\u015fgul etmi\u015f olaca\u011f\u0131z ve ayn\u0131 zamanda <strong>cascading failure<\/strong>&#8216;lara da sebebiyet vermi\u015f olabilece\u011fiz.<\/p>\n<p>Peki ya circuit breaker&#8217;\u0131 a\u00e7arsak bu durumda ne olacak?<\/p>\n<p>Bu durumda circuit breaker bizim i\u00e7in failure durumlar\u0131n\u0131 monitor edecektir. Failures durumlar\u0131 belirli bir threshold seviyesine ula\u015ft\u0131\u011f\u0131nda, circuit breaker devreye girecek ve repeated failures&#8217;lara sebebiyet veren durumlar\u0131 ge\u00e7ici olarak engelleyecektir. \u00c7al\u0131\u015fma mant\u0131\u011f\u0131 da ise\u00a0<strong>reset interval<\/strong>\u00a0time expire oldu\u011funda,\u00a0consume i\u015flemi yava\u015f bir \u015fekilde \u00e7al\u0131\u015fmaya devam edecektir. E\u011fer bu durum kar\u015f\u0131s\u0131nda failure tekrar devam ederse,\u00a0timeout interval\u00a0reset&#8217;lenir ve circuit breaker tekrar a\u00e7\u0131k moda getirilir. E\u011fer herhangi bir failure ile kar\u015f\u0131la\u015f\u0131lmazsa, t\u00fcm consume flow&#8217;u normal hale getirilir.<\/p>\n<p>MassTransit \u00fczerinde\u00a0circuit breaker&#8217;\u0131, a\u015fa\u011f\u0131daki gibi etkinle\u015ftirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre class=\"lang:c# mark:5-10 decode:true\">IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>\r\n{\r\n    cfg.ReceiveEndpoint(host, \"queue_name\", e =>\r\n    {\r\n        e.UseCircuitBreaker(cb =>\r\n        {\r\n            cb.TripThreshold = 15;\r\n            cb.ActiveThreshold = 10;\r\n            cb.ResetInterval = TimeSpan.FromMinutes(5);\r\n        });\r\n        e.Consumer(() => new PaymentApprovedConsumer());\r\n    });\r\n}<\/pre>\n<p>ayr\u0131ca MetroBus taraf\u0131nda ise, a\u015fa\u011f\u0131daki gibi etkinle\u015ftirilebilinir:<\/p>\n<pre class=\"lang:c# mark:2 decode:true\">IBusControl busControl = MetroBusInitializer.Instance.UseRabbitMq(\"rabbitMqUri\", \"rabbitMqUserName\", \"rabbitMqPassword\")\r\n    .UseCircuitBreaker(tripThreshold: 15, activeThreshold: 10, resetInterval: 5)\r\n    .InitializeConsumer<PaymentApprovedConsumer>(\"queueName\").Build();<\/pre>\n<p>Circuit breaker hakk\u0131nda daha detayl\u0131 bilgiye, <em><a href=\"http:\/\/masstransit-project.com\/MassTransit\/advanced\/middleware\/circuit-breaker.html\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> ula\u015fabilirsiniz.<\/p>\n<h4>3. Rate Limiter Kullan\u0131m\u0131<\/h4>\n<p>Consumer initialize ederken dikkat edilmesi gereken bir di\u011fer unsur ise,\u00a0rate limiter kullan\u0131m\u0131d\u0131r. Kullan\u0131m\u0131ndaki as\u0131l ama\u00e7 ise: consumer i\u00e7erisinde e-mail g\u00f6nderim i\u015flemi i\u00e7in kulland\u0131\u011f\u0131m\u0131z provider, saniye ba\u015f\u0131na belirli bir say\u0131da call limiti kabul ediyor olabilir. Bu gibi durumlarda rate limiter kullan\u0131labilmektedir.<\/p>\n<p>A\u015fa\u011f\u0131daki gibi etkinle\u015ftirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre class=\"lang:c# mark:5 decode:true\">IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>\r\n{\r\n    cfg.ReceiveEndpoint(host, \"queue_name\", e =>\r\n    {\r\n        e.UseRateLimit(20, TimeSpan.FromSeconds(5));\r\n        e.Consumer(() => new PaymentApprovedConsumer());\r\n    });\r\n}<\/pre>\n<p>MetroBus \u00fczerinde ise:<\/p>\n<pre class=\"lang:c# mark:2 decode:true\">IBusControl busControl = MetroBusInitializer.Instance.UseRabbitMq(\"rabbitMqUri\", \"rabbitMqUserName\", \"rabbitMqPassword\")\r\n    .UseRateLimiter(rateLimit: 20, interval: 5000)\r\n    .InitializeConsumer<PaymentApprovedConsumer>(\"queueName\").Build();<\/pre>\n<p>&#8220;UseRateLimiter()&#8221; \u0131 kullanarak fluently bir \u015fekilde etkinle\u015ftirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<h2>Redeliver Messages<\/h2>\n<p>Son zamanlarda baz\u0131 business case&#8217;ler do\u011frultusunda kar\u015f\u0131la\u015ft\u0131\u011f\u0131m belkide en \u00f6nemli concern&#8217;lerden birisi de, hen\u00fcz i\u015flemememiz gereken\u00a0message&#8217;lar\u0131 nas\u0131l handle edece\u011fiz konusu olmu\u015ftur.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-1251 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed.jpg\" alt=\"\" width=\"804\" height=\"391\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed.jpg 1161w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed-300x146.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed-768x374.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/04\/rabbitmq-delayed-1024x498.jpg 1024w\" data-sizes=\"(max-width: 804px) 100vw, 804px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 804px; --smush-placeholder-aspect-ratio: 804\/391;\" \/><\/a><\/p>\n<p>Build-in olarak RabbitMQ i\u00e7erisinde AMQP standartlar\u0131nda <strong>deferred<\/strong> i\u015flemler bulunmamaktad\u0131r. Fakat MassTransit i\u00e7erisinde bunu ger\u00e7ekle\u015ftirebilmenin bir ka\u00e7 yolu vard\u0131r.<\/p>\n<ol>\n<li>Quartz.Net&#8217;i kullanarak, scheduling message&#8217;lar ile ger\u00e7ekle\u015ftirilebilinir. Bu konudaki bilgiye, <em><a href=\"http:\/\/masstransit.readthedocs.io\/en\/master\/scheduling\/index.html\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em> eri\u015febilirsiniz.<\/li>\n<li>RabbitMQ&#8217;nun community plugin&#8217;leri aras\u0131nda bulunan, &#8220;RabbitMQ Delayed Message Plugin&#8221; ile ger\u00e7ekle\u015ftirebilmek de m\u00fcmk\u00fcnd\u00fcr.<\/li>\n<\/ol>\n<p>Bu konudaki \u00f6rne\u011fi benimde kulland\u0131\u011f\u0131m &#8220;RabbitMQ Delayed Message Plugin&#8221; ile ger\u00e7ekle\u015ftirece\u011fim. Bunun i\u00e7in \u00f6ncelikle <em><a href=\"http:\/\/www.rabbitmq.com\/community-plugins.html\" target=\"_blank\" rel=\"noopener noreferrer\">buradan<\/a><\/em>\u00a0&#8220;rabbitmq_delayed_message_exchange&#8221; plugin&#8217;ini indirelim ve kurulumunu ger\u00e7ekle\u015ftirelim.<\/p>\n<blockquote>\n<p><strong>NOT<\/strong>: \u0130ndirilen ilgili plugin&#8217;i RabbitMQ i\u00e7erisindeki &#8220;plugins&#8221; klas\u00f6r\u00fcne atarak, &#8220;rabbitmq-plugins enable rabbitmq_delayed_message_exchange&#8221; komutu ile CLI \u00fczerinden etkinle\u015ftirebilmek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<\/blockquote>\n<p>Plugin&#8217;i etkinle\u015ftirmemizin ard\u0131ndan, MassTransit i\u00e7erisinden a\u015fa\u011f\u0131daki gibi initialize edebiliriz.<\/p>\n<pre class=\"lang:c# mark:3 decode:true \">IBusControl busControl = Bus.Factory.CreateUsingRabbitMq(cfg =>\r\n{\r\n    cfg.UseDelayedExchangeMessageScheduler();\r\n}<\/pre>\n<p>MetroBus i\u00e7erisinde ise:<\/p>\n<pre class=\"lang:c# mark:2 decode:true\">IBusControl busControl = MetroBusInitializer.Instance.UseRabbitMq(\"rabbitMqUri\", \"rabbitMqUserName\", \"rabbitMqPassword\")\r\n    .UseDelayedExchangeMessageScheduler()\r\n    .InitializeConsumer<PaymentApprovedConsumer>(\"queueName\").Build();<\/pre>\n<p>yukar\u0131daki gibi initialize etmek, yeterli olacakt\u0131r.<\/p>\n<p>&#8220;PaymentApprovedConsumer&#8221; class&#8217;\u0131n\u0131 ise, a\u015fa\u011f\u0131daki gibi refactor edelim.<\/p>\n<pre class=\"lang:c# mark:7,16 decode:true\">namespace ErrorAndRedeliverHandlingSample\r\n{\r\n    public class PaymentApprovedConsumer : IConsumer<IPaymentApproved>\r\n    {\r\n        public async Task Consume(ConsumeContext<IPaymentApproved> context)\r\n        {\r\n            int? maxAttempts = context.Headers.Get(\"MT-Redelivery-Count\", default(int?));\r\n\r\n            if (maxAttempts > 3)\r\n            {\r\n                throw new Exception(\"Something's happened during processing...\");\r\n            }\r\n\r\n            Console.WriteLine($\"Attempts: {maxAttempts} Order number: {context.Message.OrderNumber}\");\r\n\r\n            await context.Defer(TimeSpan.FromMinutes(1));\r\n        }\r\n    }\r\n}<\/pre>\n<p>Deferred i\u015flemlerde dikkat etmemiz gereken bir di\u011fer nokta ise, &#8220;MT-Redelivery-Count&#8221; key&#8217;i ile message&#8217;\u0131n header&#8217;\u0131 \u00fczerinden ald\u0131\u011f\u0131m\u0131z <strong>redelivery count<\/strong> bilgisidir. Bu bilgi sayesinde message&#8217;\u0131 ka\u00e7 kere retry etti\u011fimizi \u00f6\u011frenebilir, <strong>infinite retry <\/strong>i\u015flemlerinden de ka\u00e7\u0131nabilmi\u015f oluruz.<\/p>\n<p>Consumer&#8217;\u0131 start edelim ve sonucuna bir bakal\u0131m.<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq.jpg\"><img decoding=\"async\" class=\"aligncenter size-full wp-image-1300 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq.jpg\" alt=\"\" width=\"1592\" height=\"306\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq.jpg 1592w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq-300x58.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq-768x148.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/redeliver-rabbitmq-1024x197.jpg 1024w\" data-sizes=\"(max-width: 1592px) 100vw, 1592px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 1592px; --smush-placeholder-aspect-ratio: 1592\/306;\" \/><\/a><\/p>\n<p>Console \u00e7\u0131kt\u0131s\u0131na bakt\u0131\u011f\u0131m\u0131zda, &#8220;<em>context.Defer(TimeSpan.FromMinutes(1))<\/em>&#8221;\u00a0kod sat\u0131r\u0131 ile set etmi\u015f oldu\u011fumuz &#8220;1&#8221; er dakikal\u0131k defer i\u015flemi, ba\u015far\u0131yla ger\u00e7ekle\u015fmi\u015f ve sonunda i\u015flemi tamamlayamad\u0131\u011f\u0131 i\u00e7in ilgili message&#8217;\u0131 error queue \u00fczerine y\u00f6nlendirmi\u015ftir.<\/p>\n<p>Bu i\u015flem s\u0131ras\u0131nda RabbitMQ&#8217;nun management ekran\u0131na bakt\u0131\u011f\u0131m\u0131zda ise:<\/p>\n<p><a href=\"\/wp-content\/uploads\/2017\/05\/delay-queue.jpg\"><img decoding=\"async\" class=\"aligncenter wp-image-1301 lazyload\" data-src=\"\/wp-content\/uploads\/2017\/05\/delay-queue.jpg\" alt=\"\" width=\"812\" height=\"722\" data-srcset=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/delay-queue.jpg 1203w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/delay-queue-300x267.jpg 300w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/delay-queue-768x682.jpg 768w, https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2017\/05\/delay-queue-1024x910.jpg 1024w\" data-sizes=\"(max-width: 812px) 100vw, 812px\" src=\"data:image\/svg+xml;base64,PHN2ZyB3aWR0aD0iMSIgaGVpZ2h0PSIxIiB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciPjwvc3ZnPg==\" style=\"--smush-placeholder-width: 812px; --smush-placeholder-aspect-ratio: 812\/722;\" \/><\/a><\/p>\n<p>MassTransit burada bizim i\u00e7in &#8220;<em>_delay<\/em>&#8221; postfix&#8217;i ile bir exchange olu\u015fturmu\u015ftur ve defer i\u015flemi s\u0131ras\u0131nda ilgili message&#8217;\u0131n bind i\u015flemini, bu exchange \u00fczerinden ger\u00e7ekle\u015ftirmi\u015ftir.<\/p>\n<p>Umar\u0131m faydal\u0131 bir yaz\u0131 olmu\u015ftur. Makale s\u0131ras\u0131nda kulland\u0131\u011f\u0131m ilgili \u00f6rne\u011fe, GitHub hesab\u0131m \u00fczerinden eri\u015febilirsiniz. E\u011fer konu ile ilgili herhangi bir sorunuz olursa, yorum olarak yazabilirsiniz.<\/p>\n<p><a href=\"https:\/\/github.com\/GokGokalp\/messaging-error-and-redeliver-handling-sample\" target=\"_blank\" rel=\"noopener noreferrer\">https:\/\/github.com\/GokGokalp\/messaging-error-and-redeliver-handling-sample<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Merhaba arkada\u015flar. Bu makale konumda sizlere messaging yap\u0131lar\u0131na ge\u00e7i\u015f s\u00fcre\u00e7lerimizde consumer&#8217;lar \u00fczerinde kar\u015f\u0131la\u015ft\u0131\u011f\u0131m\u0131z Error ve Redeliver handling gibi concern&#8217;lerden bahsedip, nas\u0131l bir yakla\u015f\u0131m uygulad\u0131\u011f\u0131m\u0131z konusunda ve service bus olarak kulland\u0131\u011f\u0131m\u0131z MassTransit k\u00fct\u00fcphanesinin nas\u0131l\u00a0\u00e7\u00f6z\u00fcmler sundu\u011fu konusunda bilgiler payla\u015fmaya \u00e7al\u0131\u015faca\u011f\u0131m. Consumer ile Error Handling Bir e-commerce sistemi&#8230;<\/p>\n<div class=\"more-link-wrapper\"><a class=\"more-link\" href=\"https:\/\/gokhan-gokalp.com\/tr\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/\">Devam\u0131n\u0131 okuyun<span class=\"screen-reader-text\">Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling<\/span><\/a><\/div>\n","protected":false},"author":1,"featured_media":961,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[5,68,285,368],"tags":[290,410,402,405,400,333,404,408,403,409,412,346,401,406,407,411],"class_list":["post-1195","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-net","category-architectural","category-messaging","category-microservices","tag-c-messaging","tag-circuit-breaker","tag-consumer-error-handling","tag-deferred-queue","tag-event-driven-development","tag-masstransit","tag-masstransit-deferred","tag-masstransit-delayed-message","tag-masstransit-error-handling","tag-masstransit-redeliver-message","tag-masstransit-retrying-messages","tag-messaging-architecture","tag-messaging-concern","tag-rabbitmq-deferred","tag-rabbitmq-delayed-exchange","tag-rate-limiter","entry"],"translation":{"provider":"WPGlobus","version":"3.0.2","language":"tr","enabled_languages":["en","tr"],"languages":{"en":{"title":true,"content":true,"excerpt":false},"tr":{"title":true,"content":true,"excerpt":false}}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp<\/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:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"og:url\" content=\"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/\" \/>\n<meta property=\"og:site_name\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta property=\"article:published_time\" content=\"2017-05-01T13:00:28+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2017-05-03T12:07:30+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png\" \/>\n\t<meta property=\"og:image:width\" content=\"623\" \/>\n\t<meta property=\"og:image:height\" content=\"242\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"G\u00f6khan G\u00f6kalp\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"17 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/\"},\"author\":{\"name\":\"G\u00f6khan G\u00f6kalp\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"headline\":\"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling\",\"datePublished\":\"2017-05-01T13:00:28+00:00\",\"dateModified\":\"2017-05-03T12:07:30+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/\"},\"wordCount\":2811,\"commentCount\":8,\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/message-queue.png\",\"keywords\":[\"c# messaging\",\"circuit breaker\",\"consumer error handling\",\"deferred queue\",\"event driven development\",\"masstransit\",\"masstransit deferred\",\"masstransit delayed message\",\"masstransit error handling\",\"masstransit redeliver message\",\"masstransit retrying messages\",\"messaging architecture\",\"messaging concern\",\"rabbitmq deferred\",\"rabbitmq delayed exchange\",\"rate limiter\"],\"articleSection\":[\".NET\",\"Architectural\",\"Messaging\",\"Microservices\"],\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/\",\"name\":\"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/message-queue.png\",\"datePublished\":\"2017-05-01T13:00:28+00:00\",\"dateModified\":\"2017-05-03T12:07:30+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#primaryimage\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/message-queue.png\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/uploads\\\/2016\\\/11\\\/message-queue.png\",\"width\":623,\"height\":242},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Error Handling and Message Redelivery in MassTransit\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#website\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"description\":\"C# &amp; Python lover\",\"publisher\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/gokhan-gokalp.com\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/#\\\/schema\\\/person\\\/7e2a7fa98babd22a5fdae563c4b8cdbe\",\"name\":\"G\u00f6khan G\u00f6kalp\",\"pronouns\":\"he\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"contentUrl\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\",\"caption\":\"G\u00f6khan G\u00f6kalp\"},\"logo\":{\"@id\":\"https:\\\/\\\/gokhan-gokalp.com\\\/wp-content\\\/litespeed\\\/avatar\\\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659\"},\"sameAs\":[\"https:\\\/\\\/gokhan-gokalp.com\"],\"url\":\"https:\\\/\\\/gokhan-gokalp.com\\\/tr\\\/author\\\/gok-gokalp\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp","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:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/","og_locale":"tr_TR","og_type":"article","og_title":"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp","og_url":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/","og_site_name":"G\u00f6khan G\u00f6kalp","article_published_time":"2017-05-01T13:00:28+00:00","article_modified_time":"2017-05-03T12:07:30+00:00","og_image":[{"width":623,"height":242,"url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png","type":"image\/png"}],"author":"G\u00f6khan G\u00f6kalp","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"G\u00f6khan G\u00f6kalp","Tahmini okuma s\u00fcresi":"17 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#article","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/"},"author":{"name":"G\u00f6khan G\u00f6kalp","@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"headline":"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling","datePublished":"2017-05-01T13:00:28+00:00","dateModified":"2017-05-03T12:07:30+00:00","mainEntityOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/"},"wordCount":2811,"commentCount":8,"publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png","keywords":["c# messaging","circuit breaker","consumer error handling","deferred queue","event driven development","masstransit","masstransit deferred","masstransit delayed message","masstransit error handling","masstransit redeliver message","masstransit retrying messages","messaging architecture","messaging concern","rabbitmq deferred","rabbitmq delayed exchange","rate limiter"],"articleSection":[".NET","Architectural","Messaging","Microservices"],"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/","url":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/","name":"Messaging Yap\u0131lar\u0131nda MassTransit ile Error ve Redeliver Handling - G\u00f6khan G\u00f6kalp","isPartOf":{"@id":"https:\/\/gokhan-gokalp.com\/#website"},"primaryImageOfPage":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#primaryimage"},"image":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#primaryimage"},"thumbnailUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png","datePublished":"2017-05-01T13:00:28+00:00","dateModified":"2017-05-03T12:07:30+00:00","breadcrumb":{"@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/"]}]},{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#primaryimage","url":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/uploads\/2016\/11\/message-queue.png","width":623,"height":242},{"@type":"BreadcrumbList","@id":"https:\/\/gokhan-gokalp.com\/messaging-yapilarinda-masstransit-ile-error-ve-redeliver-handling\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/gokhan-gokalp.com\/"},{"@type":"ListItem","position":2,"name":"Error Handling and Message Redelivery in MassTransit"}]},{"@type":"WebSite","@id":"https:\/\/gokhan-gokalp.com\/#website","url":"https:\/\/gokhan-gokalp.com\/","name":"G\u00f6khan G\u00f6kalp","description":"C# &amp; Python lover","publisher":{"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/gokhan-gokalp.com\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/gokhan-gokalp.com\/#\/schema\/person\/7e2a7fa98babd22a5fdae563c4b8cdbe","name":"G\u00f6khan G\u00f6kalp","pronouns":"he","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","url":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","contentUrl":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659","caption":"G\u00f6khan G\u00f6kalp"},"logo":{"@id":"https:\/\/gokhan-gokalp.com\/wp-content\/litespeed\/avatar\/e645f66b6264ced10d7b6d8b1f85509b.jpg?ver=1776170659"},"sameAs":["https:\/\/gokhan-gokalp.com"],"url":"https:\/\/gokhan-gokalp.com\/tr\/author\/gok-gokalp\/"}]}},"_links":{"self":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1195","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/comments?post=1195"}],"version-history":[{"count":119,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1195\/revisions"}],"predecessor-version":[{"id":1371,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/posts\/1195\/revisions\/1371"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media\/961"}],"wp:attachment":[{"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/media?parent=1195"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/categories?post=1195"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/gokhan-gokalp.com\/tr\/wp-json\/wp\/v2\/tags?post=1195"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}