Python mikroservisleri ile servis ağı uygulamasına yönelik global geliştiriciler için kapsamlı bir rehber. Istio, Linkerd, güvenlik, gözlemlenebilirlik ve trafik yönetimi hakkında bilgi edinin.
Python Mikroservisleri: Bir Servis Ağı Uygulamasında Derinlemesine Bir Bakış
Yazılım geliştirme dünyası temelden mikroservis mimarisine doğru kaymıştır. Monolitik uygulamaları daha küçük, bağımsız olarak konuşlandırılabilir servislere ayırmak, eşsiz bir çeviklik, ölçeklenebilirlik ve esneklik sunar. Python, temiz sözdizimi ve FastAPI ile Flask gibi güçlü çerçeveleriyle bu servisleri oluşturmak için önde gelen bir seçim haline gelmiştir. Ancak, bu dağıtık dünya zorluklardan yoksun değildir. Servis sayısı arttıkça, etkileşimlerini yönetmenin karmaşıklığı da artar. İşte tam burada bir servis ağı (service mesh) devreye girer.
Bu kapsamlı rehber, Python ile çalışan yazılım mühendisleri, DevOps profesyonelleri ve mimarlardan oluşan global bir kitle içindir. Bir servis ağının neden sadece 'olsa iyi olur' değil, mikroservisleri büyük ölçekte çalıştırmak için önemli bir bileşen olduğunu inceleyeceğiz. Bir servis ağının ne olduğunu, kritik operasyonel zorlukları nasıl çözdüğünü açıklayacak ve Python tabanlı bir mikroservis ortamında birini uygulamaya pratik bir bakış sunacağız.
Python Mikroservisleri Nelerdir? Hızlı Bir Hatırlatma
Ağa dalmadan önce ortak bir zemin oluşturalım. Bir mikroservis mimarisi, tek bir uygulamanın birçok gevşek bağlı ve bağımsız olarak konuşlandırılabilir daha küçük servislerden oluştuğu bir yaklaşımdır. Her servis kendi içinde bağımsızdır, belirli bir iş yeteneğinden sorumludur ve genellikle API'ler (REST veya gRPC gibi) aracılığıyla ağ üzerinden diğer servislerle iletişim kurar.
Python, aşağıdaki nedenlerle bu paradigma için olağanüstü derecede uygundur:
- Basitlik ve Geliştirme Hızı: Python'ın okunabilir sözdizimi, ekiplerin servisleri hızlı bir şekilde oluşturmasına ve yinelemesine olanak tanır.
- Zengin Ekosistem: Web sunucularından (FastAPI, Flask) veri bilimine (Pandas, Scikit-learn) kadar her şey için geniş bir kütüphane ve çerçeve koleksiyonu.
- Performans: Starlette ve Pydantic üzerine kurulu FastAPI gibi modern asenkron çerçeveler, mikroservislerde yaygın olan I/O-yoğun görevler için NodeJS ve Go ile karşılaştırılabilir performans sunar.
Global bir e-ticaret platformu hayal edin. Tek bir devasa uygulama yerine, aşağıdaki gibi mikroservislerden oluşabilir:
- Kullanıcı Servisi: Kullanıcı hesaplarını ve kimlik doğrulamasını yönetir.
- Ürün Servisi: Ürün kataloğunu ve envanteri yönetir.
- Sipariş Servisi: Yeni siparişleri ve ödemeyi işler.
- Nakliye Servisi: Nakliye maliyetlerini hesaplar ve teslimatı düzenler.
Python ile yazılmış Sipariş Servisi, müşteriyi doğrulamak için Kullanıcı Servisi ile ve stok kontrolü yapmak için Ürün Servisi ile konuşmalıdır. Bu iletişim ağ üzerinden gerçekleşir. Şimdi bunu onlarca veya yüzlerce servisle çarptığınızda, karmaşıklık ortaya çıkmaya başlar.
Dağıtık Mimarinin İçsel Zorlukları
Uygulamanızın bileşenleri bir ağ üzerinden iletişim kurduğunda, ağın doğuştan gelen tüm güvenilmezliğini devralırsınız. Monolitin basit bir fonksiyon çağrısı, potansiyel sorunlarla dolu karmaşık bir ağ isteğine dönüşür. Bunlar genellikle "Gün 2" operasyonel sorunlar olarak adlandırılır çünkü ilk dağıtımdan sonra ortaya çıkarlar.
Ağ Güvenilmezliği
Sipariş Servisi çağrı yaptığında Ürün Servisi yanıt vermekte yavaşsa veya geçici olarak kullanılamazsa ne olur? İstek başarısız olabilir. Uygulama kodunun şimdi bunu ele alması gerekir. Yeniden denemeli mi? Kaç kez? Hangi gecikmeyle (üstel geri çekilme)? Ürün Servisi tamamen kapalıysa ne olur? Kurtulması için bir süre istek göndermeyi bırakmalı mıyız? Yeniden denemeler, zaman aşımları ve devre kesiciler dahil bu mantık, her servis için, her ağ çağrısı için uygulanmalıdır. Bu, gereksizdir, hataya yatkındır ve Python iş mantığınızı karmaşıklaştırır.
Gözlemlenebilirlik Boşluğu
Bir monolitte, performansı anlamak nispeten basittir. Bir mikroservis ortamında, tek bir kullanıcı isteği beş, on veya daha fazla servisten geçebilir. Eğer bu istek yavaşsa, darboğaz nerede? Bunu yanıtlamak, aşağıdaki konularda birleşik bir yaklaşım gerektirir:
- Metrikler: Her servisten istek gecikmesi, hata oranları ve trafik hacmi ("Altın Sinyaller") gibi metriklerin tutarlı bir şekilde toplanması.
- Günlükleme: Yüzlerce servis örneğinden günlükleri bir araya getirme ve belirli bir istekle ilişkilendirme.
- Dağıtık İzleme: Tek bir isteğin dokunduğu tüm servisler arasındaki yolculuğunu takip ederek tüm çağrı grafiğini görselleştirmek ve gecikmeleri belirlemek.
Bunu manuel olarak uygulamak, her Python servisine kapsamlı enstrümantasyon ve izleme kütüphaneleri eklemek anlamına gelir, bu da tutarlılıkta sapmalara ve ek bakım maliyetlerine yol açabilir.
Güvenlik Labirenti
Sipariş Servisi ile Kullanıcı Servisi arasındaki iletişimin güvenli ve şifreli olduğundan nasıl emin olursunuz? Sadece Sipariş Servisi'nin Ürün Servisi'ndeki hassas envanter uç noktalarına erişmesine izin verildiğini nasıl garanti edersiniz? Geleneksel bir kurulumda, ağ düzeyindeki kurallara (güvenlik duvarları) güvenebilir veya her uygulamaya sırları ve kimlik doğrulama mantığını gömebilirsiniz. Bu, büyük ölçekte yönetilmesi inanılmaz derecede zorlaşır. Her servisin her çağrıyı kimlik doğrulayıp yetkilendirdiği, Karşılıklı TLS (mTLS) ve ayrıntılı erişim kontrolü olarak bilinen sıfır güven ağına ihtiyacınız vardır.
Karmaşık Dağıtımlar ve Trafik Yönetimi
Python tabanlı Ürün Servisi'nizin yeni bir sürümünü kesinti yaratmadan nasıl yayınlarsınız? Yaygın bir strateji, canlı trafiğin küçük bir yüzdesini (örn. %1) yavaşça yeni sürüme yönlendirdiğiniz bir kanarya sürümüdür. Eğer iyi performans gösterirse, trafiği kademeli olarak artırırsınız. Bunu uygulamak genellikle yük dengeleyici veya API ağ geçidi düzeyinde karmaşık mantık gerektirir. Aynı şey A/B testleri veya test amaçlı trafik yansıtma için de geçerlidir.
Servis Ağına Giriş: Servisler İçin Ağ
Bir servis ağı, bu zorlukları ele alan özel, yapılandırılabilir bir altyapı katmanıdır. Tüm servisten servise iletişimi yönetmek için mevcut ağınızın (Kubernetes tarafından sağlanan gibi) üzerinde oturan bir ağ modelidir. Birincil amacı, bu iletişimi güvenilir, güvenli ve gözlemlenebilir hale getirmektir.
Temel Bileşenler: Kontrol Düzlemi ve Veri Düzlemi
Bir servis ağının iki ana bölümü vardır:
- Veri Düzlemi: Mikroservisinizin her bir örneğinin yanında dağıtılan sidecar adı verilen bir dizi hafif ağ proxy'sinden oluşur. Bu proxy'ler, servisinizin içine ve dışına giden tüm ağ trafiğini yakalar. Servisinizin Python ile yazıldığını bilmezler veya umursamazlar; ağ düzeyinde çalışırlar. Servis ağlarında kullanılan en popüler proxy Envoy'dur.
- Kontrol Düzlemi: Bu, servis ağının "beynidir". Operatör olarak sizin etkileşim kurduğunuz bir dizi bileşendir. Kontrol düzlemine üst düzey kurallar ve politikalar sağlarsınız (örn. "Ürün Servisi'ne başarısız olan istekleri 3 defaya kadar yeniden dene"). Kontrol düzlemi daha sonra bu politikaları yapılandırmalara dönüştürür ve veri düzlemindeki tüm sidecar proxy'lerine gönderir.
Ana fikir şudur: servis ağı, ağ endişelerine yönelik mantığı bireysel Python servislerinizden alıp platform katmanına taşır. FastAPI geliştiricinizin artık bir yeniden deneme kütüphanesi içe aktarmasına veya mTLS sertifikalarını işlemek için kod yazmasına gerek yoktur. İş mantığını yazarlar ve ağ geri kalanını şeffaf bir şekilde halleder.
Sipariş Servisi'nden Ürün Servisi'ne bir istek şimdi şöyle akar: Sipariş Servisi → Sipariş Servisi Sidecar → Ürün Servisi Sidecar → Ürün Servisi. Tüm sihir — yeniden denemeler, yük dengeleme, şifreleme, metrik toplama — iki sidecar arasında, kontrol düzlemi tarafından yönetilerek gerçekleşir.
Bir Servis Ağının Temel Taşları
Bir servis ağının sağladığı faydaları dört ana sütun halinde inceleyelim.
1. Güvenilirlik ve Esneklik
Bir servis ağı, uygulama kodunuzu değiştirmeden dağıtık sisteminizi daha sağlam hale getirir.
- Otomatik Yeniden Denemeler: Bir servise yapılan çağrı geçici bir ağ hatasıyla başarısız olursa, sidecar yapılandırılmış bir politikaya göre isteği otomatik olarak yeniden deneyebilir.
- Zaman Aşımları: Tutarlı, servis düzeyinde zaman aşımları uygulayabilirsiniz. Bir alt akış servisi 200 ms içinde yanıt vermezse, istek hızla başarısız olur ve kaynakların tutulmasını engeller.
- Devre Kesiciler: Bir servis örneği sürekli olarak başarısız oluyorsa, sidecar onu geçici olarak yük dengeleme havuzundan çıkarabilir (devreyi tetikler). Bu, basamaklı arızaları önler ve sağlıksız servise iyileşmesi için zaman tanır.
2. Derin Gözlemlenebilirlik
Sidecar proxy, trafiği gözlemlemek için mükemmel bir bakış noktasıdır. Her isteği ve yanıtı gördüğü için otomatik olarak zengin telemetri verileri oluşturabilir.
- Metrikler: Ağ, gecikme (p50, p90, p99), başarı oranları ve istek hacmi dahil tüm trafik için otomatik olarak ayrıntılı metrikler üretir. Bunlar Prometheus gibi bir araç tarafından alınabilir ve Grafana gibi bir gösterge panosunda görselleştirilebilir.
- Dağıtık İzleme: Sidecar'lar, servis çağrıları arasında izleme başlıklarını (B3 veya W3C Trace Context gibi) enjekte edebilir ve yayabilir. Bu, Jaeger veya Zipkin gibi izleme araçlarının bir isteğin tüm yolculuğunu bir araya getirmesine olanak tanıyarak sisteminizin davranışına dair eksiksiz bir resim sunar.
- Erişim Günlükleri: Her servisten servise çağrı için kaynak, hedef, yol, gecikme ve yanıt kodunu gösteren tutarlı, ayrıntılı günlükler elde edin, hem de Python kodunuzda tek bir `print()` ifadesi olmadan.
Kiali gibi araçlar bu verileri mikroservislerinizin canlı bir bağımlılık grafiğini oluşturmak, trafik akışını ve sağlık durumunu gerçek zamanlı olarak göstermek için bile kullanabilir.
3. Evrensel Güvenlik
Bir servis ağı, kümenizin içinde sıfır güven güvenlik modelini uygulayabilir.
- Karşılıklı TLS (mTLS): Ağ, her servise otomatik olarak kriptografik kimlikler (sertifikalar) verebilir. Daha sonra bunları servisler arasındaki tüm trafiği şifrelemek ve kimlik doğrulamak için kullanır. Bu, kimliği doğrulanmamış hiçbir servisin başka bir servisle konuşamamasını ve tüm aktarım halindeki verilerin şifrelenmesini sağlar. Bu, basit bir yapılandırma düğmesiyle açılır.
- Yetkilendirme Politikaları: Güçlü, ayrıntılı erişim kontrol kuralları oluşturabilirsiniz. Örneğin, şöyle bir politika yazabilirsiniz: "'order-service' kimliğine sahip servislerden 'product-service' üzerindeki '/products' uç noktasına `GET` isteklerine izin ver, ancak diğer her şeyi reddet." Bu, Python kodunuzda değil, sidecar düzeyinde uygulanır, bu da onu çok daha güvenli ve denetlenebilir hale getirir.
4. Esnek Trafik Yönetimi
Bu, bir servis ağının en güçlü özelliklerinden biridir ve sisteminizdeki trafiğin nasıl aktığı üzerinde hassas kontrol sağlar.
- Dinamik Yönlendirme: Başlıklara, çerezlere veya diğer meta verilere göre istekleri yönlendirin. Örneğin, belirli bir HTTP başlığını kontrol ederek beta kullanıcılarını bir servisin yeni bir sürümüne yönlendirin.
- Kanarya Sürümleri ve A/B Testi: Trafiği yüzdeye göre bölerek gelişmiş dağıtım stratejileri uygulayın. Örneğin, trafiğin %90'ını Python servisinizin `v1` sürümüne ve %10'unu yeni `v2` sürümüne gönderin. `v2` için metrikleri izleyebilir ve her şey yolundaysa, `v2` %100'ü yönetene kadar trafiği kademeli olarak kaydırabilirsiniz.
- Hata Enjeksiyonu: Sisteminizin esnekliğini test etmek için, belirli istekler için HTTP 503 hataları veya ağ gecikmeleri gibi hataları kasten enjekte etmek üzere ağı kullanabilirsiniz. Bu, gerçek bir kesintiye neden olmadan zayıflıkları bulmanıza ve düzeltmenize yardımcı olur.
Servis Ağınızı Seçme: Global Bir Bakış Açısı
Birkaç olgun, açık kaynaklı servis ağı mevcuttur. Seçim, kuruluşunuzun ihtiyaçlarına, mevcut ekosistemine ve operasyonel kapasitesine bağlıdır. En öne çıkan üçü Istio, Linkerd ve Consul'dur.
Istio
- Genel Bakış: Google, IBM ve diğerleri tarafından desteklenen Istio, en zengin özelliklere sahip ve güçlü servis ağıdır. Savaşta test edilmiş Envoy proxy'sini kullanır.
- Güçlü Yönler: Trafik yönetiminde eşsiz esneklik, güçlü güvenlik politikaları ve canlı bir ekosistem. Karmaşık, kurumsal düzeydeki dağıtımlar için fiili standarttır.
- Dezavantajlar: Gücü karmaşıklıkla birlikte gelir. Öğrenme eğrisi dik olabilir ve diğer ağlara kıyasla daha yüksek kaynak yüküne sahiptir.
Linkerd
- Genel Bakış: Basitliği, performansı ve operasyonel kolaylığı önceliklendiren bir CNCF (Cloud Native Computing Foundation) mezun projesidir.
- Güçlü Yönler: Kurulumu ve başlaması inanılmaz derecede kolaydır. Rust ile yazılmış özel yapım, ultra hafif proxy'si sayesinde çok düşük kaynak ayak izine sahiptir. mTLS gibi özellikler sıfır yapılandırma ile kutudan çıktığı gibi çalışır.
- Dezavantajlar: Daha öznel ve odaklanmış bir özellik setine sahiptir. Gözlemlenebilirlik, güvenilirlik ve güvenlik gibi temel kullanım durumlarını olağanüstü iyi kapsasa da, Istio'nun bazı gelişmiş, ezoterik trafik yönlendirme yeteneklerinden yoksundur.
Consul Connect
- Genel Bakış: Daha geniş HashiCorp araç paketinin (Terraform ve Vault'u içerir) bir parçasıdır. Temel farklılaştırıcı özelliği, çoklu platform ortamları için birinci sınıf desteğidir.
- Güçlü Yönler: Birden çok Kubernetes kümesi, farklı bulut sağlayıcıları ve hatta sanal makineler veya fiziksel sunucular arasında uzanan hibrit ortamlar için en iyi seçimdir. Consul servis kataloğu ile entegrasyonu sorunsuzdur.
- Dezavantajlar: Daha büyük bir ürünün parçasıdır. Yalnızca tek bir Kubernetes kümesi için bir servis ağına ihtiyacınız varsa, Consul ihtiyacınız olandan daha fazlası olabilir.
Pratik Uygulama: Bir Python Mikroservisini Servis Ağına Ekleme
Basit bir Python FastAPI servisini Istio gibi bir ağa nasıl ekleyeceğinize dair kavramsal bir örneği inceleyelim. Bu sürecin güzelliği, Python uygulamanızda ne kadar az değişiklik yapmanız gerektiğidir.
Senaryo
FastAPI kullanarak Python'da yazılmış basit bir `user-service`imiz var. Tek bir uç noktası var: `/users/{user_id}`.
Adım 1: Python Servisi (Ağa Özgü Kod Yok)
Uygulama kodunuz saf iş mantığı olarak kalır. Istio, Linkerd veya Envoy için hiçbir içe aktarma yoktur.
main.py:
from fastapi import FastAPI
app = FastAPI()
users_db = {
1: {"name": "Alice", "location": "Global"},
2: {"name": "Bob", "location": "International"}
}
@app.get("/users/{user_id}")
def read_user(user_id: int):
return users_db.get(user_id, {"error": "User not found"})
Eşlik eden `Dockerfile` da standarttır, özel bir değişiklik yapılmamıştır.
Adım 2: Kubernetes Dağıtımı
Servisinizin dağıtımını ve servisini standart Kubernetes YAML'inde tanımlarsınız. Burada da henüz servis ağına özgü hiçbir şey yok.
apiVersion: apps/v1
kind: Deployment
metadata:
name: user-service-v1
spec:
replicas: 1
selector:
matchLabels:
app: user-service
version: v1
template:
metadata:
labels:
app: user-service
version: v1
spec:
containers:
- name: user-service
image: your-repo/user-service:v1
ports:
- containerPort: 8000
---
apiVersion: v1
kind: Service
metadata:
name: user-service
spec:
selector:
app: user-service
ports:
- port: 80
targetPort: 8000
Adım 3: Sidecar Proxy Enjeksiyonu
İşte sihrin gerçekleştiği yer burası. Servis ağınızı (örn. Istio) Kubernetes kümenize kurduktan sonra, otomatik sidecar enjeksiyonunu etkinleştirirsiniz. Istio için bu, ad alanınız için tek seferlik bir komuttur:
kubectl label namespace default istio-injection=enabled
Şimdi, `kubectl apply -f your-deployment.yaml` kullanarak `user-service`inizi dağıttığınızda, Istio kontrol düzlemi pod belirtimini oluşturulmadan önce otomatik olarak değiştirir. Pod'a Envoy proxy kapsayıcısını ekler. Pod'unuzda artık iki kapsayıcı bulunur: Python `user-service`iniz ve `istio-proxy`. YAML'inizi hiç değiştirmeniz gerekmedi.
Adım 4: Servis Ağı Politikalarını Uygulama
Python servisiniz artık ağın bir parçası! Ona gelen ve ondan giden tüm trafik proxy ediliyor. Şimdi güçlü politikalar uygulayabilirsiniz. Ad alanındaki tüm servisler için katı mTLS'yi uygulayalım.
peer-authentication.yaml:
apiVersion: security.istio.io/v1beta1
kind: PeerAuthentication
metadata:
name: default
namespace: default
spec:
mtls:
mode: STRICT
Bu tek, basit YAML dosyasını uygulayarak, ad alanındaki tüm servisten servise iletişimi şifrelemiş ve kimlik doğrulamış oldunuz. Bu, sıfır uygulama kodu değişikliğiyle büyük bir güvenlik kazancıdır.
Şimdi bir kanarya sürümü gerçekleştirmek için bir trafik yönlendirme kuralı oluşturalım. `user-service-v2`nin dağıtıldığını varsayalım.
virtual-service.yaml:
apiVersion: networking.istio.io/v1alpha3
kind: VirtualService
metadata:
name: user-service
spec:
hosts:
- user-service
http:
- route:
- destination:
host: user-service
subset: v1
weight: 90
- destination:
host: user-service
subset: v2
weight: 10
Bu `VirtualService` ve karşılık gelen bir `DestinationRule` (bu `v1` ve `v2` alt kümelerini tanımlar) ile Istio'ya trafiğin %90'ını eski servisinize, %10'unu ise yenisine göndermesini söylediniz. Tüm bunlar altyapı düzeyinde, Python uygulamalarına ve onları çağıranlara tamamen şeffaf bir şekilde yapılır.
Servis Ağını Ne Zaman Kullanmalısınız? (Ve Ne Zaman Kullanmamalısınız?)
Bir servis ağı güçlü bir araçtır, ancak evrensel bir çözüm değildir. Birini benimsemek, yönetilecek başka bir altyapı katmanı ekler.
Bir servis ağı benimseyin:
- Mikroservis sayınız artıyorsa (genellikle 5-10 servisten fazla) ve etkileşimlerini yönetmek baş ağrısı oluyorsa.
- Python, Go ve Java'da yazılmış servisler için tutarlı politikalar uygulamayı gerektiren çok dilli bir ortamda çalışıyorsanız.
- Uygulama düzeyinde karşılaması zor olan katı güvenlik, gözlemlenebilirlik ve esneklik gereksinimleriniz varsa.
- Kuruluşunuzda ayrı geliştirme ve operasyon ekipleri varsa ve geliştiricilerin iş mantığına odaklanmasını, operasyon ekibinin ise platformu yönetmesini istiyorsanız.
- Kapsayıcı düzenlemeye, özellikle Kubernetes'e yoğun bir şekilde yatırım yaptıysanız, çünkü servis ağları en sorunsuz şekilde orada entegre olur.
Alternatifleri düşünün:
- Bir monolitin veya sadece birkaç servisiniz varsa. Ağın operasyonel yükü muhtemelen faydalarını aşacaktır.
- Ekibiniz küçükse ve yeni, karmaşık bir altyapı bileşenini öğrenme ve yönetme kapasitesinden yoksunsa.
- Uygulamanız mümkün olan en düşük gecikmeyi talep ediyorsa ve sidecar proxy tarafından eklenen mikrosaniye düzeyindeki yük kullanım durumunuz için kabul edilemezse.
- Güvenilirlik ve esneklik ihtiyaçlarınız basitse ve iyi bakımlı uygulama düzeyinde kütüphanelerle yeterince çözülebiliyorsa.
Sonuç: Python Mikroservislerinizi Güçlendirmek
Mikroservis yolculuğu geliştirme ile başlar ancak hızla operasyonel bir zorluğa dönüşür. Python tabanlı dağıtık sisteminiz büyüdükçe, ağ oluşturma, güvenlik ve gözlemlenebilirlik karmaşıklıkları geliştirme ekiplerini bunaltabilir ve inovasyonu yavaşlatabilir.
Bir servis ağı, bu zorlukları uygulamadan soyutlayarak ve özel, dilden bağımsız bir altyapı katmanına taşıyarak doğrudan ele alır. Servisler arasında, hangi dilde yazıldıklarına bakılmaksızın iletişimi kontrol etmek, güvenli hale getirmek ve gözlemlemek için tek tip bir yol sağlar.
Istio veya Linkerd gibi bir servis ağı benimseyerek, Python geliştiricilerinizi en iyi yaptıkları şeyi yapmaları için güçlendirirsiniz: mükemmel özellikler oluşturmak ve iş değeri sunmak. Karmaşık, tekrarlayan ağ mantığını uygulama yükünden kurtulurlar ve bunun yerine esneklik, güvenlik ve içgörü sağlamak için platforma güvenebilirler. Mikroservis mimarisini ölçeklendirme konusunda ciddi olan herhangi bir kuruluş için bir servis ağı, güvenilirlik, güvenlik ve geliştirici üretkenliği açısından kazanç sağlayan stratejik bir yatırımdır.