Kısım II · İnşaat · Bölüm 43

Yayına Alma: Sunucu, Konteyner, Bulut

Koddan çalışan hizmete geçiş (Deployment, containers, cloud)

Neden burada · Neye dayanıyor

Neden burada: Bölüm 42: Test ve Kalite değişikliği denetledi. Şimdi o değişikliğin başka bilgisayarda, doğru veri ve izinlerle sürekli hizmet vermesini sağlamalıyız. Kodun çalışmasıyla bir hizmetin işletilmesi arasındaki farkı kuruyoruz.

Neye dayanıyor: Bölüm 18: İşletim Sistemleri Ailesi ve Terminal içindeki kabuk ve ortam değişkenleri; Bölüm 19: Ağ içindeki adres ve port; Bölüm 34: Arka Uç ve API içindeki sunucu süreci; Bölüm 42: Test ve Kalite içindeki otomatik denetimler. DNS/HTTPS ayrıntısında Bölüm 20: İnternet ve Web: HTML'e Varış, veri dönüşünde Bölüm 39: Postgres Pratikte başvuru noktalarımız.

  1. Kat 10Bizim uygulamamızUygulamanın sürümü ve işletimi. Kat 7'deki süreçler ile Kat 8'deki ağ adlandırması, Kat 10'daki hizmetin herkesçe erişilmesini sağlar. Kat planına dön.
  2. Kat 9Web ve tarayıcıWeb istemcisi sunucunun sözleşmesini kullanır.
  3. Kat 8Ağ ve internetHTTP istekleri, DNS ve TLS; parçalar ayrı makinelerdeyken aradaki yol.
  4. Kat 7İşletim sistemiSüreçler, dosyalar ve izinler; altta Kat 3'ün işlemcisi ve belleği.

Bölüm sonunda ortamı, konteynerin paketlediği şeyi, bulutta sorumluluk paylaşımını ve yayın sonrası hata sinyallerini ayırabileceksin. Gerçek hesap kurmuyor veya yayın yapmıyoruz; yayın öncesi kararları öğreniyoruz.

43.1 Ortamlar: geliştirme, test ve üretim

Bölüm 42: Test ve Kalite sonunda kodun davranışını sınadık. Fakat testin geçtiği kod, herkesin eriştiği bir hizmete kendiliğinden dönüşmez. Yayına alma (deployment), belirli bir yazılım sürümünü belirli bir çalışma ortamına yerleştirip çalışır hale getirmektir. Aynı kaynak kod farklı adres, veri ve izinlerle birden çok yerde çalışabilir. Bu yüzden “hangi kod?” sorusunun yanında “hangi ortam?” sorusunu da sormak gerekir.12

Ortam (environment), uygulamanın çalıştığı kod, yapılandırma, hizmetler ve veri bağlamıdır. Geliştirme ortamı (development) kod yazarken kullandığın düzendir. Test ortamı (test environment) otomatik denetimlerin veri ve hizmetlerini taşır. Üretim öncesi ortam (staging) ise yayın adayını üretime benzeyen koşullarda denemeye yarar. Otomatik testin kısa ömürlü veritabanı ile staging aynı şey olmak zorunda değildir.12

Üretim ortamı (production), gerçek kullanıcıların gerçek verileriyle çalışan düzendir. Testte soruyu tekrar tekrar cevaplayan kurgu hesap açabiliriz; üretimde bunu gerçek kullanıcı adına yapamayız. Ortam ayrımı yalnız adlandırma değil, yanlış işlemin etki alanını sınırlamadır. Ayrı veritabanı, ayrı hizmet erişimi ve ayrı sırlar kullanmak, bir deneme hatasının gerçek hesaplara taşınmasını önlemeye yardım eder.23

Aynı kalmasını istediğimizAyrı olmasını istediğimizNeden?
İş kuralının kaynak koduVeritabanı adresi ve veriAynı davranışı gerçek kullanıcıya dokunmadan sınamak
Bağımlılıkların belirlenmiş sürümleriErişim anahtarlarıTest erişiminin üretimi açmaması
Şema göç dosyalarıGöçün hedefi ve yürütülme zamanıDeğişikliği önce güvenli yerde denemek
Derlenmiş yayın adayıOrtam yapılandırmasıDenediğimiz çıktıyı farklı yapılandırmayla çalıştırabilmek

Tablo, Twelve-Factor ilkelerinin öğretim örneğidir. Benzerlik, gerçek kişisel veriyi test ortamına kopyalamak değildir.13

“Bende çalışıyordu” sorusunu şöyle aç: aynı sürüm mü, doğru ortam değişkenleri mi, gerekli şema göçü yapılmış mı? Üretim dosyalarını elle değiştirmek yerine çözümü izlenebilir ve yeniden üretilebilir yayın sürecine taşı.110

43.2 Sunucu, sanal makine ve konteyner

Bölüm 34: Arka Uç ve API sunucuyu istek bekleyen süreç olarak tanımladı. Bu bölümde “sunucu kiralamak” dediğimizde ise o süreci çalıştıracak makine kaynağını kastediyoruz. Kavramları ayıralım: Go sunucu süreci, işletim sisteminin verdiği işlemci zamanı ve belleği kullanır; bu işletim sistemi fiziksel makinede ya da sanallaştırılmış makinede çalışabilir. Bunların üstüne uygulamanın dosyalarını ve bağımlılıklarını nasıl yerleştireceğimiz ayrı bir sorudur.45

Sanal makine (virtual machine, VM), burada kendi işletim sistemi ve çekirdeğiyle çalışan sanallaştırılmış bilgisayardır. Bölüm 21: Programlama Dilleri Haritası içindeki Java Sanal Makinesiyle aynı bağlam değildir: JVM dilin ara kodunu çalıştırıyordu; burada bir işletim sistemi barındırıyoruz. Konteyner (container) ise uygulama dosyalarıyla birlikte yalıtılmış çalışan süreç düzenidir. Aynı Linux çekirdeğinde çalışan konteynerler çekirdeği paylaşır; her biri ayrı çekirdek başlatmaz.5

Bu nedenle VM ile konteyner birbirinin rakibi olmak zorunda değildir. Bulutta bir VM kiralayıp üzerinde Go API'sini konteyner olarak çalıştırabilirsin. Konteynerin “her işletim sisteminde aynı makine kodunu doğrudan çalıştırdığı” sonucunu çıkarma; işletim sistemi ve işlemci mimarisi uyumluluğu hâlâ önemlidir.5

İmaj tarif değil, hazırlanmış pakettir

Konteyner imajı (container image), çalıştırma için gereken dosyaları, programları ve ilgili düzeni içeren paketlenmiş çıktıdır. İmajdan çalışan bir konteyner başlatılır. Aynı imajdan birden fazla konteyner oluşturulabilir. Docker bu imajları oluşturup konteynerleri çalıştırmak için kullanılan araç ekosistemidir. İmaj oluşturmakla süreci çalıştırmak ayrı aşamalardır.67

Kaynak kod + bağımlılık tanımları + Dockerfile
                     ↓ imaj oluşturma
            Sürümü belirli konteyner imajı
                     ↓ yapılandırmayla başlatma
          Çalışan konteyner → Go sunucu süreci

İlk satır girdileri gösterir. Dockerfile (Dockerfile), imajın hangi adımlarla oluşturulacağını tarif eden dosyadır; imajın kendisi değildir. Son okta üretim adresleri ve sırları gibi çalışma yapılandırması devreye girer. Özel sırları imajın içine yerleştirirsen imajı paylaşmakla sırrı da paylaşmış olabilirsin; Bölüm 41: Kimlik Doğrulama ve Güvenlik içindeki sınır burada da korunur.783

Dockerfile'da FROM başlangıç imajını, COPY dosya taşımayı, RUN oluşturma sırasında çalışacak komutu, ENTRYPOINT ise çalıştırma girişini belirtebilir. Bunlar burada üretim tarifi değil, komut adlarını okuyabilmen için açıklamadır.8

İmaj sabit, çalışan süreç geçici

Docker belgeleri imajları değişmez katmanlar olarak açıklar: yeni sürüm için yeni imaj oluşturursun. Çalışan konteynerin kendi yazılabilir katmanında değişiklik olabilir; bu, başlangıç imajını değiştirmez. İmaj kayıt defteri (container registry), imajların saklanıp başka makinelere dağıtılabildiği yerdir. Hangi çıktının yayımlandığı izlenebilir olmalıdır.7

Veritabanı dosyaları çalışan konteynerin silinen katmanına mahkûm bırakılmaz. Kalıcı birim (volume), verinin tek bir konteynerin yaşamından bağımsız tutulmasını sağlar. Konteyneri silmekle birimi silmek farklı işlemlerdir; ama birimin aynı makinede kalması onu kendiliğinden yedek yapmaz. Disk kaybı veya yanlış veri silme için Bölüm 39: Postgres Pratikte içindeki ayrı yedek ve geri yükleme planı gerekir.9

Uygulamamızda: bütün dosyalar aynı yere gitmez

Vanilla HTML/CSS/JS dosyalarının statik sunumu, Expo'nun mobil dağıtımı ve Go API'sinin çalıştırılması ayrı işlerdir. Postgres ve Redis de ayrı sorumluluk taşır; hepsini tek imaja doldurmayız. Bu, mevcut prototip hakkında tespit değil hedef yığının haritasıdır.61

43.3 Bulut: IaaS, PaaS ve sunucusuz

Bulut (cloud), işlem, depolama ve ağ gibi kaynaklara hizmet olarak eriştiğimiz düzenin genel adıdır. Elektrik, işlemci ve işletim sistemi ortadan kalkmaz; bunların bir bölümünü başka kuruluş işletir. Temel karar “bulutta mıyız?” değil, “hangi sorumluluk bizde, hangisi sağlayıcıda?” sorusudur. Aynı sağlayıcı içinde bile farklı hizmetler farklı iş bölümü yapar.4

ModelNe alırsın?Sende kalan örnek işler
Hizmet olarak altyapı (Infrastructure as a Service, IaaS)Makine, ağ ve depolama kaynaklarıİşletim sistemi ve uygulama işletiminin önemli bölümü
Hizmet olarak platform (Platform as a Service, PaaS)Uygulamanı çalıştıran yönetilen platformUygulama davranışı, yapılandırması, veri ve erişim kararları
Sunucusuz (serverless)Sunucu sağlama ve işletmenin daha fazla gizlendiği çalışma düzeniUygulama, hizmet sınırlarına uyum, veri güvenliği ve maliyet denetimi

IaaS/PaaS sınıfları ve sunucusuz sözcüğü tek bir ortak merdivenin kusursuz basamakları değildir. Sunucusuz platformlar da vardır; terimler sorumluluk paylaşımını anlatmak için kullanılır.41112

AWS, Google Cloud ve Cloudflare tek birer “sunucu türü” değil hizmet aileleridir. Google Cloud Run belgeleri, HTTP isteklerini yanıtlayan yönetilen konteyner örneklerini açıklar. Cloudflare Workers belgeleri ise V8 içinde yalıtılmış çalışma bağlamlarını anlatır. Dolayısıyla Workers'a sıradan bir Linux Go ikili dosyasını yükleyip aynı net/http sürecini VM'deki gibi başlatacağını varsayamazsın. Aynı sağlayıcının başka ürünleri veya başka hedefe derleme yolları olabilir; onların sözleşmesi ayrıca okunur.1112

Sunucusuz “sunucu yok” değil, sunucunun sağlanması ve işletilmesinin önemli bölümünü senin yapmaman demektir. Örnekler değişebildiği için kalıcı veri süreç belleğine bağlanmaz. Konteyner çalıştırmak da otomatik olarak sunucusuz olmak değildir: kendi VM'nde Docker'ı sen işletiyorsan o makinenin işletim yükü hâlâ sendedir.10115

Seçimde çalışma zamanı, veri bölgesi, yedekleme, izinler ve gözlem ihtiyaçlarına bakılır. Bölüm 41: Kimlik Doğrulama ve Güvenlik içindeki kişisel veri ve yurt dışına aktarım değerlendirmesi de sağlayıcı logosuyla çözülmez. Bir hizmeti seçmek, onun teknik sözleşmesini ve hukuki veri akışını birlikte değerlendirmektir.411

43.4 CI/CD ve GitHub Actions

Bölüm 42: Test ve Kalite sürekli entegrasyonu, ortak değişikliklerin otomatik denetimi olarak kurdu. CD kısaltması iki yakın fakat farklı anlamda kullanılır. Sürekli teslim (continuous delivery), yazılımı güvenilir biçimde yayına alınabilir tutmayı; sürekli dağıtım (continuous deployment) ise denetimlerden geçen değişiklikleri üretime otomatik göndermeyi anlatır. İlkinde üretime geçişte insan kararı bulunabilir. Her yeşil testi kendiliğinden üretim yayını saymayız.13

GitHub Actions (GitHub Actions), depodaki olaylarla tetiklenen otomatik işleri çalıştıran hizmettir. YAML dosyasında tanımlanan iş akışı (workflow), bir veya birden çok iş içerir. İşin adımları komut ya da yeniden kullanılabilir action çalıştırabilir. Çalıştırıcı (runner), bu adımları gerçekten yürüten makinedir. Dosyadaki tarif ile onu çalıştıran bilgisayar yine ayrı şeylerdir.14

Değişiklik → CI denetimleri → yayın çıktısını oluştur
          → staging'e yerleştir → temel sağlık denetimi
          → gerekli onay → aynı çıktıyı production'da çalıştır

Bu, bir hesaba gönderilmiş iş akışı değil, örnek yayın hattıdır. İkinci aşama yayın çıktısı (artifact) üretir: Go ikili dosyası, web dosyaları veya konteyner imajı gibi. Sonraki aşamalar bu belirli çıktının nerede çalıştığını değiştirir. GitHub ortam koruma kurallarıyla onay ve sır erişimi sınırlandırılabilir; kullanılabilir ayrıntılar hesabın ve deponun özelliklerine göre ayrıca denetlenir.1421

Üretim sırrı her test işine verilmez. Özellikle denetlenmemiş kodu çalıştıran adımın üretim erişimi olmamalıdır. “Testleri koşturmak” ile “üretimi değiştirmek” farklı yetkilerdir. Bir yayın adımı yalnız gereken hedefe erişmeli, çıktısında sır basmamalıdır. Bölüm 41: Kimlik Doğrulama ve Güvenlik içindeki en az yetki ilkesini burada otomatik çalışan programlara da uygularız.2

Geri dönüş yalnız eski imajı başlatmak değildir

Geri dönüş (rollback), hatalı yayından önceki çalışan sürüme dönme planıdır. Fakat Bölüm 39: Postgres Pratikte içindeki şema göçünü düşün: yeni sürüm bir sütunu silmişse eski ikili dosyayı başlatmak veriyi geri getirmez. Uygulama sürümü, yapılandırma ve veri şeması birlikte düşünülür. Bir göçü önce ekleyici ve eski sürümle uyumlu yapmak gibi yaklaşımlar geri dönüşü kolaylaştırabilir; veri silen adım ise ayrıca değerlendirilir.21

Bu yüzden yayın öncesinde “hangi sürüme döneriz, o sürüm yeni şemayı okuyabilir mi, yedeği geri yüklemek neyi kaybettirir?” soruları sorulur. Eski sürümün kimliği ve yapılandırması saklanmalıdır. Yayın sonrasında temel isteği de sınarız; sürecin açılması yeterli değildir. Burada gerçek bir deploy yapılmadı.12

43.5 Alan adı, DNS kaydı ve HTTPS sertifikası

Bölüm 20: İnternet ve Web: HTML'e Varış içindeki haritaya geri dönelim. Alan adı okunabilir addır; DNS bu adla ilgili adres kayıtlarını buldurur; HTTPS bağlantının şifreli ve hedef adla doğrulanmış kurulmasını sağlar. Bunlar aynı ayar ekranında görünebilir ama aynı iş değildir. DNS kaydı yazmak API sürecini başlatmaz, HTTPS sertifikası da veritabanının doğruluğunu garanti etmez.1516

DNS kaydı (DNS record) için üç yaygın tür yeterli: A bir adı IPv4 adresine, AAAA IPv6 adresine eşler; CNAME başka bir ada başvurur. Örneğin api.example.com için platformun verdiği hedef ada yönlendirme gerekebilir. Bu örnek bir yapı gösterir; gerçek hizmette hangi kaydın gerektiğini platformun alan adı belgesi belirler. Kayıtlardaki yaşam süresi, DNS önbelleklerinin ne kadar süre cevabı kullanabileceğini etkiler; değişiklik her istemcide aynı anda görünmeyebilir.1522

HTTPS sertifikası (TLS certificate), bağlantı kurulan ad için anahtar ve güven zinciriyle ilgili doğrulama sağlar. Let's Encrypt gibi sertifika otoriteleri alan adı denetiminin kanıtlanmasını ister; otomatik istemci DNS ya da HTTP üzerinden bir doğrulama görevini yerine getirebilir. Sertifikanın zamanında yenilenmesi de işletimin parçasıdır. Bu, kullanıcının giriş parolasından ayrı bir anahtar ve güven düzenidir.16

Arada Cloudflare gibi bir ters vekil varsa iki bağlantı ayağını ayrı düşün: tarayıcı → Cloudflare ve Cloudflare → asıl sunucu. İlki HTTPS iken ikincinin de doğru korunmuş olduğunu varsayma. Cloudflare'ın Full (strict) belgesi asıl sunucu sertifikasının doğrulanmasını açıklar. Tarayıcıda kilit simgesi görünmesi bütün iç ağ yollarının aynı güvenceye sahip olduğunu tek başına göstermez.17

43.6 Gözlem: kayıt, ölçüm ve alarm

Yayın anında testler geçti; ertesi gün kullanıcı “cevabım kayboldu” dedi. O an neye bakacağız? Gözlem (observability), sistemin dışa verdiği sinyallerden iç durumunu anlamayı mümkün kılan düzenektir. Sadece “süreç açık mı?” göstergesi değildir. Kayıtlar, ölçümler ve gerektiğinde izler farklı soruları cevaplar.18

SinyalNe söyler?Örnek soru
Kayıt (log)Belirli olay hakkında ayrıntıBu cevap isteği hangi hatayla bitti?
Ölçüm (metric)Zaman içindeki sayısal davranışHata oranı veya gecikme yükseldi mi?
İz (trace)İsteğin parçalardaki yolculuğu ve süreleriBekleme Go'da mı, veri hizmetinde mi?

Alarm, bu sinyallerden seçilen koşul oluştuğunda sorumluya haber verir.1819

Kayıtta örneğin istek kimliği, yolun şablonu, durum kodu ve işlem sonucu tutulabilir. Aynı kimlik farklı parçalardaki olayları ilişkilendirmeye yardım eder. Fakat istek gövdesinin tamamını gelişigüzel yazmak parola, belirteç veya kişisel veri sızdırabilir. Bölüm 41: Kimlik Doğrulama ve Güvenlik içindeki sır ve veri koruma kuralları, hata ayıklama sırasında da geçerlidir. Gerekli bilgi ve kontrollü erişim hedeflenir.18

Sayısal bir öğretim örneği: bilinen bir aralıkta 10.000 istekten 50'si sunucu hatasıyla bitmişse hata oranı 50 / 10.000 × 100 = %0,5 olur. Bu oran Python ile hesaplandı; gerçek hizmetimizin ölçümü değildir. Sadece toplam hata sayısına bakmak yetmez: 50 hata az trafikte çok, çok büyük trafikte küçük oran olabilir. Gecikmede de yalnız ortalama kullanıcıların yavaş ucunu gizleyebilir; hangi ölçüme neden baktığını belirlemek gerekir.18

Alarm (alert), müdahale gerektiren durumu bir sorumluya ulaştırmalıdır. Alarmın sahibini ve ilk bakılacak bilgiyi belirleriz. Uygulamamızda temel takip soruları: cevap kaydetme başarısı, API gecikmesi, veritabanı bağlantı sorunları ve yayın sonrası belirgin değişikliklerdir. Bunlar önerilen gözlem başlıklarıdır, kurulu bir izleme sisteminin raporu değildir.1819

43.7 Twelve-Factor App ve yapılandırma

Twelve-Factor App (twelve-factor methodology), hizmet olarak çalışan uygulamaların oluşturulması ve işletilmesi için on iki ilke önerir. Yeni bir programlama dili, zorunlu ürün listesi veya Docker kullanma şartı değildir. Şimdiye kadar ayrı ayrı konuştuğumuz kararları bir kontrol çerçevesinde toplar.1

İlkeBizim için kısa karşılığı
I. Codebaseİzlenen kod tabanı, birden çok ortamda yayın.
II. DependenciesBağımlılıkları açıkça belirt ve yalıt.
III. ConfigOrtamdan ortama değişen yapılandırmayı koddan ayır.
IV. Backing servicesPostgres gibi destek hizmetlerini bağlanan kaynaklar say.
V. Build, release, runÇıktı oluşturma, yapılandırmayla sürüm hazırlama ve çalıştırmayı ayır.
VI. ProcessesKalıcı durumu kendi belleğine bağlamayan süreçlerle çalış.
VII. Port bindingHizmeti dinlediği port üzerinden dışa aç.
VIII. ConcurrencyYükü süreç türleri ve kopyalarıyla dağıtmayı düşün.
IX. DisposabilityHızlı başlangıç ve devam eden işi gözeten kapanış sağla.
X. Dev/prod parityGeliştirme, staging ve üretim farkını azalt.
XI. LogsKayıtları olay akışı olarak üret; toplama ve saklamayı ortama bırak.
XII. Admin processesŞema göçü gibi yönetim işlerini ayrı tek seferlik süreçlerle yürüt.

Tablo, özgün on iki başlığın bu bölümdeki yığına uyarlanmış kısa okumasıdır. Ayrıntılar, her ilkenin özgün sayfasında okunmalıdır.1

Yapılandırma ile kodun ayrılması

Yapılandırma (configuration, config), sürümler arasında değil çalıştırılan yerler arasında değişmesi beklenen adres, erişim bilgisi ve benzeri ayarlardır. Twelve-Factor bunların ortam değişkenleriyle sağlanmasını önerir. Portu veya veri hizmetini değiştirmek kodu yeniden derlemeyi gerektirmemelidir. İş kuralı ise aynı anlamda ortama özgü yapılandırma değildir.3

PORT=8080 gibi bir örnek gizli değildir; veritabanı erişim bilgisi gizli olabilir. Aynı dağıtım mekanizmasından gelmeleri aynı hassasiyette oldukları anlamına gelmez. Ortam değişkeni bir iletim arayüzüdür, kendi başına güvenli sır kasası değildir. Dahası Expo'nun EXPO_PUBLIC_ önekli değişkenleri derlenmiş istemci içinde açıkça görülebilir: API adresi burada olabilir, sunucu erişim anahtarı olmamalıdır.320

Durumsuz süreç ilkesi “uygulamada hiç veri yok” demez. Kalıcı hesap ve puan Postgres'te, ortak oturum gerekiyorsa uygun bir oturum deposunda tutulur. Sürecin belleği kısa ömürlü hesap için kullanılabilir; fakat sonraki isteğin aynı sürece geleceği varsayılmaz. Böylece yeni sürüm başlatmak veya birden çok kopya çalıştırmak daha yönetilebilir olur. Bunun ölçeklenmeyle ilişkisini Bölüm 44: Mimariler içinde kuracağız.10

Kayıt ilkesi de aynı ayrımdır: uygulama olayını standart çıktıya yazabilir; çalışma ortamı bu akışı toplar, saklar ve aramaya açar. Saklama süresi ve erişim politikası yine tasarlanır.19

Bölüm 13 ile bağlantı

Bölüm 13: İşletim Sistemi kaynak ve yalıtım yönetimini, Bölüm 14: Süreçler ve İş Parçacıkları süreci kurdu. Konteyner bu kaynaklar üzerinde yalıtılmış süreç çalıştırır; bulut donanımı kaldırmaz, kimin yönettiğini değiştirir. Yeni terimlerin altında tanıdık katlar var.

Bu bölümde neler kuruldu

Ortamlar veri ve yetki sınırlarıdır. VM ayrı işletim sistemi, konteyner paylaşılan çekirdekte yalıtılmış süreçtir; imaj paket, Dockerfile tariftir. Bulut sorumluluk paylaşır. CI/CD denetimi yayınla birleştirir; DNS adlandırır, TLS bağlantıyı korur. Gözlem kayıt, ölçüm ve izden işe yarar sinyal çıkarır. Twelve-Factor kodu yapılandırmadan, kalıcı veriyi süreçten ayırır.

Terimler sözlükte, Bölüm 43 başlığı altında.

Birincil okuma

Birincil okuma: The Twelve-Factor App, özellikle III. Config, V. Build, release, run ve VI. Processes. Derinleşme: Docker, What is a container?, Containers versus virtual machines; GitHub Actions, The components of GitHub Actions.

Takıldığın yeri yapay zekâ öğretmenine sor. Ondan yalnız kağıt üzerinde bir yayın haritası çizmesini iste: istemci dosyası, Go süreci, Postgres ve sırlar nerede? Sonra 'Go süreci yeniden başlatıldı' senaryosunu uygula; hangi verinin kalacağını ve hangi kaydın sorunu göstereceğini sen anlat.

Bölüm sonu soruları

Kitaba bakmadan cevapla. Önce gerekçeni düşün, sonra şıkkını seç.

1. Staging ile üretimde hangi şey ayrılmalıdır?
Üretime benzer davranış hedeflenir; gerçek kullanıcı verisi ve üretim izinleri denemelerden ayrı tutulur. Bkz. 43.1.
2. Konteyner ile VM arasındaki temel fark hangisidir?
Aynı Linux çekirdeğinde çalışan konteynerler ayrı çekirdek başlatmaz; VM kendi işletim sistemini barındırır. Bkz. 43.2.
3. İmaj ile konteyner ayrımı hangisidir?
İmajdan çalışan konteyner oluşturulur; aynı imajdan birden çok örnek başlatılabilir. Bkz. 43.2.
4. Sunucusuz çalışma ne anlama gelir?
Sunucular ortadan kalkmaz; sağlama ve işletimin önemli bölümü sağlayıcının sorumluluğuna geçer. Bkz. 43.3.
5. Sürekli teslim için hangisi doğrudur?
Continuous delivery yayına alınabilirliği korur; continuous deployment üretime otomatik geçişi de içerir. Bkz. 43.4.
6. CNAME kaydı hangi işi yapar?
CNAME başka bir alan adına başvurur; süreci çalıştırmaz ve HTTPS sertifikası üretmez. Bkz. 43.5.
7. Hata oranının artmasını hangi sinyal özetler?
Ölçüm zaman içindeki sayısal davranışı özetler; kayıt belirli olayın ayrıntısına iner. Bkz. 43.6.
8. EXPO_PUBLIC_ değişkenine hangi değer uygundur?
Bu değişkenler istemci paketinde görünür; sunucu sırları bu sınırın dışına çıkmamalıdır. Bkz. 43.7.
9. Yeni imaj yayımlandıktan sonra veri yanlış görünüyor. Neden yalnız eski imaja dönmek yeterli olmayabilir?
Örnek cevabı göster

Yayın şema göçü veya veri değişikliği de yaptıysa eski kodun beklediği yapı artık bulunmayabilir. İmaj, yapılandırma, şema uyumu ve geri yükleme planı birlikte değerlendirilir. Bir sütunu geri eklemek silinen veriyi geri getirmez. Bkz. 43.4.

10. Go API'sinin belleğinde tuttuğu oturumlar her yayında kayboluyor. Hangi Twelve-Factor ilkesi ve hangi önceki bölüm yardımcı olur?
Örnek cevabı göster

Processes ilkesi kalıcı ya da istekler arasında gereken ortak durumu süreç belleğine bağlamamayı önerir. Bölüm 40 oturum deposunu anlatır; uygulama kopyaları ortak uygun depoya başvurabilir. Bölüm 41 ise süre, iptal ve güvenlik politikasını ekler. Bkz. 43.7.

Kaynaklar

  1. The Twelve-Factor App: özgün on iki ilke; özellikle build/release/run, disposability ve dev/prod parity.
  2. GitHub Docs, Deployment environments: ortam hedefleri, koruma kuralları ve ortam sırları.
  3. The Twelve-Factor App, III. Config: yapılandırmayı ortamda tutma ve koddan ayırma.
  4. AWS, Types of Cloud Computing: IaaS/PaaS ve yönetim sorumluluğu ayrımları.
  5. Docker Docs, What is a container?: süreç yalıtımı, VM farkı ve birlikte kullanım.
  6. Docker Docs, Get started: konteyner ve imaj kavramlarına yazılı giriş.
  7. Docker Docs, What is an image?: değişmez katmanlar, imaj paketleme ve dağıtım.
  8. Docker Docs, Dockerfile reference: FROM, COPY, RUN, ENTRYPOINT.
  9. Docker Docs, Persisting container data: yazılabilir konteyner katmanı ve birim yaşam döngüsü.
  10. The Twelve-Factor App, VI. Processes: kalıcı durumun dış hizmette tutulması ve ortak oturum.
  11. Google Cloud, What is Cloud Run?: yönetilen konteyner örnekleri ve HTTP hizmetleri.
  12. Cloudflare, How Workers works: V8 isolates ve çalışma bağlamının ömrü.
  13. Martin Fowler, Continuous Delivery: yayına alınabilir olma ile otomatik üretim dağıtımı ayrımı.
  14. GitHub Docs, Understanding GitHub Actions: workflow, job, step ve runner.
  15. Cloudflare, DNS record types: A, AAAA, CNAME ve TTL.
  16. Let's Encrypt, How It Works: alan adı denetimi ve sertifika yönetimi.
  17. Cloudflare, Full (strict): istemci–Cloudflare ve Cloudflare–origin şifreli bağlantıları ve origin sertifikası.
  18. AWS Well-Architected, Implement observability: kayıt, ölçüm, iz ve anlamlı göstergeler.
  19. The Twelve-Factor App, XI. Logs: olay akışı, standart çıktı ve alarm örnekleri.
  20. Expo, Environment variables: EXPO_PUBLIC_ değerlerinin istemci paketinde açık görünmesi.
  21. AWS Builders’ Library, Ensuring rollback safety during deployments: veri biçimi ve sürümler arası geriye uyumluluk.
  22. Cloudflare, Time to Live (TTL): kayıt değişiklikleri ve DNS önbelleği.