Ana Sayfa/Java & Kurumsal Mimari
Java & Kurumsal Mimari·6 Kasım 2026·10 dk okuma

Spring Cloud 2026.0.0-RC2 ‘Paddington’ Mimarisi, OpenJDK Devoxx ‘Ask the Architects’ & JDK 27 STW GC Modernizasyonu ve Temporal ‘Agent Harness’

Spring Boot 4.2.0-RC2 tabanlı Spring Cloud 2026.0.0-RC2 (Paddington) sürümündeki Gateway Web MVC LocalResponseCache ve Config GCS yeniliklerinin, OpenJDK Devoxx 'Ask the Architects' oturumu ile JDK 27 G1/Parallel/Serial GC 'Atomic<T>' (JDK-8367013) ve JEP 401 altyapı dönüşümünün ve Temporal 'Agent Harness' dayanıklı yürütme mimarisinin teknik analizi.

Spring Cloud 2026.0.0-RC2 ‘Paddington’ Mimarisi, OpenJDK Devoxx ‘Ask the Architects’ & JDK 27 STW GC Modernizasyonu ve Temporal ‘Agent Harness’

Kurumsal Java ve Bulut-Yerli Ekosistemde Üç Katmanlı Mimari Evrim

Kurumsal Java ekosistemi; bulut-yerli mikroservis yönlendirme katmanı, sanal makine (JVM) bellek yönetimi çekirdeği ve dağıtık iş akışı orkestrasyonu ekseninde eşzamanlı bir modernizasyon sürecinden geçiyor. Spring Cloud 2026.0.0-RC2 (Paddington) sürüm treninin Spring Boot 4.2.0-RC2 temelinde yayımlanması, Devoxx Belgium 2026 kapsamında gerçekleştirilen Inside Java 'Ask the Architects' (Bölüm 74) oturumu ile Thomas Schatzl tarafından paylaşılan JDK 27 G1/Parallel/Serial GC mühendislik raporu ve Josh Long ile Cornelia Davis'in (Temporal.io) ele aldığı Dayanıklı Yürütme (Durable Execution) & Temporal Agent Harness mimarisi, modern kurumsal sistemlerin omurgasını yeniden tanımlıyor.

Bu teknik bültende; Spring Cloud Paddington sürüm trenindeki ağ geçidi ve konfigürasyon yenilikleri, OpenJDK mimarlarının Project Valhalla (JEP 401) ve HotSpot STW çöp toplayıcı (JDK-8367013 Atomic<T>, JEP 523) seviyesinde gerçekleştirdiği yapısal değişiklikler ve otonom ajan iş akışlarında olay kaynaklı (event-sourced) dayanıklı yürütme desenleri incelenmektedir.


1. Spring Cloud 2026.0.0-RC2 ('Paddington'): Gateway Web MVC Önbellekleme, GCS Config Depolama ve OpenFeign Derin Serileştirme

Spring Boot 4.2.0-RC2 sürümü üzerine inşa edilen Spring Cloud 2026.0.0-RC2 (Paddington), mikroservis ağ geçidi performansını, çoklu bulut konfigürasyon yönetimini ve bildirimsel (declarative) HTTP istemci serileştirmesini doğrudan iyileştiren üç temel bileşen güncellemesi sunuyor:

  1. Spring Cloud Gateway (5.1.0-RC2) — Server Web MVC İçin LocalResponseCache Filtresi (#4249):
    • Daha önce yalnızca reaktif (WebFlux) ağ geçidi yığınında yerleşik olarak sunulan yerel yanıt önbellekleme yeteneği, LocalResponseCache filtresiyle Spring Cloud Gateway Server Web MVC mimarisine taşındı.
    • JDK sanal iş parçacıkları (Virtual Threads) üzerinde çalışan senkron Servlet/Web MVC tabanlı API ağ geçitleri, harici bir dağıtık önbellek katmanına (Redis vb.) ağ sıçraması yapmadan, Caffeine tabanlı bellek-içi önbellekleme ile Cache-Control kurallarına uygun olarak aşağı akış (downstream) yanıtlarını milisaniye altı gecikmeyle sunabiliyor.
  2. Spring Cloud Config (5.1.0-RC2) — Google Cloud Storage (GCS) Arka Ucu ve Doğrudan Resource Erişimi (#3343, #3355):
    • Config Server için yerel Google Cloud Storage (GCS) arka uç depo desteği (#3343) eklendi; böylece Git veya AWS S3'e ek olarak GCS kovaları (buckets) üzerinden versiyonlu konfigürasyon yönetimi standartlaştı.
    • Ayrıca düz metin (plain text) ve ikili (binary) konfigürasyon dosyalarının Config Server üzerinden doğrudan Spring Resource soyutlaması olarak çekilmesini sağlayan uç nokta geliştirmesi (#3355) devreye alındı.
  3. Spring Cloud OpenFeign (5.1.0-RC2) — @SpringQueryMap İç İçe Nesne Serileştirmesi (#1448):
    • Karmaşık arama ve filtreleme DTO'larında @SpringQueryMap anotasyonu kullanıldığında, alt seviyedeki iç içe nesneler (nested objects) artık hiyerarşik sorgu parametreleri (filter.page.size=50&filter.sort.field=createdAt) olarak otomatik ayrıştırılıp HTTP isteğine ekleniyor.

2. OpenJDK Devoxx 'Ask the Architects' (Bölüm 74) ve JDK 27 G1/Parallel/Serial GC Modernizasyonu

Oracle Java Platform Grubu mimarları Gavin Bierman, Maurizio Cimadamore, Alan Bateman, Viktor Klang, Per-Ake Minborg, Ron Pressler, David Simms ve Georges Saab'ın katılımıyla Nicolai Parlog moderatörlüğünde kaydedilen Inside Java Podcast 74. Bölüm ('Ask the Architects at Devoxx'), dilin ve çalışma zamanının önümüzdeki yıllardaki mimari rotasına ışık tuttu. Oturumda özellikle Project Valhalla (JEP 401 Değer Sınıfları), kimliksiz değişmez veri yapılarında durum güncelleme (withers / derived instance creation), Foreign Function & Memory (FFM) API'si üzerinden yerel yapay zeka çalışma zamanlarıyla entegrasyon ve sanal iş parçacığı zamanlayıcılarının evrimi detaylandırıldı.

Bu mimari vizyonun JVM çekirdeğindeki somut yansıması, HotSpot GC ekibinden Thomas Schatzl tarafından yayımlanan JDK 27 G1/Parallel/Serial GC teknik raporunda görülüyor. JDK 27 geliştirme döngüsünde çözümlenen yaklaşık 350 GC alt bileşen kaydının temel odak noktaları şunlardır:

  • JDK-8367013 ile Atomic<T> Soyutlamasına Geçiş: HotSpot C++ kod tabanında iş parçacıkları arası paylaşılan değişkenler için yıllardır kullanılan dağınık volatile tanımlamaları ve düşük seviyeli AtomicAccess:: çağrıları, tip güvenli ve açık semantik sunan yeni Atomic<T> sarmalayıcı sınıfına taşındı. Bu dönüşüm, Stop-The-World (STW) toplayıcıların (G1, Parallel, Serial) durum makinelerindeki bellek sıralama (memory ordering) hatalarını derleme zamanında önlüyor.
  • JEP 401 Değer Nesneleri (Value Objects) İçin GC Altyapısı: Kimliksiz değer nesnelerinin yığın (heap) bölgeleri içindeki düzleştirilmiş (flattened) bellek yerleşimlerini tarayabilmek amacıyla G1, Parallel ve Serial GC içindeki nesne yineleyicileri (object iterators) ve erken bellek geri kazanım (eager reclamation) yolları JEP 401 önizleme mimarisine uyarlandı.
  • Evrensel Varsayılan Olarak G1 GC (JEP 523) ve Parallel GC Yaşlandırma İyileştirmesi: JDK 27 ile birlikte G1 GC, donanım ve konteyner bellek sınırlarından bağımsız olarak tüm ortamlarda evrensel varsayılan çöp toplayıcı konumuna yükseldi ve düşük bellekli konteynerlerde Serial GC'ye sessizce geri dönülmesi (fallback) davranışı kaldırıldı. Ayrıca Parallel GC içinde survivor alanı tıkanıklıklarını önlemek üzere hem yukarı hem aşağı yönlü dinamik ayarlama yapabilen çift yönlü uyarlanabilir yaşlandırma eşiği (bidirectional adaptive tenuring threshold) devreye alındı.

3. Dayanıklı Yürütme (Durable Execution) ve 'Temporal Agent Harness' Mimarisi

Josh Long'un sunduğu A Bootiful Podcast yayınına konuk olan Cornelia Davis (Temporal.io Principal Developer Advocate ve Cloud Native Patterns kitabı yazarı), bulut-yerli mimarilerin durumsuz (stateless) servislerden olay kaynaklı (event-sourced) Dayanıklı Yürütme (Durable Execution) motorlarına evrimini ve bunun otonom yapay zeka ajanları üzerindeki kritik etkisini inceledi.

Standart bir LLM ajan döngüsü (chat loop) prototip aşamasında kolayca kurulabilse de, veritabanı değişikliği yapan, finansal işlem tetikleyen veya harici API'leri çağıran kurumsal bir ajanın üretim ortamında çalıştırılması ciddi güvenilirlik sorunları doğuruyor. Temporal Agent Harness, mevcut yapay zeka ajan SDK'larını sarmalayan açık kaynaklı bir dış koşum (outer harness) katmanı olarak şu yetenekleri sağlıyor:

  1. Adım Ortasında (Mid-Turn) Çökme Kurtarma ve Sıfır Tekrar Maliyeti: Ağ kesintisi, LLM sağlayıcı hız sınırı (HTTP 429 rate limit) veya pod yeniden başlatılması durumunda, yürütme geçmişi (execution history) deterministik olarak saklandığı için ajan iş akışı baştan başlamaz ve tamamlanmış pahalı LLM çıkarım adımlarını tekrar çalıştırmadan kaldığı tam noktadan devam eder.
  2. Politika Tabanlı İnsan Onayı (Human-in-the-Loop): Hassas bir araç çağrısı (tool call) yürütülmeden önce iş akışı bellek veya iş parçacığı tüketmeden günlerce/haftalarca duraklatılabilir (durable sleep/signal) ve yetkili onayı geldiğinde aynı bağlamla sürdürülür.
  3. Güçlü Tip Güvenliği (Strong Typing): Serbest metin (string-in/string-out) tabanlı kırılgan ajan iletişimi yerine, yapılandırılmış ve şema doğrulamalı Java/TypeScript veri sözleşmeleri üzerinden deterministik durum geçişleri uygulanır.
mermaid
flowchart TD
    subgraph SC["1. Spring Cloud 2026.0.0-RC2 (Paddington / Boot 4.2.0-RC2)"]
        GW["Gateway Server Web MVC<br/>LocalResponseCache Filtresi (#4249)"]
        CFG["Spring Cloud Config 5.1.0-RC2<br/>GCS Backend (#3343) & Resource API (#3355)"]
        OF["OpenFeign 5.1.0-RC2<br/>@SpringQueryMap Derin Nesne Serileştirme (#1448)"]
        GW --> CFG
        CFG --> OF
    end

    subgraph JVM["2. OpenJDK Devoxx AtA & JDK 27 STW GC Modernizasyonu"]
        ATA["Devoxx Ask the Architects (Bölüm 74)<br/>JEP 401 Value Classes & FFM Runtime"]
        ATM["HotSpot STW GC (JDK-8367013)<br/>volatile/AtomicAccess -> Atomic&lt;T&gt;"]
        G1D["Evrensel Varsayılan G1 GC (JEP 523)<br/>& Parallel GC Çift Yönlü Yaşlandırma"]
        ATA --> ATM
        ATM --> G1D
    end

    subgraph TMP["3. Dayanıklı Yürütme & Temporal Agent Harness"]
        HAR["Temporal Agent Harness<br/>Olay Kaynaklı Dış Koşum Katmanı"]
        DUR["Mid-Turn Kurtarma & LLM Önbellek Korunumu<br/>Pahalı Çıkarımları Tekrarlamadan Devam"]
        HITL["Politika Tabanlı İnsan Onayı (Signal)<br/>Durum Kayıpsız Uzun Süreli Bekleme"]
        HAR --> DUR
        DUR --> HITL
    end

    SC --> JVM
    JVM --> TMP

Mimari Karşılaştırma Tablosu

Mimari Katman Bileşen / Sürüm Temel Mühendislik Yeniliği Çözülen Üretim Problemi
API Ağ Geçidi & Konfigürasyon Spring Cloud 2026.0.0-RC2 (Paddington / Boot 4.2.0-RC2) Web MVC LocalResponseCache (#4249), Config GCS (#3343) & Resource (#3355), OpenFeign @SpringQueryMap (#1448) Sanal iş parçacıklı MVC ağ geçitlerinde yerel önbellek eksikliği ve iç içe DTO sorgu serileştirme kısıtları
JVM Çekirdeği & Bellek Yönetimi OpenJDK JDK 27 STW GC & Project Valhalla (JEP 401) JDK-8367013 Atomic<T> sarmalayıcısı, JEP 401 nesne yineleyicileri, JEP 523 evrensel G1 GC C++ GC kod tabanında bellek sıralama karmaşası, küçük konteynerlerde Serial GC darboğazı ve kimliksiz değer nesnesi taraması
Dağıtık Ajan Orkestrasyonu Temporal.io & Temporal Agent Harness Olay kaynaklı (event-sourced) dayanıklı ajan döngüsü, mid-turn kurtarma ve politika tabanlı onay sinyalleri Ağ kopması veya hız sınırı nedeniyle kırılan ajan döngüleri, tekrarlanan LLM maliyetleri ve denetimsiz araç çağrıları

Referans Uygulama: Spring Cloud Paddington ve Dayanıklı Ajan İş Akışı Simülasyonu

Aşağıdaki Java 25+ referans uygulaması; JEP 401 uyumlu değişmez değer nesnesi semantiğini, Spring Cloud 2026.0.0-RC2 (LocalResponseCache ve iç içe @SpringQueryMap) yapılandırma modelini ve Temporal Agent Harness benzeri olay kaynaklı (event-sourced) dayanıklı adım yürütme motorunu bir arada göstermektedir:

java
package com.tastutanlabs.architecture.paddington;

import java.time.Duration;
import java.time.Instant;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicReference;

/**
 * Spring Cloud 2026.0.0-RC2 (Paddington), JDK 27 Atomic/Value Semantiği
 * ve Temporal Agent Harness Dayanıklı Yürütme (Durable Execution) Referans Modeli.
 */
public final class EnterpriseJavaArchitectureSimulation {

    // 1. OpenFeign 5.1.0-RC2 (#1448) @SpringQueryMap İç İçe Sorgu Modeli
    public record PaginationCriteria(int page, int size, String sortField) {}

    public record NestedAgentQueryMap(
            String tenantId,
            String workflowNamespace,
            PaginationCriteria pagination
    ) {
        public Map<String, String> toFlattenedQueryParams() {
            return Map.of(
                    "tenantId", tenantId,
                    "workflowNamespace", workflowNamespace,
                    "pagination.page", String.valueOf(pagination.page()),
                    "pagination.size", String.valueOf(pagination.size()),
                    "pagination.sortField", pagination.sortField()
            );
        }
    }

    // 2. Gateway Server Web MVC LocalResponseCache (#4249) Simülasyonu
    public record CachedGatewayResponse(String payload, Instant expiresAt) {
        public boolean isExpired(Instant now) {
            return now.isAfter(expiresAt);
        }
    }

    public static final class WebMvcLocalResponseCacheFilter {
        private final Map<String, CachedGatewayResponse> localCache = new ConcurrentHashMap<>();
        private final Duration timeToLive;

        public WebMvcLocalResponseCacheFilter(Duration timeToLive) {
            this.timeToLive = timeToLive;
        }

        public String executeWithLocalCache(String routeKey, java.util.function.Supplier<String> downstreamCall) {
            Instant now = Instant.now();
            CachedGatewayResponse existing = localCache.get(routeKey);
            if (existing != null && !existing.isExpired(now)) {
                return "[GATEWAY-MVC-LOCAL-CACHE-HIT] " + existing.payload();
            }
            String freshPayload = downstreamCall.get();
            localCache.put(routeKey, new CachedGatewayResponse(freshPayload, now.plus(timeToLive)));
            return "[GATEWAY-MVC-DOWNSTREAM-FETCH] " + freshPayload;
        }
    }

    // 3. Temporal Agent Harness: Olay Kaynaklı (Event-Sourced) Dayanıklı Ajan Yürütmesi
    public enum TurnStatus { COMPLETED, WAITING_POLICY_APPROVAL, RECOVERED_FROM_HISTORY }

    public record AgentTurnEvent(
            int turnIndex,
            String stepName,
            String deterministicOutput,
            TurnStatus status
    ) {}

    public static final class DurableAgentHarnessEngine {
        // JDK-8367013 Atomic<T> yaklaşımına paralel açık atomik durum sarmalayıcısı
        private final AtomicReference<TurnStatus> engineState = new AtomicReference<>(TurnStatus.COMPLETED);
        private final Map<Integer, AgentTurnEvent> eventHistory = new ConcurrentHashMap<>();

        public AgentTurnEvent executeDurableTurn(
                int turnIndex,
                String stepName,
                boolean requiresHumanApproval,
                boolean policyApproved,
                java.util.function.Supplier<String> expensiveLlmOrToolCall
        ) {
            // Adım daha önce tamamlandıysa LLM çağrısını tekrarlamadan geçmişten dön
            if (eventHistory.containsKey(turnIndex)) {
                AgentTurnEvent cachedEvent = eventHistory.get(turnIndex);
                if (cachedEvent.status() == TurnStatus.COMPLETED) {
                    return new AgentTurnEvent(
                            cachedEvent.turnIndex(),
                            cachedEvent.stepName(),
                            cachedEvent.deterministicOutput(),
                            TurnStatus.RECOVERED_FROM_HISTORY
                    );
                }
            }

            if (requiresHumanApproval && !policyApproved) {
                engineState.set(TurnStatus.WAITING_POLICY_APPROVAL);
                AgentTurnEvent pausedEvent = new AgentTurnEvent(
                        turnIndex,
                        stepName,
                        "POLICY_SIGNAL_PENDING",
                        TurnStatus.WAITING_POLICY_APPROVAL
                );
                eventHistory.put(turnIndex, pausedEvent);
                return pausedEvent;
            }

            String output = expensiveLlmOrToolCall.get();
            engineState.set(TurnStatus.COMPLETED);
            AgentTurnEvent completedEvent = new AgentTurnEvent(
                    turnIndex,
                    stepName,
                    output,
                    TurnStatus.COMPLETED
            );
            eventHistory.put(turnIndex, completedEvent);
            return completedEvent;
        }
    }

    public static void main(String[] args) {
        // 1. OpenFeign 5.1.0-RC2 derin sorgu haritası doğrulaması
        NestedAgentQueryMap query = new NestedAgentQueryMap(
                "tenant-eu-01",
                "autonomous-settlement",
                new PaginationCriteria(0, 25, "updatedAt")
        );
        System.out.println("OpenFeign Nested Query Params: " + query.toFlattenedQueryParams());

        // 2. Gateway Web MVC LocalResponseCache doğrulaması
        WebMvcLocalResponseCacheFilter gatewayFilter = new WebMvcLocalResponseCacheFilter(Duration.ofMinutes(5));
        String firstCall = gatewayFilter.executeWithLocalCache("/api/v1/config/gcs-resource", () -> "gcs://prod-config/application.yml");
        String secondCall = gatewayFilter.executeWithLocalCache("/api/v1/config/gcs-resource", () -> "gcs://prod-config/application.yml");
        System.out.println(firstCall);
        System.out.println(secondCall);

        // 3. Temporal Agent Harness dayanıklı adım ve çökme kurtarma simülasyonu
        DurableAgentHarnessEngine harness = new DurableAgentHarnessEngine();
        AgentTurnEvent turn1 = harness.executeDurableTurn(
                1, "LLM_REASONING_PLAN", false, true,
                () -> "Plan: Veritabanı mutabakat kaydını hazırla"
        );
        // Ağ kesintisi sonrası aynı adımın yeniden tetiklenmesi (LLM tekrar çağrılmaz)
        AgentTurnEvent turn1Replay = harness.executeDurableTurn(
                1, "LLM_REASONING_PLAN", false, true,
                () -> { throw new IllegalStateException("Bu pahalı LLM çağrısı tekrar çalışmamalıdır!"); }
        );
        // Politika onayı gerektiren hassas araç çağrısı
        AgentTurnEvent turn2Paused = harness.executeDurableTurn(
                2, "EXECUTE_LEDGER_MUTATION", true, false,
                () -> "Ledger TX #9042 onaylandı"
        );

        for (AgentTurnEvent ev : List.of(turn1, turn1Replay, turn2Paused)) {
            System.out.printf("Turn %d [%s] -> Status: %s | Output: %s%n",
                    ev.turnIndex(), ev.stepName(), ev.status(), ev.deterministicOutput());
        }
    }
}

Sonuç ve Mimari Değerlendirme

  • Spring Cloud 2026.0.0-RC2 (Paddington), sanal iş parçacığı tabanlı Spring Cloud Gateway Server Web MVC mimarisine LocalResponseCache filtresini kazandırarak reaktif olmayan mikroservis ağ geçitlerindeki performans makasını kapatırken, Config Server GCS entegrasyonu ve OpenFeign derin sorgu serileştirmesi ile çoklu bulut entegrasyonunu sadeleştiriyor.
  • OpenJDK Devoxx 'Ask the Architects' oturumu ve JDK 27 STW GC güncellemeleri, bir yandan Project Valhalla (JEP 401) değer nesnelerinin düzleştirilmiş bellek yerleşimini çöp toplayıcı seviyesinde hazırlarken, diğer yandan JDK-8367013 Atomic<T> dönüşümü ve evrensel varsayılan G1 GC (JEP 523) ile çalışma zamanı kararlılığını güçlendiriyor.
  • Temporal Agent Harness ve dayanıklı yürütme (durable execution) modeli ise kurumsal Java/Spring ekosisteminde geliştirilen yapay zeka ajanlarını geçici bellek içi döngülerden çıkarıp, hata toleranslı, maliyet korumalı ve denetlenebilir dağıtık iş akışlarına dönüştürüyor.
Konu Etiketleri
#Java#OpenJDK#Spring Boot#Project Valhalla#Microservices#JDK 27#Spring Cloud#Garbage Collection#Temporal#Durable Execution
Emre Taştutan
Emre TaştutanGeliştirici & AI Meraklısı

Yazılım mimarisi, mikroservis ekosistemleri ve üretken yapay zeka uygulamaları üzerine çalışıyorum. TastutanLabs çatısı altında geliştirici araçları ve SaaS ürünleri inşa ediyorum.

@tastutanlabs • Instagram Mini-Blog

Bu analizin 6 kartlık görsel özetini Instagram'da inceleyin ve kaydedin

Her gün yazılım mimarisi, Java/JVM ve yapay zeka gelişmelerini kendi başına okunabilen 6 slaytlık Mini-Blog serileri halinde paylaşıyoruz.

Instagram'da Takip Et →
Bu Yazıyı Paylaş:

Yorumlar (0)

Düşüncelerinizi Paylaşın

Henüz yorum yapılmamış. İlk yorumu siz yapın!

Bu Kategorideki Diğer İncelemeler

Java & Kurumsal Mimari

OpenJDK ‘Project Detroit’ (FFM ile V8 ve CPython), Spring Boot Yerel ‘Cloud Foundry / kind’ Orkestrasyonu ve Quarkus 4.0 Mimarisi

OpenJDK'nın Foreign Function & Memory (FFM) API üzerinden Google V8 ve CPython çalışma zamanlarını doğrudan JVM sürecine gömen Project Detroit girişimi, Spring Boot uygulamalarında Docker/kind tabanlı yerel Cloud Foundry dağıtımı ve Quarkus 4.0 (Vert.x 5, HTTP/3, Hibernate 8) mimarisi inceleniyor.

Emre TaştutanEmre Taştutan
9 dk
Java & Kurumsal Mimari

JDK 28’de ‘JEP 401 Value Classes’ ve Değişmez Veri Mimarisi, Spring AI 2.1 ‘MessagePart’ Akıl Yürütme Korunumu ve Özel Vektör ‘Upsert’ API’si

OpenJDK 28 erken erişim sürümlerinde 30 çekirdek sınıfı kimliksiz değer nesnesine dönüştüren JEP 401 (Value Classes), çok turlu akıl yürütme imzalarını kayıpsız taşıyan Spring AI 2.1 MessagePart mimarisi ve önceden hesaplanmış float[] vektörleri destekleyen VectorStore.upsert() yetenekleri inceleniyor.

Emre TaştutanEmre Taştutan
10 dk