Yazılım Projelerinde Kabullenme — Hata Yakalama ve Rollback Mekanizmaları

Beytullah Gurpinar
Teknasyon Engineering

--

Yazılım projeleri yapıları gereği birden fazla metot üzerinde çalışabilen, çok farklı servislerle haberleşip o servislerden alınan cevaplara göre akışlar çalıştırabilen ve çok fazla farklı ürünü / servisi bir araya getirerek yapılması gereken nihai hizmeti veren ürünlerdir.

Proje geliştirme aşamasında önceden öngörülebilecek hatalar olabileceği gibi, dış servislerden kaynaklı hatalar da oluşabilmektedir. Bu yazıdaki amacım yazılım projelerinde hataların kabullenme aralıkları ile farklı hata türlerinde nasıl aksiyonlar alınacağından elimden geldiğince bahsetmektir.

Son yıllarda FinTech projelerinin trend olması ve ödeme sistemi olarak hizmet veren bu servislerde alınan risklerin diğer projelere göre çok daha büyük olması nedeniyle bu yazıdaki örnekleri bir ödeme sistemi üzerinden vereceğim.Ancak buradaki örnekleri dil, proje ve veritabanından bağımsız olacak şekilde tüm projelerde görebilir ve uygulayabilirsiniz.

Proje

Bir ödeme sistemi ile kullanıcıların kredi kartı kullanarak satın alma yapacağını varsayalım. Satın alma işleminde ortaya çıkabilecek hatalar ve bunlara göre alınabilecek aksiyonları kısaca inceleyelim.

Proje bileşenleri

API
Database

Kullanıcılar API üzerinden kart bilgilerini gönderecek ve bu bilgiler ödeme sağlayıcıya iletilecek, sonrasında ödeme sağlayıcıdan `Başarılı İşlem` cevabı gelirse veritabanında abonelik kayıtları açılacak ve client tarafına `Başarılı İşlem` cevabı dönülecektir. Happy path’de tüm senaryolar doğru çalışırsa sorun olmayacaktır. Gelin bu senaryoda ortaya çıkabilecek hatalara bakalım.

Üstteki basit ödeme servisini incelendiğinde, ödeme sağlayıcıdan başarılı işlem cevabı döndüğünde akışın devam ettiği ve abonelik bilgilerinin oluşturulduğu, hatalı işlem döndüğünde ise bir hata cevabı dönüldüğü görülmektedir.Pratik olarak bu sorunsuz çalışabileceği gibi şimdi bu akış içerisinde oluşabilecek hata durumlarını ve bu durumlara karşı alabileceğimiz aksiyonları inceleyeceğiz.

Race Condition

Abonelik durumu kontrol edilirken bir ödeme isteği geldiğinde işlem sonucu olmadan aynı bilgilerle başka istekler de gelirse burada aynı pakete aynı abonenin x kadar abone olmasına neden olunabilir.Projenizde abonenin bir paket için yalnızca bir kere satın alma yapabilmesi hedefleniyorsa akışınızı bozacak bir durum ortaya çıkacaktır.Çözüm için unique olması gereken değerler ile her ödeme öncesinde işlem kilitlenip, işlem sonucunda kilit kaldırılarak race condition durumunun önüne geçilebilir.

Python ile yazılan örnek race condition uygulaması : https://www.pythontutorial.net/python-concurrency/python-threading-lock/

Hata Yakalama

Yukarıdaki örnekte tüm akışlar sorunsuz çalışacak şekilde yazıldı. Ancak günümüz dünyasında özellikle 3. parti API’lerle çalışan sistemlerde karşı serviste hata alınma riskleri oldukça yüksek. Bu oran ödeme sistemlerinde biraz daha fazla. O yüzden bir ödeme işleminde oluşabilecek tüm ihtimaller düşünülerek, bu ihtimalleri yönetecek senaryoların türetilmesi zorunludur. Burada oluşabilecek durumlara örnek vermek gerekirse; ödeme servisinin cevap vermemesi, ödeme servisinden dönecek hatanın ilk defa gelmesi, ödeme servisinde genel bir sorun nedeniyle ödeme cevaplarının alınamaması, vs. sorunlarla karşılaşılabilir.

Örnek case olarak ödeme sağlayıcıya atılan bir isteğe hiç cevap alınamaması, hatalı bir cevap almaktan daha korkutucu olacaktır. Çünkü kullanıcıdan para çekilip cevap alınamamış olabilir ya da daha farklı ve büyük bir problem olabilir. O yüzden bu şekilde ortaya çıkan hataların mutlaka yakalanması ve buna göre kod içerisinde aksiyonlar alınması gereklidir. Örneğin aşağıdaki kodda provider tarafına atılan isteğe cevap alınamadığında, ödemenin provider tarafında kontrol edilmesi ve ödeme çekildiyse ona göre alınacak aksiyonlar gösterilmeye çalışılmıştır.

Örnek kodda sadece ödeme sağlayıcıdan geç cevap dönmemesi durumu gösterilmiştir. Gerçek hayatta kullanılan servise göre çok daha farklı durumlar ortaya çıkabilmektedir.

Rollback

Rollback’in Türkçe karşılığı “geri alma, geriye dönme”dir. Bazen projelerde akışı tamamen kesecek bir durum ile karşılaşılığında ilgili akışın başına dönme ya da o akışı tamamen iptal etme gibi durumlar olabilir. Ancak akış içerisinde kullanıcıyı ya da sistemi etkileyecek işlemler yapıldıysa bunların da geri alınması gerekmektedir.

Ödeme sistemlerinde en çok yaşanılan durumlar ödeme çekildikten sonra sistemden kaynaklanan ve ilgili hizmetin, ürünün vs, son kullanıcıya verilemediği durumlardır. Bu gibi hatalarda alınacak kararlara göre rollback mekanizmaları çalıştırılmalı, ilgili rollback mekanizmaları içinde durum düzeltilmelidir.

Üstteki rollback örneğinde ödeme işlemi başarılı ancak veritabanına kayıt işlemi hatalı olduğunda ilgili işlemin iadesinin yapıldığını görebilirsiniz. Siz, kendi projenizde kendi kurallarınızı uygulayarak kendi rollback mekanizmaları ve akışlarınızı çalıştırabilirsiniz. Burada dikkat edilmesi gereken en önemli konu son kullanıcının verdiğiniz karar mekanizmaları içinde mağduriyete uğramamasıdır.

Doğru Log Kullanımı

Bir projenin ilerleyen süreçlerde doğru yönetilebilmesi, ortaya çıkan hataların yakalanması ve çözüme yardımcı olabilmesi için bir proje içinde log kullanımı en az projenin dizaynı kadar önemlidir. Ortaya çıkacak durumun sistemde yarattığı sorunun büyüklüğüne göre log seviyeleri kullanılarak hataların doğru izleme yöntemleri ile hızlıca yakalanması ve sorunun çözülmesi sağlanabilir.

Ayrıca hata olmaksızın proje içindeki 3. parti sistemlere atılan tüm isteklerin ve bu isteklere gelen cevapların da loglanması, ilerde oluşabilecek durumlara karşı elinizde bir kanıt olmaktadır.

Projelerde log yönetimi ile ilgili detaylı bilgiler öğrenmek için aşağıdaki videoyu izlemenizi öneririm.

Özet geç derseniz :)

Yazılım projeleri geliştirilirken ortaya çıkabilecek tüm hataların önceden planlanması ve bu hatalara göre alınacak aksiyonların kod içerisinde alınması çok önemlidir. Bir e-ticaret sitesinde ödeme alınıp sipariş oluşturulamaması, bir ödeme sağlayıcıda tutarın çekilip sistemlere işlenmemesi ya da bir mobil uygulamada abonelik satılıp hakların verilememesi gibi hatalar hem kullanıcı kaybı hem de güvenilirlik olarak itibar kaybettirici hatalar olacaktır. O yüzden bu gibi durumların önüne geçmek için proje içerisinde tüm bu hataların yakalanması, bunlara göre otomatik aksiyonlar alınması çok önemlidir.

Buraya kadar sabırla okuduğunuz için teşekkür ederim. Soru ve farklı durumlar için bana aşağıdaki linklerden ulaşabilirsiniz.

Linkedin: https://www.linkedin.com/in/beytullah/
Twitter: https://twitter.com/beytullah

--

--

FinTech, Startup, Payment Gateway, Payment Orchestration, Subscription Management