Ana Sayfa / Seçilmiş İşler / Fatura kapanışı
Vaka
Fatura kapanışı: 30 dakikadan 2 dakikaya
İş sorunu
Şirketin günlük fatura kapanışı bir gece toplu işiyle yapılıyordu: günün tüm kullanımı toplanır, fiyatlanır ve fatura kalemleri yazılırdı. İşlem hacmi büyüdükçe bu iş 30 dakikayı aşar olmuştu — ve ya hep ya hiçti. 25. dakikada çıkan bir hata her şeyi baştan başlatıyor, faturalama ve tahsilat o pencere boyunca bekliyordu.
Risk
Konu finansal veriydi: yanlış bir rakam doğrudan müşteri faturasına yansır. Bu yüzden hız tek başına hedef olamazdı — yeni sistemin eskisiyle kuruşu kuruşuna aynı sonucu ürettiği kanıtlanmadan geçiş yapılmayacaktı. Üstelik faturalama her gün çalıştığı için kesinti de göze alınamazdı: geçiş, sistem yaşarken yapılmalıydı.
Yapılan
Gece toplu işinin yerine, kayıtlar geldikçe işleyen kademeli bir akış kurdum. Geçişten önce eski ve yeni sistem üç tam fatura dönemi boyunca yan yana çalıştı; her dönemin sonunda iki tarafın ürettiği rakamlar hesap hesap, otomatik olarak karşılaştırıldı. Geçiş şartı "fark azalsın" değil, "fark sıfır olsun"du.
Projeyi iki mühendisle birlikte yürüttüm: hedef mimari, geçiş planı ve doğrulama düzeneği bende; akışın çekirdeğini de bizzat ben yazdım.
Sonuç
Fatura kapanışı 30 dakikadan 2 dakikanın altına indi. Üç dönem üst üste sıfır farkla mutabakat sağlandıktan sonra geçiş yapıldı; geçiş günü de fark çıkmadı. Bir o kadar önemlisi: artık bir hata bütün günü değil, işin küçük bir dilimini etkiliyor — saniyeler içinde o dilim yeniden işleniyor.
Bu bölüm, kararların dayanağını görmek isteyen teknik okurlar içindir — vakanın özü yukarıda bitti.
Kararlar
Toplu birleştirmenin yerini artımlı bir Kafka hattı aldı: hesaba göre anahtarlanmış kullanım olayları, koşan toplamları kuran idempotent tüketiciler ve kurtarmanın tüm günü değil tek bir partition'ı yeniden oynatmasını sağlayan compacted state topic.
Reddedilen — batch SQL'i iyileştirmek: profil ölçümü, kazanımın yıl değil ay mertebesinde olacağını gösterdi; maliyet hacimle doğrusal büyümeye devam ediyordu ve başarısız bir koşu yine baştan başlamak demekti.
Reddedilen — Spark toplama işi: hesaplamayı çözüyordu ama üç kişilik bir ekibin bu iş yükü için taşımaması gereken bir operasyon yüzeyi ekliyordu.
Kafka'yı seçtiren asıl ölçüt hata kapsamıydı: anahtarlı partition'lar ve idempotent tüketicilerle kötü bir deploy ya da bozuk mesajın bedeli, 30 dakikalık yeniden koşu değil, saniyelerle ölçülen bir partition tekrarı.
Ölçüm yöntemi
- Gölge çalışma: yeni hat, üç tam fatura dönemi boyunca eski toplu işle yan yana koştu ve paralel bir tabloya yazdı.
- Süre: ilk kullanım olayından "defter tamam" işaretine kadar duvar saati, her iki yol için dönem başına kaydedildi; raporlanan sayı dönemler arası p95'tir.
- Doğruluk: dönem başına, hesap başına otomatik mutabakat farkı. Geçiş eşiği "az fark" değil, sıfır farktı.
Bugün olsa farklı ne yapardım
Mutabakat düzeneğini üçüncü değil, ilk iş kurardım. Birim testlerin kaçırdığı bir yuvarlama-sırası hatasını en sonunda o yakaladı — iki hafta önce kurulsaydı o hata ayıklamanın çoğunu kazandırırdı. Consumer-lag alarmını da ilk günden eklerdim; biz ilk sessiz gecikme olayından sonra ekledik.
Taslak notu: bu vakadaki anlatı ayrıntıları yayın öncesi kaynağıyla satır satır doğrulanacaktır.
Benzer bir sorunla mı uğraşıyorsunuz?
Buradaki her sayı için aynı kural geçerli: bir sayı, ancak nasıl ölçüldüğü kadar değerlidir.