Takip et

Gecikme-Kritik Sistemlerde Direnç Neden Hayati Önem Taşır?

Envoy ile Düşük Gecikmeli Sistemlerde Direnç Nasıl Artırılır?

Düşük gecikmeli sistemlerde güvenilirliği artırmak, günümüzün rekabetçi dijital dünyasında kritik bir öneme sahiptir. Envoy Proxy’nin gelişmiş trafik yönetimi ve hata toleransı özellikleri sayesinde, uygulamalarınızın kesintisiz çalışmasını sağlayarak kullanıcı deneyimini iyileştirebilirsiniz.

Gecikme-Kritik Sistemlerde Direnç Neden Hayati Önem Taşır?

Günümüzün dijital ekosisteminde, kullanıcı beklentileri her zamankinden daha yüksek. Bir web sitesinin veya uygulamanın birkaç saniye bile geç yüklenmesi, kullanıcıların sabrını zorlayabilir ve rekabetçi ortamda hızla başka bir alternatife yönelmelerine neden olabilir. Özellikle finans, e-ticaret, oyun veya gerçek zamanlı iletişim gibi gecikme-kritik sistemlerde, milisaniyeler bile büyük farklar yaratabilir. Bu tür sistemlerde performans düşüşleri veya kesintiler, doğrudan gelir kaybına, itibar zedelenmesine ve müşteri memnuniyetsizliğine yol açar. Dolayısıyla, bu sistemlerin her türlü aksaklığa karşı dirençli olması, yani hatalara rağmen işlevselliğini sürdürebilmesi hayati bir gerekliliktir.

Direnç (resilience), bir sistemin veya uygulamanın beklenmedik hatalar, aşırı yüklenmeler, ağ kesintileri veya diğer olumsuz koşullar karşısında bile sorunsuz bir şekilde çalışmaya devam edebilme yeteneğini ifade eder. Bu, sadece sistemin ayakta kalması değil, aynı zamanda belirlenen performans hedeflerini de sürdürmesi anlamına gelir. Örneğin, bir ödeme sisteminin yoğun saatlerde yavaşlaması veya bir mikroservisin yanıt vermemesi, tüm iş akışını durdurabilir. Bu bağlamda, sistemlerimizi tasarlarken ve yönetirken, olası hata senaryolarını önceden düşünmek ve bunlara karşı proaktif çözümler geliştirmek zorundayız. Envoy Proxy, bu noktada devreye girerek, dağıtık sistemlerin karmaşıklığını yönetmek ve onlara üst düzey bir direnç kazandırmak için güçlü bir araç seti sunar. Mikroservis mimarilerinin yaygınlaşmasıyla birlikte, ağ trafiğinin yönetimi ve servisler arası iletişimin güvenliği daha da karmaşık hale gelmiştir. Her bir mikroservis kendi başına bir hata noktası olabilirken, Envoy gibi bir servis proxy’si, bu hata noktalarını izole etmeye ve sistemin genel sağlığını korumaya yardımcı olur. Bu sayede, tek bir serviste yaşanan bir sorun, tüm sistemin çökmesine neden olmaz; aksine, bu sorun yalıtılır ve sistemin geri kalanı çalışmaya devam eder. Bu durum, özellikle yüksek kullanılabilirlik gerektiren uygulamalar için paha biçilmez bir özelliktir. Kısacası, gecikme-kritik sistemlerde direnç, sadece bir “iyi sahip olunması gereken” özellik değil, aynı zamanda iş sürekliliği ve rekabet avantajı için olmazsa olmaz bir temeldir.

Temel Kavramlar: Envoy, Gecikme-Kritik Sistemler ve Direnç Nedir?

Envoy Proxy’nin yeteneklerini tam olarak anlamak için, öncelikle temel kavramlara bir göz atmak faydalı olacaktır. Bu bölümde, Envoy’un ne olduğunu, gecikme-kritik sistemlerin özelliklerini ve sistem direncini nasıl tanımladığımızı açıklayacağız. Bu bilgiler, daha sonraki pratik uygulamalar için sağlam bir zemin oluşturacaktır.

Envoy Proxy’ye Hızlı Bir Bakış: Neden Bu Kadar Popüler?

Envoy Proxy, bulut tabanlı uygulamalar için tasarlanmış, yüksek performanslı, açık kaynaklı bir kenar ve servis proxy’sidir. Lyft tarafından geliştirilen ve daha sonra Cloud Native Computing Foundation (CNCF) bünyesine dahil edilen Envoy, özellikle mikroservis mimarilerinde servisler arası iletişimi yönetmek, trafik akışını kontrol etmek ve gözlemlenebilirlik sağlamak için kullanılır. Bir servis ağı (service mesh) mimarisinin temel bileşenlerinden biri olarak, her bir uygulamanın yanına bir “sidecar” proxy olarak konuşlandırılabilir. Bu sayede, uygulama kodunda değişiklik yapmaya gerek kalmadan ağ trafiği üzerinde kapsamlı kontrol ve görünürlük elde edilir.

Envoy’un popülerliğinin arkasında yatan başlıca nedenler şunlardır:

  • Yüksek Performans: C++ ile yazılmış olması sayesinde düşük gecikme ve yüksek aktarım hızı sunar.
  • Protokol Agnostik: HTTP/1.1, HTTP/2, gRPC, TCP ve WebSocket gibi çeşitli protokolleri destekler.
  • Dinamik Konfigürasyon: Kontrol düzlemi (control plane) aracılığıyla çalışma zamanında konfigürasyon değişikliklerini uygulayabilir.
  • Gelişmiş Trafik Yönetimi: Yük dengeleme, devre kesiciler, yeniden denemeler, zaman aşımları ve trafik gölgeleme gibi özellikler sunar.
  • Kapsamlı Gözlemlenebilirlik: Metrikler, dağıtık izleme (distributed tracing) ve erişim günlükleri (access logs) ile sistemin iç işleyişi hakkında detaylı bilgi sağlar.
  • Genişletilebilirlik: Filtre zincirleri aracılığıyla özel işlevsellikler eklenebilir.

Envoy, aslında bir “evrensel veri düzlemi” olarak konumlandırılabilir. Yani, servisleriniz arasındaki tüm ağ trafiği ondan geçer. Bu merkezi konum, trafik üzerinde tam kontrol sahibi olmanızı ve böylece sistemin genel direncini artırmanızı sağlar. Örneğin, bir servis aşırı yüklenmeye başladığında, Envoy devreye girerek bu servise giden trafiği azaltabilir veya başka bir sağlıklı servise yönlendirebilir. Bu sayede, tek bir servisin arızası tüm sistemi etkilemez.

Gecikme-Kritik Sistemlerin Hassasiyeti: Neden Her Milisaniye Önemli?

Gecikme-kritik sistemler, adından da anlaşılacağı gibi, yanıt sürelerinin çok kısa olması gereken ve herhangi bir gecikmenin ciddi olumsuz sonuçlar doğurabileceği sistemlerdir. Bu sistemlerin temel özellikleri şunlardır:

  • Düşük Tolerans: Yüksek gecikmeye karşı toleransları yok denecek kadar azdır.
  • Gerçek Zamanlı İşleme: Genellikle gerçek zamanlı veri işleme veya etkileşim gerektirirler.
  • Yüksek Kullanılabilirlik: Kesintisiz çalışabilirlik, iş sürekliliği için esastır.
  • Ciddi Sonuçlar: Performans düşüşleri veya kesintiler, finansal kayıplara, güvenlik risklerine veya kullanıcı kaybına yol açabilir.

Örnek olarak, bir yüksek frekanslı ticaret platformunu düşünelim. Burada milisaniyeler, milyonlarca dolarlık kazanç veya kaybı belirleyebilir. Benzer şekilde, çevrimiçi oyunlarda yaşanan gecikmeler (lag), oyuncu deneyimini tamamen bozabilir. E-ticaret sitelerinde ise, her 100 milisaniyelik gecikmenin dönüşüm oranlarını %1 oranında düşürdüğü gözlemlenmiştir. Bu durumlar, gecikme-kritik sistemlerde her milisaniyenin neden bu kadar önemli olduğunu açıkça göstermektedir. Bu tür sistemlerde Envoy’un rolü, sadece trafiği yönlendirmekle kalmaz, aynı zamanda ağ katmanındaki olası gecikmeleri minimize etmek, hataları hızla tespit edip izole etmek ve sistemin genel performansını optimize etmek için proaktif önlemler almaktır. Bu sayede, uygulama katmanındaki iş mantığına odaklanırken, ağ karmaşıklığı Envoy tarafından yönetilir ve sistemin direnci artırılır.

Envoy ile Direnç Nasıl Artırılır? Temel Stratejiler ve Uygulamalar

Envoy, dağıtık sistemlerin direncini artırmak için bir dizi güçlü özellik sunar. Bu bölümde, bu özelliklerin başında gelen trafik yönetimi, yük dengeleme, hata toleransı mekanizmaları ve gözlemlenebilirlik araçlarını detaylıca inceleyeceğiz. Bu stratejileri doğru bir şekilde uygulayarak, sistemlerinizin beklenmedik durumlara karşı daha hazırlıklı olmasını sağlayabilirsiniz.

Trafik Yönetimi ve Yük Dengeleme: Yükü Akıllıca Dağıtmak

Gecikme-kritik sistemlerde yük dengeleme, yalnızca trafiği birden fazla servise dağıtmakla kalmaz, aynı zamanda servislerin sağlığını sürekli izleyerek ve sağlıksız servislere giden trafiği keserek sistemin genel kararlılığını sağlar. Envoy, gelişmiş yük dengeleme algoritmaları ve sağlık kontrolü mekanizmaları sunarak bu konuda öne çıkar.

Yük Dengeleme Algoritmaları: Hangi Senaryo İçin Hangisi?

Envoy, farklı ihtiyaçlara yönelik çeşitli yük dengeleme algoritmaları sunar:

  • Round Robin: İstekleri sırayla her servise dağıtır. En basit ve yaygın yöntemdir.
  • Least Request: En az aktif isteği olan servise öncelik verir. Dinamik yükler için daha verimlidir.
  • Ring Hash/Maglev: Belirli bir anahtara (örneğin kullanıcı kimliği) göre istekleri aynı servise yönlendirir. Bu, oturum sürekliliği gerektiren durumlarda faydalıdır.
  • Random: İstekleri rastgele bir şekilde dağıtır. Basit testler veya belirli senaryolar için kullanılabilir.

Bu algoritmalar, Envoy konfigürasyonunda kolayca ayarlanabilir. Örneğin, Least Request algoritmasını kullanmak için Envoy yapılandırmanızda aşağıdaki gibi bir bölüm ekleyebilirsiniz:


clusters:
- name: my_service_cluster
  connect_timeout: 0.25s
  type: LOGICAL_DNS
  lb_policy: LEAST_REQUEST # Yük dengeleme politikası
  load_assignment:
    cluster_name: my_service_cluster
    endpoints:
    - lb_endpoints:
      - endpoint:
          address:
            socket_address:
              address: my-service.default.svc.cluster.local
              port_value: 80
    

Bu yapılandırma, my_service_cluster adlı küme için en az istek politikasıyla yük dengeleme yapılacağını belirtir. Böylece, yoğunluk anlarında daha az meşgul olan servisler önceliklendirilir, bu da gecikmeleri azaltmaya yardımcı olur.

Sağlık Kontrolleri: Servislerin Yaşam Desteği

Yük dengelemenin etkin olabilmesi için, Envoy’un arka uç servislerinin sağlığını sürekli olarak izlemesi gerekir. Envoy, aktif ve pasif sağlık kontrollerini destekler:

  • Aktif Sağlık Kontrolü: Envoy, belirli aralıklarla arka uç servislerine istekler (HTTP, TCP, gRPC vb.) gönderir ve yanıtlarına göre servislerin durumunu belirler. Başarısızlık eşiği aşıldığında servis havuzdan çıkarılır.
  • Pasif Sağlık Kontrolü (Outlier Detection): Envoy, servislerden gelen her isteğin başarısını veya başarısızlığını izler. Belirli bir hata oranına veya gecikme eşiğine ulaşan servisleri otomatik olarak havuzdan çıkarır. Bu, özellikle anlık sorunlara karşı hızlı tepki verilmesini sağlar.

Bir örnekle outlier detection (aykırı değer tespiti) yapılandırmasını inceleyelim:


clusters:
- name: my_service_cluster
  connect_timeout: 0.25s
  type: LOGICAL_DNS
  lb_policy: ROUND_ROBIN
  health_checks: # Aktif sağlık kontrolü
  - timeout: 1s
    interval: 5s
    unhealthy_threshold: 3 # 3 ardışık başarısızlıkta sağlıksız kabul et
    healthy_threshold: 1 # 1 başarılı yanıtta sağlıklı kabul et
    http_health_check:
      path: /healthz
  outlier_detection: # Pasif sağlık kontrolü
    consecutive_5xx: 5 # 5 ardışık 5xx hatası alan servisi havuzdan çıkar
    interval: 10s
    base_ejection_time: 30s # Servisin havuzdan çıkarılacağı minimum süre
    max_ejection_percent: 50 # Aynı anda havuzdan çıkarılabilecek maks. servis yüzdesi
    

Bu yapılandırma, hem düzenli HTTP sağlık kontrolleri yapar hem de arka uç servislerinden gelen 5xx hatalarını izleyerek sağlıksız servisleri otomatik olarak ayıklar. Bu sayede, bir serviste yaşanan anlık bir hata, tüm kullanıcılara yansımaz ve sistem genelinde direnç artırılır.

Uzman İpucu: max_ejection_percent değerini dikkatli ayarlayın. Çok düşük bir değer, sistemin aşırı hassas olmasına neden olabilirken, çok yüksek bir değer, bir hatanın hızla yayılmasına yol açabilir. Genellikle %10-%50 arası bir değer tercih edilir.

Hata Toleransı ve Devre Kesici Modelleri: Kaskatlı Hataları Önlemek

Dağıtık sistemlerde en büyük risklerden biri, tek bir serviste başlayan bir hatanın domino etkisiyle diğer servislere yayılarak tüm sistemin çökmesine neden olmasıdır (kaskatlı hata). Envoy, bu tür senaryoları önlemek için devre kesici (circuit breaker), yeniden deneme (retry) ve zaman aşımı (timeout) gibi güçlü hata toleransı mekanizmaları sunar.

Devre Kesiciler: Aşırı Yüklenmeyi Engellemek

Devre kesici deseni, bir servisin aşırı yüklenmesini veya başarısız olmasını önlemek için kullanılır. Tıpkı elektrik devrelerindeki sigortalar gibi, belirli bir eşik aşıldığında (örneğin, açık bağlantı sayısı, bekleyen istek sayısı veya hata oranı), Envoy bu servise giden tüm trafiği keser. Bu, servisin toparlanması için zaman tanır ve diğer servislerin de aynı sorun nedeniyle etkilenmesini engeller. Envoy’da devre kesici yapılandırması oldukça esnektir:


clusters:
- name: my_service_cluster
  connect_timeout: 0.25s
  type: LOGICAL_DNS
  lb_policy: ROUND_ROBIN
  circuit_breakers:
    thresholds:
    - priority: DEFAULT # Varsayılan öncelik için
      max_connections: 1024 # Maksimum eşzamanlı bağlantı sayısı
      max_pending_requests: 1024 # Maksimum bekleyen istek sayısı
      max_requests: 1024 # Maksimum eşzamanlı istek sayısı
      max_retries: 3 # Maksimum yeniden deneme sayısı
    - priority: HIGH # Yüksek öncelikli istekler için (örneğin, kritik API'ler)
      max_connections: 2048
      max_pending_requests: 2048
      max_requests: 2048
      max_retries: 5
    

Bu yapılandırma, my_service_cluster için farklı öncelik seviyelerinde devre kesici eşikleri tanımlar. Belirtilen eşiklerden herhangi biri aşıldığında, Envoy o servise yeni istek göndermeyi durdurur ve genellikle bir 503 Service Unavailable hatası döndürür. Bu, arka uç servisinin kendi kendini iyileştirmesi için kritik bir pencere sağlar.

Yeniden Denemeler ve Zaman Aşımları: Geçici Hataları Yönetmek

Geçici ağ sorunları veya kısa süreli servis aksaklıkları, dağıtık sistemlerde sıkça karşılaşılan durumlardır. Bu tür durumlarda, isteği hemen başarısız saymak yerine, belirli bir gecikmeyle yeniden denemek, işlemin başarılı olma şansını artırır. Ancak, yeniden denemelerin ve zaman aşımlarının dikkatli bir şekilde yapılandırılması gerekir, aksi takdirde sistem üzerinde ek yük oluşturabilirler.

  • Zaman Aşımları (Timeouts): Bir isteğin belirli bir süre içinde yanıt vermemesi durumunda, Envoy isteği sonlandırır. Bu, uygulamanın sonsuza kadar bir yanıtı beklemesini engeller ve kaynakların gereksiz yere meşgul edilmesini önler. Hem bağlantı zaman aşımı hem de istek başına zaman aşımı tanımlanabilir.
  • Yeniden Denemeler (Retries): Bir istek başarısız olduğunda (örneğin, bir 5xx hatası veya ağ hatası), Envoy isteği otomatik olarak yeniden gönderebilir. Yeniden denemeler, belirli HTTP başlıklarına, hatalara veya hatta HTTP metotlarına göre koşullandırılabilir.

Aşağıdaki örnek, bir HTTP yönlendirme yapılandırmasında zaman aşımı ve yeniden deneme ayarlarını göstermektedir:


routes:
- match: { prefix: "/api/users" }
  route:
    cluster: user_service_cluster
    timeout: 5s # İstek için toplam zaman aşımı
    retry_policy:
      retry_on: 5xx,gateway-error,connect-failure # Hangi durumlarda yeniden dene
      num_retries: 3 # Kaç kez yeniden dene
      retry_priority:
        name: envoy.retry_host_predicates.previous_hosts # Daha önce denenen hostları atla
      per_try_timeout: 1s # Her deneme için maksimum süre
    

Bu konfigürasyonda, /api/users yoluna gelen istekler user_service_cluster‘a yönlendirilir. İstek için toplam 5 saniye zaman aşımı belirlenmiştir. Eğer servis 5xx hatası dönerse, ağ bağlantısı başarısız olursa veya bir gateway hatası oluşursa, Envoy isteği en fazla 3 kez yeniden deneyecektir. Her deneme için maksimum 1 saniye süre tanınır. Bu sayede, geçici ağ sorunları veya servis aksaklıkları kullanıcı deneyimini doğrudan olumsuz etkilemez.

Uzman İpucu: Yeniden denemeleri yapılandırırken “jitter” (rastgele gecikme) eklemeyi düşünebilirsiniz. Bu, birden fazla istemcinin aynı anda başarısız bir servise yeniden deneme yapmasını önleyerek, servisin toparlanma şansını artırır. Envoy’un varsayılan yeniden deneme politikaları genellikle jitter’ı içerir.

Gözlemlenebilirlik ve İzleme: Sorunları Erken Teşhis Etmek

Dirençli bir sistemin olmazsa olmazı, sorunları oluşmadan önce veya oluştuğu anda tespit edebilme yeteneğidir. Envoy, kapsamlı gözlemlenebilirlik özellikleri sayesinde sistemin her katmanında neler olup bittiğini anlamamızı sağlar. Metrikler, dağıtık izleme ve erişim günlükleri, bu konuda bize ışık tutan temel araçlardır.

Metrikler: Sistemin Nabzını Tutmak

Envoy, trafikle ilgili yüzlerce metrik üretir (örneğin, toplam istek sayısı, hata oranları, gecikme süreleri, bağlantı sayısı). Bu metrikler Prometheus gibi metrik toplama sistemleri tarafından kolayca çekilebilir ve Grafana gibi araçlarla görselleştirilebilir. Metrikler sayesinde, bir servisin sağlığı, performansı ve yük durumu hakkında anlık bilgi edinebiliriz. Bu, potansiyel sorunları proaktif olarak tespit etmek ve müdahale etmek için kritik öneme sahiptir.

Örnek bir metrik yapılandırması:


static_resources:
  listeners:
  - name: listener_0
    address:
      socket_address: { address: 0.0.0.0, port_value: 10000 }
    filter_chains:
    - filters:
      - name: envoy.filters.network.http_connection_manager
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
          stat_prefix: ingress_http
          http_filters:
          - name: envoy.filters.http.router
            typed_config: {}
          route_config:
            name: local_route
            virtual_hosts:
            - name: backend
              domains: ["*"]
              routes:
              - match: { prefix: "/" }
                route: { cluster: my_service_cluster }
admin:
  access_log_path: "/dev/stdout"
  address:
    socket_address: { address: 0.0.0.0, port_value: 8001 }
    

Bu yapılandırma, Envoy’un yönetici arayüzünü (admin interface) 8001 portunda açar. Bu arayüz üzerinden /stats/prometheus yoluna yapılan bir istek, tüm metrikleri Prometheus formatında döndürür. Bu metrikleri izleyerek, örneğin cluster.my_service_cluster.upstream_rq_5xx gibi metriklerle servislerinizdeki 5xx hata oranlarını anlık olarak takip edebilirsiniz.

Dağıtık İzleme (Distributed Tracing): İsteklerin Yolculuğunu Takip Etmek

Mikroservis mimarilerinde bir isteğin birden fazla servisten geçmesi yaygın bir durumdur. Bu karmaşık akış içinde bir sorun çıktığında, sorunun hangi serviste veya hangi aşamada olduğunu tespit etmek zorlaşabilir. Dağıtık izleme, bir isteğin sistem içindeki tüm yolculuğunu uçtan uca takip etmeyi ve her bir serviste ne kadar zaman harcandığını görmeyi sağlar. Envoy, Zipkin, Jaeger veya OpenTelemetry gibi izleme sistemleriyle entegrasyonu destekler. Envoy, gelen istek başlıklarını inceleyerek veya yeni izleme başlıkları ekleyerek izleme bağlamını (tracing context) otomatik olarak yayabilir.

Envoy ile dağıtık izlemeyi etkinleştirmek için HTTP Connection Manager filtresinde izleme sağlayıcısını belirtmeniz yeterlidir:


http_filters:
- name: envoy.filters.network.http_connection_manager
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
    stat_prefix: ingress_http
    tracing:
      provider:
        name: envoy.tracers.zipkin
        typed_config:
          "@type": type.googleapis.com/envoy.extensions.trace.v3.ZipkinConfig
          collector_cluster: zipkin
          collector_endpoint: "/api/v2/spans"
          collector_endpoint_version: HTTP_V2
          trace_id_128bit: true
    http_filters:
    - name: envoy.filters.http.router
      typed_config: {}
    

Bu yapılandırma, Envoy’un Zipkin ile izleme yapmasını sağlar. zipkin adlı bir kümenin Zipkin sunucusuna işaret etmesi gerekir. Bu sayede, her istek için bir izleme (trace) oluşturulur ve isteğin hangi servislerden geçtiği, her serviste ne kadar zaman harcandığı gibi detaylar izleme sisteminde görselleştirilebilir. Bu, performans darboğazlarını ve hata kaynaklarını hızla tespit etmek için paha biçilmez bir araçtır.

Erişim Günlükleri (Access Logs): Detaylı Trafik Kayıtları

Envoy, her istek için detaylı erişim günlükleri üretebilir. Bu günlükler, isteğin ne zaman geldiği, hangi yola gittiği, hangi servise yönlendirildiği, HTTP durumu, gecikme süresi ve diğer birçok bilgiyi içerir. Bu günlükler, Elastic Stack (Elasticsearch, Logstash, Kibana) gibi günlük yönetim sistemlerine aktarılarak merkezi olarak depolanabilir, aranabilir ve analiz edilebilir. Erişim günlükleri, güvenlik denetimleri, sorun giderme ve performans analizi için vazgeçilmezdir.

Örnek bir erişim günlüğü yapılandırması:


http_filters:
- name: envoy.filters.network.http_connection_manager
  typed_config:
    "@type": type.googleapis.com/envoy.extensions.filters.network.http_connection_manager.v3.HttpConnectionManager
    stat_prefix: ingress_http
    access_log:
    - name: envoy.access_loggers.stdout
      typed_config:
        "@type": type.googleapis.com/envoy.extensions.access_loggers.stream.v3.StdoutAccessLog
        log_format:
          text_format: "[%START_TIME%] \"%REQ(:METHOD)% %REQ(X-ENVOY-ORIGINAL-PATH?:PATH)% %PROTOCOL%\" %RESPONSE_CODE% %RESPONSE_FLAGS% %BYTES_RECEIVED% %BYTES_SENT% %DURATION% \"%REQ(X-FORWARDED-FOR)%\" \"%REQ(USER-AGENT)%\" \"%REQ(X-REQUEST-ID)%\" \"%REQ(:AUTHORITY)%\" \"%UPSTREAM_HOST%\"\n"
    http_filters:
    - name: envoy.filters.http.router
      typed_config: {}
    

Bu yapılandırma, Envoy’un standart çıktıya (stdout) belirli bir formatta erişim günlükleri yazmasını sağlar. Bu günlükler daha sonra bir günlük toplama ajanı (örneğin Fluentd veya Filebeat) tarafından toplanıp merkezi bir günlük sistemine gönderilebilir. Günlük formatını kendi ihtiyaçlarınıza göre özelleştirebilirsiniz. Bu sayede, herhangi bir anormallik durumunda hızlıca kök neden analizi yapabilir ve sistemin direncini daha da artırabilirsiniz.

İleri Düzey Direnç Teknikleri ve Optimizasyonlar: Daha da İyisi Nasıl Yapılır?

Envoy’un temel direnç özelliklerinin yanı sıra, sisteminizi daha da sağlam hale getirecek ileri düzey teknikler ve optimizasyonlar mevcuttur. Bu bölümde, dinamik konfigürasyon, kaos mühendisliği ve trafik gölgeleme gibi konulara odaklanarak, Envoy’dan maksimum verimi nasıl alabileceğinizi keşfedeceğiz. Bu teknikler, özellikle büyük ölçekli ve karmaşık dağıtık sistemlerde kritik öneme sahiptir.

Dinamik Konfigürasyon ve Kontrol Düzlemi: Esneklik ve Otomasyon

Manuel olarak Envoy konfigürasyon dosyalarını güncellemek ve Envoy’u yeniden başlatmak, küçük ortamlar için yönetilebilir olabilir. Ancak, yüzlerce veya binlerce Envoy örneğinin çalıştığı büyük ölçekli mikroservis mimarilerinde bu yaklaşım sürdürülemez hale gelir. İşte bu noktada dinamik konfigürasyon ve bir kontrol düzlemi (control plane) devreye girer.

Envoy, xDS API’leri (Discovery Service API’leri) aracılığıyla dinamik olarak yapılandırılabilir. Bu API’ler şunları içerir:

  • CDS (Cluster Discovery Service): Envoy’un bağlanacağı küme (cluster) listesini dinamik olarak sağlar.
  • EDS (Endpoint Discovery Service): Kümelerdeki arka uç servis örneklerinin (endpoint) listesini dinamik olarak sağlar.
  • LDS (Listener Discovery Service): Envoy’un dinleyeceği portları ve bu portlara gelen trafiği işleyecek filtre zincirlerini dinamik olarak sağlar.
  • RDS (Route Discovery Service): Gelen isteklere göre trafiğin hangi kümelere yönlendirileceğini belirleyen yönlendirme kurallarını dinamik olarak sağlar.
  • SDS (Secret Discovery Service): TLS sertifikaları ve özel anahtarlar gibi sırları dinamik olarak sağlar.

Bir kontrol düzlemi (örneğin Istio, App Mesh veya kendi geliştirdiğiniz bir çözüm), bu xDS API’lerini kullanarak Envoy örneklerine çalışma zamanında konfigürasyon güncellemeleri gönderir. Bu, servis keşfi, yük dengeleme politikaları, devre kesici eşikleri veya yönlendirme kuralları gibi ayarların, Envoy’u yeniden başlatmaya gerek kalmadan anında değiştirilebilmesini sağlar. Bu esneklik, özellikle gecikme-kritik sistemlerde hızlı hata toleransı ve adaptasyon için kritik öneme sahiptir. Örneğin, bir servis kümesinde performans sorunları yaşandığında, kontrol düzlemi otomatik olarak o kümedeki trafik yüzdesini düşürebilir veya alternatif bir kümeye yönlendirebilir.


dynamic_resources:
  ads_config: # Agnostic Discovery Service (ADS) konfigürasyonu
    api_type: GRPC
    grpc_services:
    - envoy_grpc:
        cluster_name: xds_cluster
  cds_config: {ads: {}}
  lds_config: {ads: {}}
  rds_config: {ads: {}}
  eds_config: {ads: {}}
static_resources:
  clusters:
  - name: xds_cluster
    connect_timeout: 1s
    type: STATIC
    lb_policy: ROUND_ROBIN
    load_assignment:
      cluster_name: xds_cluster
      endpoints:
      - lb_endpoints:
        - endpoint:
            address:
              socket_address: { address: control-plane.default.svc.cluster.local, port_value: 8080 }
    

Bu örnek, Envoy’un bir kontrol düzleminden (control-plane.default.svc.cluster.local:8080 adresinde çalışan) dinamik konfigürasyonları (CDS, LDS, RDS, EDS) alacak şekilde yapılandırıldığını gösterir. Bu, Envoy’un Kubernetes gibi dinamik ortamlarda sorunsuz bir şekilde çalışmasını ve servis ağı içindeki değişikliklere anında adapte olmasını sağlar.

Chaos Engineering ile Direnç Testi: Sisteminizi Bilinçli Olarak Kırmak

Sistemlerinizin dirençli olduğunu iddia etmek bir şeydir, bunu kanıtlamak ise bambaşka bir şey. Kaos Mühendisliği (Chaos Engineering), sistemlerinizdeki zayıf noktaları proaktif olarak ortaya çıkarmak için üretim ortamında (veya üretime yakın ortamlarda) kontrollü ve kasıtlı arızalar enjekte etme pratiğidir. Bu, Envoy’un devre kesicilerinin, yeniden denemelerinin ve yük dengeleme politikalarının gerçek dünya koşullarında ne kadar iyi çalıştığını test etmek için mükemmel bir yöntemdir.

Envoy, doğrudan kaos enjeksiyonu için yerleşik özellikler sunmasa da, onunla birlikte çalışan araçlar (örneğin, Chaos Mesh, LitmusChaos) kullanılarak testler yapılabilir. Örneğin:

  • Belirli bir servise giden ağ gecikmesini artırın ve Envoy’un zaman aşımlarının ve yeniden denemelerinin nasıl tepki verdiğini gözlemleyin.
  • Bir servisin hata oranını kasıtlı olarak artırın (örneğin, sürekli 5xx hataları döndürmesini sağlayın) ve Envoy’un devre kesicilerinin ve outlier detection mekanizmasının ne zaman ve nasıl devreye girdiğini kontrol edin.
  • Bir servisi tamamen kapatın ve Envoy’un trafiği diğer sağlıklı servislere yönlendirip yönlendirmediğini, kullanıcıların bundan nasıl etkilendiğini analiz edin.

Kaos mühendisliği, sadece hataları bulmakla kalmaz, aynı zamanda operasyonel ekiplerin bu hatalara nasıl tepki vereceğini öğrenmelerini ve otomasyon süreçlerini geliştirmelerini sağlar. Bu, gecikme-kritik sistemlerde proaktif direnç geliştirmek için vazgeçilmez bir adımdır. Unutmayın, sisteminiz ne kadar dirençli olursa olsun, onu test etmeden bu konuda tam bir güvene sahip olamazsınız. Bu nedenle, kaos mühendisliği pratiklerini düzenli olarak uygulamak, sisteminizin gerçek dünya senaryolarına karşı dayanıklılığını sürekli olarak artıracaktır.

Trafik Gölgeleme (Traffic Shadowing): Yeni Sürümleri Güvenle Test Etmek

Yeni bir servis sürümünü üretim ortamına dağıtmak her zaman risklidir. Trafik gölgeleme, bu riski minimize etmek için kullanılan güçlü bir tekniktir. Envoy, gelen canlı üretim trafiğinin bir kopyasını alır ve bu kopyayı yeni sürümünü test ettiğiniz bir “gölge” servisine gönderir. Orijinal istek, normalde olduğu gibi canlı servise yönlendirilir ve kullanıcıya yanıt verir. Gölge servise gönderilen istek ise sadece test amaçlıdır, yani gölge servisten gelen yanıtlar kullanıcılara gönderilmez.

Bu sayede, yeni sürümün üretim trafiği altında nasıl davrandığını, performansını, hata oranlarını ve kaynak tüketimini gözlemleyebilirsiniz. Herhangi bir sorun yaşanırsa, bu durum canlı kullanıcıları etkilemez çünkü yanıtlar orijinal servisten gelmektedir. Bu, yeni sürümleri güvenle test etmenize ve potansiyel sorunları üretim ortamına çıkmadan önce tespit etmenize olanak tanır. Özellikle düşük gecikmeli sistemlerde, yeni sürümlerin performans üzerindeki etkisini önceden görmek kritik öneme sahiptir.

Envoy konfigürasyonunda trafik gölgeleme şu şekilde ayarlanabilir:


routes:
- match: { prefix: "/api/products" }
  route:
    cluster: product_service_v1 # Canlı servis
  request_mirror_policy:
    cluster: product_service_v2_shadow # Gölge servis
    runtime_fraction:
      denominator: HUNDRED
      numerator: 100 # Gelen trafiğin %100'ünü gölge servise yansıt
    

Bu yapılandırma, /api/products yoluna gelen tüm isteklerin hem product_service_v1 (canlı servis) hem de product_service_v2_shadow (gölge servis) kümelerine yönlendirileceğini belirtir. Gölge servisten gelen yanıtlar göz ardı edilir. Bu sayede, product_service_v2_shadow‘un üretim yükü altında nasıl performans gösterdiğini izleyebilir ve herhangi bir regresyonu canlı kullanıcıları etkilemeden tespit edebilirsiniz.

Gerçek Dünya Senaryosu: Bir E-ticaret Platformunda Envoy Direnci

Şimdiye kadar öğrendiğimiz Envoy özelliklerini, gerçek bir e-ticaret platformu üzerinden somutlaştıralım. Düşük gecikme, bir e-ticaret sitesi için hayati önem taşır; çünkü her milisaniyelik gecikme, potansiyel bir satış kaybı anlamına gelebilir. Bu senaryoda, Envoy’u kullanarak bir e-ticaret uygulamasının direncini nasıl artırabileceğimizi inceleyeceğiz.

Vaka Analizi: Yüksek Trafikli Bir E-ticaret Sitesi

Bir e-ticaret platformumuz olduğunu varsayalım. Bu platform, ürün kataloğu, kullanıcı profilleri, sepet ve ödeme gibi mikroservislerden oluşuyor. Kara Cuma gibi yoğun kampanya dönemlerinde trafik aniden on katına çıkabiliyor. Bu tür dönemlerde sistemin yavaşlaması veya çökmesi, doğrudan milyonlarca dolarlık kayba yol açabilir. Bu nedenle, her bir servisin ve servisler arası iletişimin maksimum dirençle çalışması gerekiyor.

Karşılaşılan Sorunlar:

  1. Ödeme Servisi Aşırı Yüklenmesi: Yoğunluk anında ödeme servisi yavaşlıyor ve hata oranları artıyor. Bu, kullanıcıların ödeme yapamamasına ve sepet terk oranının yükselmesine neden oluyor.
  2. Katalog Servisi Gecikmeleri: Ürün detay sayfaları yavaş yükleniyor, çünkü katalog servisi bazen dış bir stok API’sine uzun süre yanıt veremiyor.
  3. Anlık Erişim Sorunları: Bazen belirli bir bölgedeki kullanıcılar, ağ sorunları nedeniyle ana siteye erişimde zorluk yaşıyor.
  4. Yeni Özellik Dağıtım Riski: Yeni bir arama algoritması devreye alındığında, üretim ortamında performans düşüşleri yaşanmasından endişe ediliyor.

Envoy ile Çözümler:

  • Ödeme Servisi İçin Devre Kesiciler ve Yük Dengeleme:

    Envoy, ödeme servisine gelen eşzamanlı istek sayısını ve bekleyen istekleri izler. Eğer bu eşikler aşılırsa, Envoy devre kesiciyi tetikler ve ödeme servisine yeni istek göndermeyi durdurur. Bu, servisin toparlanması için zaman tanır. Ayrıca, LEAST_REQUEST yük dengeleme politikası ile daha az meşgul olan ödeme servisi örneklerine öncelik verilir. Outlier detection ile hata oranı yüksek olan ödeme servisi örnekleri otomatik olarak havuzdan çıkarılır.

    
    clusters:
    - name: payment_service_cluster
      connect_timeout: 0.5s
      type: LOGICAL_DNS
      lb_policy: LEAST_REQUEST
      circuit_breakers:
        thresholds:
        - priority: DEFAULT
          max_requests: 500 # Maks. eşzamanlı istek
          max_pending_requests: 100 # Maks. bekleyen istek
      outlier_detection:
        consecutive_5xx: 3
        base_ejection_time: 60s
        
  • Katalog Servisi İçin Zaman Aşımları ve Yeniden Denemeler:

    Katalog servisi dış API’ye bağımlı olduğu için, bu API’nin yavaşlaması tüm katalog servisini etkileyebilir. Envoy, katalog servisine yapılan isteklere bir zaman aşımı uygular. Eğer dış API belirli bir süre içinde yanıt vermezse, Envoy isteği sonlandırır ve isteği başka bir katalog servisi örneğine yeniden dener. Bu, kullanıcının uzun süre beklemesini engeller ve geçici dış servis sorunlarının etkisini azaltır.

    
    routes:
    - match: { prefix: "/products" }
      route:
        cluster: catalog_service_cluster
        timeout: 3s # Toplam istek zaman aşımı
        retry_policy:
          retry_on: connect-failure,gateway-error,5xx
          num_retries: 2
          per_try_timeout: 1s # Her deneme için zaman aşımı
        
  • Anlık Erişim Sorunları İçin Coğrafi Yük Dengeleme (Global Load Balancing):

    Envoy, birden fazla coğrafi bölgede dağıtılmış servis kümeleri arasında yük dengeleme yapabilir. Bu, bir bölgedeki ağ kesintisi veya servis arızası durumunda trafiğin otomatik olarak başka bir sağlıklı bölgeye yönlendirilmesini sağlar. Bu, genellikle bir kontrol düzlemi (örneğin Kubernetes ingress controller veya Istio) ile entegre edilerek global trafik yönetimi sağlanır.

  • Yeni Özellik Dağıtım Riski İçin Trafik Gölgeleme:

    Yeni arama algoritmasını içeren search_service_v2 sürümü, canlı kullanıcıları etkilemeden test edilmek istenir. Envoy, mevcut search_service_v1‘e gelen tüm arama isteklerinin bir kopyasını search_service_v2_shadow kümesine yansıtır. Bu sayede, yeni algoritmanın üretim trafiği altındaki performansını ve doğruluğunu izleyebiliriz. Eğer beklentileri karşılarsa, kademeli olarak canlı trafiği search_service_v2‘ye yönlendirebiliriz.

    
    routes:
    - match: { prefix: "/search" }
      route:
        cluster: search_service_v1
      request_mirror_policy:
        cluster: search_service_v2_shadow
        runtime_fraction:
          denominator: HUNDRED
          numerator: 50 # Trafiğin %50'sini gölgeye yansıt
        

Bu senaryo, Envoy’un farklı direnç özelliklerinin bir e-ticaret platformunda nasıl bir araya gelerek sistemin genel güvenilirliğini ve performansını artırdığını göstermektedir. Bu sayede, yoğun kampanya dönemlerinde bile platform kesintisiz çalışmaya devam eder ve müşteri memnuniyeti en üst düzeyde tutulur.

Mobil Uyumluluk İçin Envoy ve Tasarım İpuçları

Günümüzde mobil cihazlar üzerinden internete erişim, masaüstü bilgisayarları geride bırakmış durumda. Bu nedenle, Envoy’u kullanan sistemlerin mobil uyumluluğu da göz önünde bulundurması gerekir. Mobil kullanıcılar genellikle daha düşük bant genişliğine, daha yüksek gecikmeye ve kesintili ağ bağlantılarına sahiptir. Envoy, bu zorlukları aşmak için bazı önemli avantajlar sunar ve mobil uyumlu bir tasarım için bazı ipuçları verebiliriz.

Mobil Kullanıcı Deneyimi ve Envoy’un Rolü

Mobil kullanıcılar için hız ve güvenilirlik kritik öneme sahiptir. Yavaş yüklenen bir uygulama veya sürekli kesintiye uğrayan bir servis, kullanıcıların uygulamayı terk etmesine neden olabilir. Envoy, mobil uygulamalarınızın arka uç servisleriyle olan iletişimini optimize ederek bu sorunları hafifletmeye yardımcı olur:

  • HTTP/2 ve gRPC Desteği: Envoy, HTTP/2 ve gRPC gibi daha verimli protokolleri destekler. Bu protokoller, özellikle mobil ağlarda daha az bant genişliği tüketir ve daha düşük gecikme ile daha iyi performans sunar. Mobil uygulamalarınızın Envoy üzerinden bu protokolleri kullanması, ağ performansını önemli ölçüde artırabilir.
  • Verimli Yük Dengeleme: Mobil cihazlardan gelen istekler genellikle daha dalgalı bir yapıya sahiptir. Envoy’un akıllı yük dengeleme algoritmaları (örneğin Least Request), arka uç servislerinin aşırı yüklenmesini önleyerek mobil kullanıcılar için daha tutarlı bir yanıt süresi sağlar.
  • Hata Toleransı: Mobil ağlar daha kararsız olabileceği için, geçici ağ kesintileri veya arka uç servislerindeki anlık sorunlar daha sık yaşanabilir. Envoy’un yeniden deneme ve devre kesici mekanizmaları, bu tür hataları mobil uygulamaya yansıtmadan yönetir, böylece uygulamanın daha dirençli görünmesini sağlar.
  • Önbellekleme (Caching): Envoy, HTTP yanıtlarını önbelleğe alarak tekrarlayan istekler için arka uç servisine gitme ihtiyacını ortadan kaldırabilir. Bu, mobil kullanıcılar için yanıt sürelerini önemli ölçüde kısaltır ve bant genişliği kullanımını azaltır.

Mobil Uyumluluk İçin Tasarım İpuçları

Envoy ile birlikte, mobil uygulamalarınızın genel deneyimini iyileştirmek için aşağıdaki tasarım ipuçlarını göz önünde bulundurabilirsiniz:

  1. API Gateway Olarak Envoy Kullanımı: Mobil uygulamalar genellikle masaüstü uygulamalarından farklı API ihtiyaçlarına sahiptir. Envoy’u bir API Gateway olarak kullanarak, mobil uygulamalara özel API uç noktaları oluşturabilir, veri formatlarını dönüştürebilir veya mobil cihazlar için optimize edilmiş yanıtlar sunabilirsiniz.
  2. Resim ve Medya Optimizasyonu: Envoy’un filtre zincirlerini kullanarak gelen resim isteklerini dinamik olarak sıkıştırabilir veya mobil cihazın ekran boyutuna göre yeniden boyutlandırabilirsiniz. Bu, mobil veri kullanımını azaltır ve yükleme sürelerini hızlandırır.
  3. Edge Caching (Kenar Önbellekleme): Envoy’u kullanıcıya coğrafi olarak daha yakın bir noktada (CDN’lerde veya kenar lokasyonlarında) konuşlandırarak, statik içeriklerin veya sık erişilen API yanıtlarının önbelleğe alınmasını sağlayabilirsiniz. Bu, gecikmeyi azaltır ve mobil kullanıcılar için daha hızlı bir deneyim sunar.
  4. Aşamalı Yükleme (Progressive Loading): Özellikle medya içerikleri için, düşük kaliteli bir sürümü önce yükleyip, ağ bağlantısı iyileştikçe yüksek kaliteli sürüme geçiş yapmak, mobil kullanıcı deneyimini artırır. Envoy, bu tür akışları yönetmek için kullanılabilir.
  5. Hata Mesajlarını Kullanıcı Dostu Hale Getirme: Envoy, arka uçtan gelen karmaşık hata mesajlarını yakalayıp mobil uygulamalar için daha anlaşılır ve kullanıcı dostu hata mesajlarına dönüştürebilir. Bu, kullanıcıların sorunlarla karşılaştığında daha az hayal kırıklığı yaşamasını sağlar.

Mobil uyumluluk, sadece kullanıcı arayüzünün küçük ekranlara sığması anlamına gelmez; aynı zamanda mobil ağların kısıtlamalarına ve kullanıcı beklentilerine uygun bir performans ve güvenilirlik sunmak demektir. Envoy, bu hedeflere ulaşmanızda önemli bir rol oynayabilir.

Sonuç ve Sıkça Sorulan Sorular

Envoy Proxy, düşük gecikmeli ve yüksek performanslı sistemlerde direnci artırmak için kapsamlı bir çözüm sunar. Trafik yönetimi, akıllı yük dengeleme, gelişmiş hata toleransı mekanizmaları (devre kesiciler, yeniden denemeler, zaman aşımları) ve derinlemesine gözlemlenebilirlik özellikleri sayesinde, sistemleriniz beklenmedik aksaklıklara karşı daha dayanıklı hale gelir. Dinamik konfigürasyonlar ve kaos mühendisliği gibi ileri düzey teknikler, bu direnci daha da pekiştirirken, mobil uyumluluk için yapılan optimizasyonlar geniş bir kullanıcı kitlesine ulaşmanızı sağlar.

Envoy’u doğru bir şekilde yapılandırarak ve sistem mimarinize entegre ederek, sadece hataları izole etmekle kalmaz, aynı zamanda kullanıcılarınıza kesintisiz ve hızlı bir deneyim sunarsınız. Bu, günümüzün rekabetçi dijital dünyasında iş sürekliliği ve müşteri memnuniyeti için vazgeçilmez bir yatırımdır. Unutmayın, dirençli bir sistem inşa etmek sürekli bir çabadır ve Envoy bu yolculukta sizin en güçlü müttefiklerinizden biri olacaktır.

Sıkça Sorulan Sorular

  1. Envoy’u kullanmak, sistemime ek bir gecikme getirir mi?

    Envoy, C++ ile yazılmış yüksek performanslı bir proxy olduğu için, genellikle milisaniye düzeyinde çok düşük bir ek gecikme (overhead) getirir. Doğru yapılandırıldığında ve optimize edildiğinde, sağladığı trafik yönetimi ve hata toleransı avantajları, bu küçük gecikmeyi fazlasıyla telafi eder ve sistemin genel performansını ve güvenilirliğini artırır.

  2. Envoy’un devre kesici ve yeniden deneme özellikleri ne zaman kullanılmalı?

    Devre kesiciler, bir arka uç servisinin aşırı yüklenmesini veya başarısız olmasını önlemek için kullanılır; servisin kendi kendini iyileştirmesi için zaman tanır. Yeniden denemeler ise, geçici ağ sorunları veya anlık servis aksaklıkları gibi kısa süreli ve düzelme potansiyeli olan hatalar için idealdir. Her iki özellik de kaskatlı hataları önlemek ve sistemin direncini artırmak için kritik öneme sahiptir.

  3. Envoy’un sağlık kontrolleri aktif ve pasif olarak nasıl farklılaşır?

    Aktif sağlık kontrolleri, Envoy’un arka uç servisine düzenli olarak özel sağlık kontrol istekleri göndererek durumunu sorgulamasıdır. Pasif sağlık kontrolleri (outlier detection) ise, servise giden normal trafikten gelen yanıtları izleyerek (örneğin, ardışık 5xx hataları) sağlıksız servisleri otomatik olarak havuzdan çıkarmasıdır. Her ikisi de sağlıklı servis havuzunu korumak için birlikte kullanılır.

  4. Dinamik konfigürasyon için bir kontrol düzlemi kullanmak şart mı?

    Küçük ve statik ortamlar için manuel konfigürasyon dosyaları yeterli olabilir. Ancak, mikroservis mimarilerinde veya dinamik bulut ortamlarında (Kubernetes gibi) servislerin sürekli değiştiği durumlarda, bir kontrol düzlemi (örneğin Istio) kullanmak neredeyse zorunludur. Kontrol düzlemi, Envoy örneklerini otomatik olarak yapılandırarak ölçeklenebilirlik, esneklik ve yönetim kolaylığı sağlar.

  5. Envoy ile trafik gölgeleme yaparken nelere dikkat etmeliyim?

    Trafik gölgeleme, yeni sürümleri güvenle test etmek için harika bir araçtır. Ancak, gölge servisin üretim veritabanına yazmadığından veya kritik yan etkileri olmadığından emin olmalısınız. Gölge servisin sadece okuma işlemleri yapması veya ayrı bir test veritabanı kullanması tavsiye edilir. Ayrıca, gölge servisin metriklerini ve günlüklerini dikkatle izleyerek performans ve hata davranışlarını analiz etmelisiniz.

Yorumlar
İçeriği beğendiniz mi? Bir tartışma başlatın veya görüşlerinizi paylaşın.
Yorum Yaz

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Gönder

E-posta Bülteni
Yazılım Topluluğuna Katılın
En son güncellemeleri, yaratıcı ipuçlarını ve özel kaynakları doğrudan e-posta kutunuza alın. Tasarım ve inovasyonun geleceğini birlikte keşfedelim.
Mobil sürümden çık