Teknoloji
.NET sisteminizi durdurmadan, parça parça güncelleyin
Çoğu .NET sisteminde .NET Framework kodu, WCF servisleri ve daha küçük bir yük için yazılmış veri erişimi bir arada bulunur. Bunları bir reverse proxy arkasında modern .NET’e taşır, sistemi yavaşlatan noktaları düzeltir ve her adımı geri alınabilir tutarız.
- Süre
- Aşama başına 4 ila 12 hafta
- Model
- Aşamalı program
- Çıktı
- Modern .NET üzerinde ölçülmüş servisler
Bu hizmete ihtiyaç duyduğunuzun işaretleri
Bunların her biri kodda, loglarda ya da bir panoda görülebilir.
- Sistemin bir kısmı hâlâ .NET Framework ve IIS üzerinde çalışıyor; bu yüzden geri kalanıyla birlikte Linux container’larına taşınamıyor.
- WCF servisleri kritik akışların ortasında duruyor ve kimse sözleşmelerine dokunmak istemiyor.
- Yük altında yanıt süreleri fırlıyor ama CPU düşük kalıyor; kodun her yerinde
.Resultya da.Wait()çağrıları var. - Tek bir sayfa onlarca sorgu gönderiyor ya da tek bir EF sorgusu ekranda görünenden çok daha fazla satır döndürüyor.
- Arka plan işleri web isteklerinin içinde
Task.Runile çalışıyor ve süreç yeniden başladığında kayboluyor. - Her proje diğer bütün projelere referans veriyor; faturalamadaki bir değişiklik raporlamanın derlemesini bozuyor.
- Loglar var ama trace yok; yavaş bir isteği API’den veritabanına kadar kimse izleyemiyor.
.NET sistemleri neden tıkanır, yeniden yazım neden nadiren işe yarar
Bir .NET sistemi nadiren dil yüzünden yavaşlar. Asıl neden, daha küçük bir yükte zararsız olan alışkanlıklardır: async çağrıları bloklamak, döngü içinde lazy loading, her özelliğin paylaştığı tek bir DbContext, web isteklerine gizlenmiş işler. Bu kodu değiştirmeden yeni bir runtime’a taşımak sorunları da beraberinde taşır.
Akla ilk gelen çözüm, en yeni sürümde baştan yazmaktır. Bu, eski sistem değişmeye devam ederken özellik geliştirmeyi aylarca dondurur. Biz kademeli yolu seçeriz: eski uygulamanın önüne YARP gibi bir reverse proxy konur, rotalar modern .NET’e birer birer taşınır ve iki taraf birlikte çalışırken kimlik doğrulama ile oturum System.Web adapters üzerinden paylaşılır. Herhangi bir rota, tek bir yönlendirme değişikliğiyle eski koda geri döner.
Bu hizmet .NET’in içindeki mühendisliği kapsar. Soru daha genişse, örneğin karma bir sistemde önce hangi parçaların modernize edileceğiyse, doğru çerçeve Sistem Modernizasyonu programıdır.
Kapsama girenler ve girmeyenler
Dahildir
- .NET Framework’ten güncel uzun süreli destek (LTS) sürümüne yükseltme yolu
- Geçiş boyunca ortak kimlik doğrulamayla, YARP üzerinden kademeli yönlendirme
- WCF, Web Forms, .NET Remoting ve yalnızca Framework’te bulunan diğer API’ler için değiştirme planı
- EF ve EF Core sorgu incelemesi: N+1 desenleri, change tracking, split query’ler, indeksler
- Bloklayan çağrıların kaldırıldığı ve thread pool davranışının yük altında ölçüldüğü async incelemesi
- Arka plan işlerinin retry ve idempotency ile hosted service’lere ya da bir kuyruğa taşınması
- Derlemede denetlenen modül sınırları, Linux container imajları, OpenTelemetry
Dahil değildir
- Sistemin başka bir dile taşınması
- WinForms ya da WPF ile yazılmış masaüstü istemcilerin yükseltilmesi
- Mevcut ekranların görsel olarak yeniden tasarlanması
- Devirden sonra sistemin üretimde işletilmesi
İş nasıl ilerler
- Hafta 1 ila 2Sistemi haritalayın. Kod depolarına, pipeline’lara ve panolara salt okunur erişimle kullanılan her projeyi, hedef framework’ü ve yalnızca Framework’e özgü API’yi listeleriz. Kritik yollar gerçek yük altında ölçülür; böylece yükseltme sırası riske göre belirlenir.
- Hafta 2 ila 4Proxy’yi yerleştirin. Eski uygulamanın önüne bir YARP proxy, yanına da modern bir .NET host konur. Başlangıçta her istek doğrudan geçer ve OpenTelemetry trace’leri iki tarafı da kapsar.
- Hafta 4 ila 12Rota rota taşıyın. Rotalar, servisler ve işler küçük gruplar halinde taşınır; her biri bir anahtarın arkasındadır ve trafik kaydırılmadan önce eski davranışla karşılaştırılır. Sorgu ve async düzeltmeleri aynı pull request’lerde, öncesi ve sonrası ölçülerek gelir. Her aşama çalışan bir sistemle biter.
- Süreç boyuncaErişimi dar tutun. Erişim varsayılan olarak salt okunurdur; değişiklikleri yayına almak için gereken yazma yetkisi aşama bitince kaldırılır.
Elinize ne geçiyor
Tüm çıktılar sizindir: kod, raporlar, diyagramlar ve kaynak dosyaları, hepsi kendi depolarınızda.
Hangi durumda doğru hizmet değil
- Bir iki yıl içinde kapatılacak sistemler. Onları hâlâ Windows’un bir bileşeni olarak desteklenen .NET Framework 4.8 üzerinde tutmak, taşımaktan daha az maliyetlidir.
- Başka bir teknolojiyle baştan yazıma çoktan karar vermiş ekipler. Biz .NET kodunun yerine başka bir şey koymayız; onu taşır ve iyileştiririz.
- .NET’e özgü olmayan yavaşlıklar; örneğin yetersiz boyutlandırılmış bir veritabanı. Performans ve Ölçeklenebilirlik tüm katmanlara birlikte bakar.
Sık sorulanlar
Hangi .NET sürümünü hedeflemeliyiz?
Genellikle güncel LTS sürümünü. İki yılda bir yeni bir LTS sürümü çıkar ve üç yıl desteklenir; bu yüzden derleme ve testler, bir sonraki yükseltmeyi rutin bir işe dönüştürecek şekilde kurulur.
WCF servislerimize ne olacak?
Onları kimin çağırdığına bağlı. İç servisler genellikle gRPC’ye ya da sade HTTP API’lerine taşınır. Dış çağıranları değişemeyen servisler, WCF’in sunucu tarafının modern .NET’e açık kaynak uyarlaması olan CoreWCF üzerinde çalışabilir.
Yükseltme sırasında özellik geliştirmeye devam edebilir miyiz?
Evet. Eski uygulama, henüz taşınmamış her rotaya hizmet vermeyi sürdürür; yeni özellikler doğrudan yeni tarafta geliştirilebilir. Taşınan bir rota sorun çıkarırsa proxy onu geri gönderir.
Ekibimizin ne kadar zamanını alır?
Mühendisleriniz her değişikliği gözden geçirip birleştirir ve ilk rotalarda bizimle birlikte çalışır; böylece desen onların olur. Daha uzun programlarda bir gömülü mimar ekiple haftada 2 ila 3 gün çalışır.
Bir aşama bittiğinde ne olur?
Kod, karar kayıtları ve işletim kılavuzu sizde kalır; yazma yetkisi kaldırılır. Ekibiniz kalan rotaları aynı desenle kendisi taşıyabilir ya da bir sonraki aşamayı bizimle planlayabilir.
Önce kısa bir teknik sohbetle başlayalım
Otuz dakika. .NET sisteminizi anlatırsınız, işi yürütecek mimar nereden başlayacağımızı söyler.
