Deploy İşlemi Sorunları
Smart Tech Devs’deki B2B SaaS platformunun ilk aşamalarında bir veritabanı şeması değişikliğini dağıtmak oldukça basit: uygulamayı bakım moduna alıyorsunuz, php artisan migrate komutunu çalıştırıyorsunuz, yeni kodu dağıtıyorsunuz ve uygulamayı çevrimiçi hale getiriyorsunuz. Ancak, binlerce aktif kurumsal kullanıcıya ulaştığınızda, 2 dakikalık bir bakım penceresi kabul edilemez hale gelir. Kesinti olmadan dağıtım yapmalısınız.
Mimari tuzak, uygulama canlıyken bir veritabanı kolonunu yeniden adlandırmayı veya silmeyi denediğinizde ortaya çıkar. Eğer first_name kolonunu full_name olarak değiştirirseniz, veritabanında yeni kolon adı ile eski PHP kodu arasında fiziksel bir kesinti süresi yaşanır. Bu süre zarfında, kaydolmaya çalışan herhangi bir kullanıcı, artık mevcut olmayan bir kolona veri eklemeye çalışan eski kod nedeniyle fatal 500 SQL hatası alır. Güvenle dağıtım yapmak için veritabanı değişikliklerini kod değişikliklerinden ayırmalısınız; bunu Expand and Contract Pattern (Genişlet ve Sıkıştır Deseni) ile gerçekleştiriyoruz.
Çözüm: Genişlet ve Sıkıştır Deseni
Bir kolonu tek bir yıkıcı adımda değiştirmek yerine, göç işlemini birkaç bağımsız ve güvenli dağıtım evresine yayıyoruz.
Aşama 1: Genişlet (Silmeden Ekle)
Öncelikle yeni full_name kolonunu ekleyen bir göç (migration) oluşturuyoruz, ama eski first_name kolonunu silmiyor ya da yeniden adlandırmıyoruz. Ayrıca, Laravel Model’imizi her iki kolona da veri yazacak şekilde güncelliyoruz.
// 1. Göç (Migration)
Schema::table('users', function (Blueprint $table) {
$table->string('full_name')->nullable(); // Yeni kolonu güvenle ekleyin
});
// 2. Model Güncellemesi
class User extends Model
{
// Veri senkronizasyonunu sağlamak için geçiş süresinde her iki kolona da yazın
protected static function booted()
{
static::saving(function ($user) {
if ($user->isDirty('first_name') || $user->isDirty('last_name')) {
$user->full_name = $user->first_name . ' ' . $user->last_name;
}
});
}
}
Bunu dağıtın. Uygulama tamamen çevrimiçi kalır. Yeni kullanıcılar artık her iki kolonda da veriye sahip olur.
Aşama 2: Taşı (Eski Veriyi Geri Yükle)
Uygulamamız her iki kolona da veri yazmaya başladığına göre, eski tarihli kayıtları geri yüklememiz gerekiyor. Bir arka plan Queue Job’u gönderiyor ya da Artisan komutunu çalıştırarak eski satırları sessizce güncellemek için tabloyu kilitlemeden çalışıyoruz.
// Arka planda kuyruklar veya Laravel Komutları aracılığıyla çalıştırın
User::whereNull('full_name')->chunkById(500, function ($users) {
foreach ($users as $user) {
$user->update(['full_name' => $user->first_name . ' ' . $user->last_name]);
}
});
Aşama 3: Sıkıştır (Temizlik)
Günler veya haftalar sonra, full_name mantığının tüm kontrol panelinizde sorunsuz çalıştığını doğruladığınızda, son bir göç işlemi yazarsınız ve eski kolonları güvenle silersiniz. Ayrıca, Eloquent modelinizden tekrar eden yazım mantığını da kaldırırsınız.
// Son Temizlik Göçü
Schema::table('users', function (Blueprint $table) {
$table->dropColumn(['first_name', 'last_name']);
});
Mühendislik ROI’si
Yıkıcı şema değişikliklerini Genişlet, Taşı ve Sıkıştır iş akışına bölerek, dağıtım kesinti süresini tamamen ortadan kaldırırsınız. Veritabanınız ve uygulama kodunuz hiçbir zaman çelişkili bir durumda olmaz, bu da büyük mimari yeniden yapılandırmaları, trafik zirve saatlerinde tek bir kullanıcı isteği düşürmeden eksiksiz bir şekilde gerçekleştirmenizi sağlar.
Kaynak: Orijinal Makale


