İçeriğe Atla
Mustafa Erbay
Teknoloji · 12 dk okuma · görüntülenme Read in English
100%

Sunucusuz Uygulamalarda Cold Start: Gizli Bir Performans Tuzağı

Sunucusuz mimarilerde karşılaşılan Cold Start sorununu derinlemesine inceleyin. Nedenlerini, etkilerini ve bu performans tuzağından kaçınma stratejilerini…

Sunucusuz Uygulamalarda Cold Start: Gizli Bir Performans Tuzağı — kapak görseli

Sunucusuz Uygulamalarda Cold Start: Gizli Bir Performans Tuzağı

Sunucusuz (serverless) mimariler, geliştiricilere altyapı yönetimi yükünü ortadan kaldırarak hızlı bir şekilde uygulama geliştirme ve ölçeklendirme özgürlüğü sunar. AWS Lambda, Azure Functions ve Google Cloud Functions gibi hizmetler, bu paradigma sayesinde modern uygulamaların temel taşları haline gelmiştir. Ancak, bu kolaylık beraberinde “Cold Start” olarak bilinen, çoğu zaman göz ardı edilen bir performans tuzağını da getirir.

Cold Start, sunucusuz fonksiyonların ilk çağrıldığında veya uzun bir süre sonra tekrar çağrıldığında ortaya çıkan ek gecikmedir. Bu durum, özellikle düşük gecikme süresi (low latency) gerektiren interaktif uygulamalar veya API’lar için kullanıcı deneyimini olumsuz etkileyebilir. Bu yazıda, Cold Start’ın ne olduğunu, neden ortaya çıktığını, performans üzerindeki etkilerini ve bu gizli tuzağın üstesinden gelmek için uygulanabilecek stratejileri detaylıca inceleyeceğiz.

Cold Start Nedir ve Neden Önemlidir?

Cold Start, sunucusuz bir fonksiyonun uzun bir süre boyunca kullanılmadığında veya ilk kez çağrıldığında, bulut sağlayıcısının fonksiyonu çalıştırmak için gerekli tüm kaynakları (sanal makine, konteyner, çalışma zamanı ortamı) sıfırdan hazırlaması gereken durumdur. Bu hazırlık süreci, fonksiyonun gerçek iş mantığını yürütmeye başlamadan önce ek bir gecikmeye neden olur. Bu gecikme, milisaniyelerden birkaç saniyeye kadar değişebilir ve uygulamanın genel yanıt süresini önemli ölçüde artırır.

Bu gecikme, özellikle web uygulamaları, API ağ geçitleri veya gerçek zamanlı veri işleme gibi kullanıcı etkileşimi gerektiren senaryolarda kritik öneme sahiptir. Kullanıcılar, bir isteğe anında yanıt beklerken, Cold Start’ın neden olduğu gecikmeler sabırsızlığa ve hatta uygulamanın terk edilmesine yol açabilir. Bu nedenle, sunucusuz uygulamaların performansını optimize etmek ve istikrarlı bir kullanıcı deneyimi sunmak için Cold Start sorununu anlamak ve yönetmek esastır.

Cold Start Sürecinin Derinlikleri

Sunucusuz bir fonksiyonun Cold Start yaşam döngüsü, birden fazla aşamayı içerir ve her aşama, toplam gecikmeye katkıda bulunur. Bu aşamaları anlamak, optimizasyon stratejileri geliştirmek için kritik öneme sahiptir.

Altyapı Hazırlığı ve Çalışma Zamanı Ortamı

Bir sunucusuz fonksiyon çağrıldığında ve mevcut aktif bir instance bulunmadığında, bulut sağlayıcısı öncelikle bir yürütme ortamı (execution environment) tahsis etmelidir. Bu genellikle, fonksiyon kodunuzu barındıracak hafif bir sanal makine veya konteynerin başlatılmasını içerir. Bu aşama, işletim sisteminin yüklenmesi, ağ yapılandırması ve güvenlik politikalarının uygulanması gibi temel altyapı hazırlıklarını kapsar.

Bu altyapı hazırlandıktan sonra, fonksiyonunuzun yazıldığı dile uygun çalışma zamanı (runtime) ortamı başlatılır. Örneğin, bir Python fonksiyonu için Python yorumlayıcısı, bir Node.js fonksiyonu için Node.js çalışma zamanı veya bir Java fonksiyonu için JVM (Java Virtual Machine) başlatılır. Bu adım, dilin kendisinin yüklenmesi ve başlatılmasıyla ilgili ek bir zaman dilimi gerektirir.

Uygulama Kodu Yükleme ve Başlatma

Çalışma zamanı ortamı hazır olduğunda, bulut sağlayıcısı fonksiyonunuzun kodunu ilgili ortama indirir ve yükler. Bu, dağıtım paketinizin (deployment package) depolama alanından (örneğin, AWS S3) alınıp yürütme ortamına aktarılmasını içerir. Dağıtım paketinizin boyutu, bu indirme süresini doğrudan etkileyen önemli bir faktördür.

Kod yüklendikten sonra, fonksiyonunuzun başlangıç (initialization) kodu çalıştırılır. Bu kod, genellikle veritabanı bağlantıları kurma, bağımlılıkları yükleme, yapılandırma dosyalarını okuma veya diğer harici hizmetlerle bağlantı kurma gibi işlemleri içerir. Bu kısım, uygulamanızın kendi içindeki optimizasyon potansiyelini barındırır ve Cold Start süresini azaltmada büyük rol oynar.

Dil ve Çerçeve Bağımlılıkları

Cold Start süresi, kullanılan programlama diline ve çerçeveye göre büyük farklılıklar gösterebilir. Örneğin, Java ve .NET gibi diller genellikle daha büyük çalışma zamanı (runtime) ve daha karmaşık JVM/CLR başlatma süreçleri nedeniyle daha uzun Cold Start sürelerine sahiptir. Bu diller, genellikle daha fazla bellek ve CPU gerektiren daha ağır altyapılar üzerinde çalışır.

Python ve Node.js gibi yorumlanmış diller ise genellikle daha hızlı başlatma süreleri sunar. Ancak, bu dillerde de büyük bağımlılık ağaçları veya karmaşık başlangıç mantığı, Cold Start sürelerini uzatabilir. Özellikle ORM’ler, büyük kütüphaneler veya çok sayıda modül içeren projeler, ilk yükleme sırasında önemli gecikmeler yaşayabilir.

Cold Start’ın Performans ve Kullanıcı Deneyimine Etkileri

Cold Start’ın etkisi, yalnızca teknik bir gecikme olmaktan öte, doğrudan son kullanıcı deneyimine ve iş süreçlerine yansır. Bu gecikmeler, bir uygulamanın başarısı veya başarısızlığı arasında ince bir çizgi oluşturabilir.

Doğrudan Yanıt Süresi Artışı

Cold Start, sunucusuz bir fonksiyonun ilk kez veya uzun bir aradan sonra çağrıldığında ek bir bekleme süresi eklemesi anlamına gelir. Bu ek süre, API yanıt sürelerini veya web uygulamalarının yüklenme sürelerini doğrudan artırır. Örneğin, bir kullanıcının bir butona tıkladığında veya bir sayfayı ziyaret ettiğinde 500ms yerine 2000ms beklemesi, algılanan performansı önemli ölçüde düşürür.

Bu durum, özellikle kullanıcıların anlık geri bildirim veya hızlı veri alımı beklediği interaktif uygulamalarda kabul edilemez olabilir. Yüksek Cold Start oranlarına sahip sistemler, trafik yoğunluğunun tahmin edilemez olduğu durumlarda sürekli performans dalgalanmaları yaşayabilir ve bu da genel sistem güvenilirliğini zedeler.

Kullanıcı Memnuniyetsizliği ve İş Kaybı

Uzun yanıt süreleri, kullanıcıların bir uygulamayı kullanmaktan vazgeçmelerine neden olan en büyük faktörlerden biridir. Bir e-ticaret sitesinde ürün sayfalarının yavaş yüklenmesi, kullanıcının siteyi terk etmesine yol açabilir. Benzer şekilde, bir mobil uygulamanın API çağrılarının gecikmeli yanıt vermesi, kullanıcı memnuniyetsizliğini artırır ve uygulamanın silinmesine kadar gidebilir.

Araştırmalar, web sitesi yükleme süresindeki her saniyelik gecikmenin dönüşüm oranlarında (conversion rates) önemli düşüşlere neden olduğunu göstermektedir. Dolayısıyla, Cold Start’ın etkilerini azaltmak, sadece teknik bir optimizasyon değil, aynı zamanda iş hedeflerine ulaşmak için de kritik bir adımdır. İş sürekliliği ve marka itibarı, Cold Start’ın neden olduğu olumsuz deneyimlerden doğrudan etkilenebilir.

Cold Start’ı Azaltma ve Önleme Stratejileri

Cold Start, sunucusuz mimarinin doğasında olan bir durum olsa da, bu gecikmeyi önemli ölçüde azaltmak ve yönetmek için çeşitli stratejiler mevcuttur. Bu stratejiler, hem kod düzeyinde optimizasyonları hem de bulut sağlayıcısının sunduğu özellikleri kullanmayı içerir.

Fonksiyon Belleği Optimizasyonu

Çoğu bulut sağlayıcısında (örneğin AWS Lambda), bir fonksiyona ayrılan bellek miktarı, aynı zamanda o fonksiyona tahsis edilen CPU gücünü de dolaylı olarak etkiler. Daha fazla bellek tahsis etmek, genellikle daha fazla CPU kaynağı anlamına gelir ve bu da fonksiyonun başlatma süresini ve iş mantığının yürütülme süresini kısaltabilir. Daha hızlı CPU, özellikle uygulama kodunun ve bağımlılıkların yüklenmesi gibi yoğun işlemlerde fark yaratır.

Ancak, bellek miktarını gereğinden fazla artırmak maliyetleri yükseltir ve her zaman orantılı bir performans artışı sağlamaz. Bu nedenle, fonksiyonunuz için en uygun bellek miktarını bulmak için performans testleri yapmak önemlidir. Optimal nokta, Cold Start süresini kabul edilebilir seviyelere çekerken, maliyeti de makul tutan dengeyi bulmaktır.

Keep-Alive (Pre-warming) Mekanizmaları

Keep-alive veya pre-warming, fonksiyonların aktif kalmasını sağlamak için düzenli aralıklarla “sahte” çağrılar yapma yöntemidir. Bu, bulut sağlayıcısının fonksiyon instance’larını “sıcak” tutmasını sağlar ve bir sonraki gerçek çağrı için Cold Start olasılığını azaltır. Bu yöntem, genellikle Cron işleri veya zamanlanmış olaylar (örneğin, AWS CloudWatch Events) kullanılarak uygulanır.

Bu strateji, özellikle belirli zaman aralıklarında yoğun trafik beklenen ancak sürekli aktif olmayan fonksiyonlar için etkilidir. Örneğin, mesai saatlerinde yoğun kullanılan ancak geceleri pasif kalan bir API fonksiyonu, belli aralıklarla tetiklenerek gün içinde Cold Start yaşaması engellenebilir. Ancak, bu ek çağrılar maliyete neden olur ve dikkatli bir şekilde yönetilmelidir.

Minimum Eşzamanlılık (Provisioned Concurrency)

Provisioned Concurrency (Önceden Tahsis Edilmiş Eşzamanlılık), bulut sağlayıcılarının (örneğin AWS Lambda) sunduğu bir özelliktir. Bu özellik sayesinde, belirli sayıda fonksiyon instance’ının her zaman çalışır durumda ve istekleri almaya hazır olmasını sağlayabilirsiniz. Bu instance’lar, uygulama kodunuzun ve çalışma zamanının tamamen yüklenmiş ve başlatılmış olduğu “sıcak” durumlardır.

Provisioned Concurrency, Cold Start’ı tamamen ortadan kaldırır çünkü istekler her zaman hazır bir instance tarafından karşılanır. Bu, özellikle düşük gecikme süresi gerektiren kritik uygulamalar için idealdir. Ancak, bu hizmetin maliyeti, sadece gerçekten kullanılan kaynaklar için ödeme yapılan standart sunucusuz modelden daha yüksek olabilir, çünkü siz bu instance’lar kullanılmasa bile kaynak ayırdığınız için ödeme yaparsınız.

Kodu ve Bağımlılıkları Optimize Etme

Fonksiyonunuzun dağıtım paketi boyutu, Cold Start süresini doğrudan etkileyen önemli bir faktördür. Daha küçük bir paket, daha hızlı indirilir ve yüklenir. Bu nedenle, gereksiz bağımlılıkları ve dosyaları dağıtım paketinizden çıkarmak kritik öneme sahiptir.

  • Tree-shaking: Sadece kullanılan kod parçalarını paketlemeyi sağlar.
  • Minimal Bağımlılıklar: Yalnızca gerçekten gerekli olan kütüphaneleri kullanın ve büyük monolitik kütüphanelerden kaçının.
  • Lazy Loading: Başlangıçta tüm bağımlılıkları yüklemek yerine, yalnızca ihtiyaç duyulduğunda yükleyin.
  • Derleme Adımları: TypeScript gibi diller için JavaScript’e derleme yaparken çıktı boyutunu optimize edin.

Küçük ve optimize edilmiş bir dağıtım paketi, hem indirme süresini kısaltır hem de çalışma zamanının bağımlılıkları yükleme süresini azaltır.

Runtime Seçimi

Yukarıda bahsedildiği gibi, farklı programlama dilleri ve çalışma zamanları Cold Start süreleri açısından farklı performans gösterir. Go ve Rust gibi derlenmiş diller, genellikle en hızlı Cold Start sürelerine sahiptir çünkü minimal runtime gereksinimleri vardır ve doğrudan makine koduna derlenirler. Python ve Node.js ise yorumlanmış diller olup, genellikle daha hızlı Cold Start sunar ancak büyük bağımlılıklar bu avantajı azaltabilir. Java ve .NET, genellikle daha uzun Cold Start sürelerine sahiptir.

Projenizin gereksinimlerine ve geliştirme ekibinin uzmanlığına bağlı olarak, Cold Start performansını iyileştirmek için daha hızlı bir runtime’a geçiş yapmak bir seçenek olabilir. Ancak, bu genellikle önemli bir yeniden yazma (refactoring) çabası gerektirebilir.

Katmanlar ve Paylaşılan Kaynaklar

AWS Lambda Layers gibi özellikler, fonksiyonlar arasında paylaşılan bağımlılıkları ve özel çalışma zamanlarını merkezi bir yerde depolamanıza olanak tanır. Bu, her fonksiyonun dağıtım paketinin boyutunu küçültür ve aynı bağımlılık setini kullanan birden fazla fonksiyon için Cold Start sürelerini potansiyel olarak azaltabilir.

Katmanlar, özellikle büyük ve yaygın kütüphanelerin (örneğin, bir veritabanı sürücüsü veya bir SDK) birden fazla fonksiyonda kullanıldığı durumlarda faydalıdır. Bağımlılıklar katmanda olduğu için, her fonksiyonun kendi dağıtım paketine dahil etmesi gerekmez, bu da kod indirme ve yükleme süresini kısaltır.

Yeni Nesil Sunucusuz Teknolojiler

Bulut sağlayıcıları, Cold Start sorununu çözmek için sürekli olarak yeni teknolojiler geliştirmektedir. Örneğin, AWS Lambda’nın SnapStart özelliği, Java fonksiyonları için Cold Start sürelerini önemli ölçüde azaltmayı hedefler. Bu özellik, fonksiyonun başlatma anında bir anlık görüntü (snapshot) alarak, sonraki Cold Start durumlarında bu anlık görüntüyü hızlıca geri yükler.

Benzer şekilde, Google Cloud Functions ve Azure Functions da kendi iç optimizasyonları ve “always on” seçenekleri ile Cold Start sürelerini minimize etmeye çalışmaktadır. Bu yeni nesil teknolojileri takip etmek ve projeniz için uygun olanları değerlendirmek, Cold Start yönetimi açısından önemli avantajlar sağlayabilir.

Uygulamalı Örnekler: Kod Optimizasyonu

Kod düzeyinde yapılan küçük değişiklikler bile Cold Start süreleri üzerinde büyük etki yaratabilir. İşte Python ve Node.js için bazı pratik optimizasyon örnekleri.

Python Örneği

Python’da Cold Start’ı azaltmanın anahtarlarından biri, modül import’larını ve başlangıçta yapılan pahalı işlemleri minimize etmektir.

# Kötü Uygulama: Tüm bağımlılıklar başlangıçta yüklenir
# import boto3
# import requests
# import pandas

# def lambda_handler(event, context):
#     # Fonksiyon mantığı
#     s3 = boto3.client('s3')
#     response = requests.get('https://api.example.com/data')
#     df = pandas.DataFrame(...)
#     return {
#         'statusCode': 200,
#         'body': json.dumps('Hello from Lambda!')
#     }

# İyi Uygulama: Lazy Loading ve global client'lar
import json

# Global scope'ta client'ları başlatmak, Cold Start'ta bir kez gerçekleşir
# Ancak, tüm client'ları başlangıçta yüklemek yerine, gerçekten ihtiyaç duyulanları yükle
_s3_client = None
_requests_session = None

def get_s3_client():
    global _s3_client
    if _s3_client is None:
        import boto3
        _s3_client = boto3.client('s3')
    return _s3_client

def get_requests_session():
    global _requests_session
    if _requests_session is None:
        import requests
        _requests_session = requests.Session()
    return _requests_session

def lambda_handler(event, context):
    # Bu blok, sadece istek geldiğinde çalışır
    # Eğer bu fonksiyon her zaman S3 veya requests kullanmıyorsa,
    # bu lazy loading yaklaşımı Cold Start'ı iyileştirir.
    s3 = get_s3_client()
    # s3.get_object(...)

    session = get_requests_session()
    # response = session.get('https://api.example.com/data')

    return {
        'statusCode': 200,
        'body': json.dumps('Hello from Optimized Lambda!')
    }

Bu örnekte, boto3 ve requests modülleri, yalnızca get_s3_client() veya get_requests_session() fonksiyonları çağrıldığında yüklenir. Eğer bir Cold Start sırasında fonksiyon bu client’ları kullanmıyorsa, import maliyetinden kaçınılmış olur. Ayrıca, client’lar global kapsamda bir kez başlatılarak, aynı Cold Start döngüsündeki sonraki çağrılar için yeniden başlatma maliyetini ortadan kaldırır.

Node.js Örneği

Node.js’te benzer bir yaklaşımla, modül yüklemelerini ve başlangıç işlemlerini optimize edebiliriz. Webpack veya Rollup gibi bundler’lar, dağıtım paketini küçültmek ve kullanılmayan kodu (dead code) elemek için çok faydalıdır.

// Kötü Uygulama: Tüm bağımlılıklar başlangıçta yüklenir
// const AWS = require('aws-sdk');
// const axios = require('axios');
// const moment = require('moment');

// exports.handler = async (event) => {
//     const s3 = new AWS.S3();
//     const response = await axios.get('https://api.example.com/data');
//     const now = moment().format();
//     return {
//         statusCode: 200,
//         body: JSON.stringify('Hello from Lambda!'),
//     };
// };

// İyi Uygulama: Lazy Loading ve global client'lar
let s3Client = null;
let axiosClient = null;

exports.handler = async (event) => {
    // S3 client'ı sadece ihtiyaç duyulduğunda başlatılır
    if (!s3Client) {
        const { S3 } = require('@aws-sdk/client-s3'); // V3 SDK'de sadece gerekli client'ı import etme
        s3Client = new S3();
    }
    // await s3Client.getObject({ Bucket: 'my-bucket', Key: 'my-key' });

    // Axios client'ı da benzer şekilde
    if (!axiosClient) {
        axiosClient = require('axios');
    }
    // const response = await axiosClient.get('https://api.example.com/data');

    // Moment yerine yerleşik Date objesi veya hafif bir kütüphane kullanma
    const now = new Date().toISOString();

    return {
        statusCode: 200,
        body: JSON.stringify(`Hello from Optimized Lambda! Current time: ${now}`),
    };
};

Bu Node.js örneğinde, AWS SDK’nin V3 versiyonundan sadece S3 client’ını import ederek paket boyutunu küçültüyoruz. Ayrıca, axios ve S3 client’ları, yalnızca exports.handler fonksiyonu içinde ihtiyaç duyulduğunda require edilerek lazy loading sağlanır. Global değişkenler, bir Cold Start döngüsünde birden fazla istek geldiğinde client’ların yeniden başlatılmasını engeller.

Cold Start’ı İzleme ve Analiz Etme

Cold Start’ın etkilerini anlamak ve uygulanan optimizasyon stratejilerinin etkinliğini değerlendirmek için izleme ve analiz araçlarını kullanmak esastır. Bulut sağlayıcılarının sunduğu metriklere ek olarak, özel izleme çözümleri de faydalı olabilir.

İzleme Araçları ve Metrikler

Bulut sağlayıcıları, sunucusuz fonksiyonlarınızın performansını izlemek için yerleşik araçlar sunar:

  • AWS CloudWatch: Lambda fonksiyonları için Duration, Invocations, Errors gibi standart metriklerin yanı sıra, Cold Start’ı gösteren Init Duration (başlatma süresi) metriğini de sağlar.
  • Azure Monitor: Azure Functions için benzer şekilde Function Execution Units, Function Execution Count gibi metrikler sunar ve Cold Start sürelerini izlemek için günlük kayıtlarını (logs) kullanabilirsiniz.
  • Google Cloud Monitoring: Cloud Functions için Execution time ve Memory utilization gibi metrikler sunar. Cold Start süreleri genellikle ilk çağrıların daha uzun sürmesi olarak log’larda gözlemlenebilir.

Bu metrikler, fonksiyonlarınızın ne sıklıkta Cold Start yaşadığını ve bu Cold Start’ların ne kadar sürdüğünü anlamanıza yardımcı olur. Ortalama ve maksimum Init Duration değerleri, Cold Start sorununun ciddiyetini gösterir.

Log Analizi ve Korelasyon

Fonksiyonlarınızın log kayıtları, Cold Start’ın nedenlerini daha derinlemesine anlamak için değerli bilgiler içerir. Örneğin, bir Cold Start sırasında hangi bağımlılıkların yüklendiğini, veritabanı bağlantılarının ne kadar sürdüğünü veya hangi başlangıç kodunun gecikmeye neden olduğunu log’larda görebilirsiniz.

Logları izleme araçlarıyla (örneğin CloudWatch Logs Insights, Azure Log Analytics, Google Cloud Logging) analiz ederek, belirli bir Cold Start’ın hangi aşamasının en çok zaman aldığını tespit edebilirsiniz. Bu korelasyon, optimizasyon çabalarınızı en etkili alanlara yönlendirmenize yardımcı olur. Ayrıca, kullanıcıların Cold Start yaşadığı durumları izleyerek, kullanıcı deneyimi üzerindeki gerçek etkiyi de ölçebilirsiniz.

Sonuç

Sunucusuz mimariler, modern uygulama geliştirmenin birçok avantajını sunarken, Cold Start gibi gizli performans tuzaklarını da beraberinde getirir. Bu gecikmeler, özellikle hassas uygulamalarda kullanıcı deneyimini ve iş sonuçlarını olumsuz etkileyebilir. Ancak, bu makalede detaylarıyla incelediğimiz gibi, Cold Start kaçınılmaz bir kader değildir.

Bellek optimizasyonundan Keep-Alive mekanizmalarına, Provisioned Concurrency’den kod ve bağımlılık optimizasyonlarına kadar birçok etkili strateji mevcuttur. Doğru runtime seçimi ve yeni nesil bulut teknolojilerinden faydalanmak da Cold Start’ı minimize etmede önemli rol oynar. Unutmamak gerekir ki, her uygulamanın kendine özgü gereksinimleri vardır ve en iyi strateji, performans testleri ve sürekli izleme ile belirlenir.

Sunucusuz uygulamalarınızda Cold Start’ı anlamak ve proaktif bir şekilde yönetmek, hem daha hızlı ve daha duyarlı uygulamalar geliştirmenizi hem de son kullanıcılarınıza kesintisiz bir deneyim sunmanızı sağlayacaktır. Bu sayede, sunucusuz mimarinin sunduğu tüm avantajlardan tam olarak faydalanabilirsiniz.

Paylaş:

Bu yazı faydalı oldu mu?

Yükleniyor...

Bu yazı nasıldı?

ME

Mustafa Erbay

Sistem Mimarisi · Network Uzmanı · Altyapı, Güvenlik ve Yazılım

2006'dan bu yana sistem mimarisi, network, sunucu altyapıları, büyük yapıların kurulumu, yazılım ve sistem güvenliği ekseninde çalışıyorum. Bu blogda sahada karşılığı olan teknik deneyimlerimi paylaşıyorum.

Kişisel Notlar

Bu notlar sadece sizde saklanır. Tarayıcınızda yerel olarak tutulur.

Hazır 0 karakter

Yorumlar

Sunucu Taraflı AI Moderasyon

Yorumlar sunucuda yapay zeka ile denetlenir ve kalıcı olarak saklanır.

?
0/2000

Sunucu taraflı AI denetim

✉️ Ücretsiz · Spam yok · İstediğin an çık

Haftalık özet — AI değil, bizzat ben seçiyorum

Haftada bir mail: o haftanın en önemli yazısı, perde arkası notları, ve "bu hafta gerçekten kullandığım araç" bölümü. Az gürültü, çok sinyal.

  • 📌
    Haftanın en iyisi Sadece okumaya değer tek yazı
  • 🔧
    Alet çantası Bu hafta kullandığım araçlar
  • 🧠
    Perde arkası Blog'a girmeyen notlar

Spam yapmıyoruz. İstediğiniz zaman ayrılabilirsiniz. · Sadece Umami (self-hosted, Google yok) ile takip.

Okuma İstatistikleriniz

0

Yazı Okundu

0dk

Okuma Süresi

0

Gün Serisi

-

Favori Kategori

İlgili Yazılar