{"id":32902,"date":"2025-10-27T06:41:02","date_gmt":"2025-10-27T03:41:02","guid":{"rendered":"https:\/\/fatihsoysal.com\/blog\/?p=32902"},"modified":"2025-10-27T06:41:02","modified_gmt":"2025-10-27T03:41:02","slug":"kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber","status":"publish","type":"post","link":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/","title":{"rendered":"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber"},"content":{"rendered":"<p><body><\/p>\n<h2>Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber<\/h2>\n<p>Apache Kafka, y\u00fcksek performansl\u0131, da\u011f\u0131t\u0131k bir ak\u0131\u015f platformu olarak g\u00fcn\u00fcm\u00fcz modern veri mimarilerinin temel ta\u015flar\u0131ndan biridir. B\u00fcy\u00fck \u00f6l\u00e7ekli veri ak\u0131\u015flar\u0131n\u0131 i\u015flemek, ger\u00e7ek zamanl\u0131 uygulamalar geli\u015ftirmek ve mikroservis mimarilerinde mesajla\u015fma sa\u011flamak i\u00e7in yayg\u0131n olarak kullan\u0131l\u0131r. Ancak Kafka&#8217;n\u0131n g\u00fcc\u00fcnden tam anlam\u0131yla faydalanabilmek i\u00e7in, onu sadece bir mesaj kuyru\u011fu olarak kullanmak yeterli de\u011fildir; ayn\u0131 zamanda operasyonel s\u00fcre\u00e7lerini de etkin bir \u015fekilde y\u00f6netmek gerekir. Konu (topic) olu\u015fturma, silme, yap\u0131land\u0131rma, t\u00fcketici gruplar\u0131n\u0131 izleme ve y\u00f6netme gibi g\u00f6revler, manuel olarak yap\u0131ld\u0131\u011f\u0131nda zaman al\u0131c\u0131, hataya a\u00e7\u0131k ve \u00f6l\u00e7eklenemez hale gelebilir. \u0130\u015fte bu noktada Kafka&#8217;y\u0131 programatik olarak y\u00f6netme ihtiyac\u0131 ortaya \u00e7\u0131kar.<\/p>\n<p>Bu makale, Kafka k\u00fcmelerini programatik olarak y\u00f6netmenin temel prensiplerini, kullan\u0131lan API&#8217;leri ve k\u00fct\u00fcphaneleri, yayg\u0131n y\u00f6netim g\u00f6revlerini ve en iyi uygulamalar\u0131 derinlemesine inceleyecektir. Java&#8217;n\u0131n <code>AdminClient<\/code> API&#8217;si ba\u015fta olmak \u00fczere, farkl\u0131 programlama dillerindeki yakla\u015f\u0131mlara de\u011finecek ve ger\u00e7ek d\u00fcnya senaryolar\u0131nda nas\u0131l kullan\u0131labilece\u011fine dair \u00f6rnekler sunacakt\u0131r. Amac\u0131m\u0131z, geli\u015ftiricilere ve operasyon ekiplerine, Kafka altyap\u0131lar\u0131n\u0131 daha otomatize, esnek ve g\u00fcvenilir bir \u015fekilde y\u00f6netmeleri i\u00e7in gerekli bilgi ve ara\u00e7lar\u0131 sa\u011flamakt\u0131r.<\/p>\n<h3>Kafka Y\u00f6netimi Neden Programatik Olmal\u0131?<\/h3>\n<p>Kafka gibi da\u011f\u0131t\u0131k bir sistemin y\u00f6netimi, \u00f6zellikle b\u00fcy\u00fck ve karma\u015f\u0131k ortamlarda, manuel i\u015flemlerle s\u00fcrd\u00fcr\u00fclemez hale gelir. Programatik y\u00f6netim, bu zorluklar\u0131n \u00fcstesinden gelmek i\u00e7in bir dizi \u00f6nemli avantaj sunar:<\/p>\n<h4>Otomasyon ve Verimlilik<\/h4>\n<p>Programatik y\u00f6netim, tekrarlayan g\u00f6revleri otomatikle\u015ftirmeyi sa\u011flar. Yeni bir uygulaman\u0131n devreye al\u0131nmas\u0131yla birlikte gerekli Kafka konular\u0131n\u0131 ve ACL&#8217;leri otomatik olarak olu\u015fturmak, art\u0131k kullan\u0131lmayan konular\u0131 temizlemek veya belirli ko\u015fullar alt\u0131nda partisyon say\u0131lar\u0131n\u0131 ayarlamak gibi i\u015flemler, script&#8217;ler veya otomasyon ara\u00e7lar\u0131 arac\u0131l\u0131\u011f\u0131yla ger\u00e7ekle\u015ftirilebilir. Bu, insan hatas\u0131 riskini azalt\u0131r ve operasyonel verimlili\u011fi art\u0131r\u0131r.<\/p>\n<h4>Dinamik \u00d6l\u00e7eklendirme ve Esneklik<\/h4>\n<p>\u0130\u015f y\u00fckleri zamanla de\u011fi\u015febilir. Programatik y\u00f6netim, Kafka k\u00fcmenizin bu de\u011fi\u015fikliklere dinamik olarak uyum sa\u011flamas\u0131na olanak tan\u0131r. \u00d6rne\u011fin, belirli bir konudaki mesaj hacmi beklenenden fazla artt\u0131\u011f\u0131nda, programatik olarak daha fazla partisyon eklenebilir. Bu, sistemin performans\u0131n\u0131 ve kullan\u0131labilirli\u011fini korumak i\u00e7in kritik \u00f6neme sahiptir.<\/p>\n<h4>CI\/CD Entegrasyonu<\/h4>\n<p>S\u00fcrekli Entegrasyon\/S\u00fcrekli Da\u011f\u0131t\u0131m (CI\/CD) s\u00fcre\u00e7lerinde, Kafka kaynaklar\u0131n\u0131n otomatik olarak olu\u015fturulmas\u0131 ve yap\u0131land\u0131r\u0131lmas\u0131 b\u00fcy\u00fck kolayl\u0131k sa\u011flar. Uygulama da\u011f\u0131t\u0131mlar\u0131 s\u0131ras\u0131nda gerekli Kafka konular\u0131n\u0131n ve di\u011fer kaynaklar\u0131n otomatik olarak haz\u0131rlanmas\u0131, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini h\u0131zland\u0131r\u0131r ve tutarl\u0131l\u0131\u011f\u0131 garanti eder.<\/p>\n<h4>\u00d6zel Ara\u00e7lar ve Kontrol Panelleri Geli\u015ftirme<\/h4>\n<p>Programatik API&#8217;ler, ekiplerin kendi \u00f6zel Kafka y\u00f6netim ara\u00e7lar\u0131n\u0131 veya kontrol panellerini geli\u015ftirmelerine olanak tan\u0131r. Bu ara\u00e7lar, \u015firketin \u00f6zel ihtiya\u00e7lar\u0131na g\u00f6re tasarlanabilir, mevcut izleme ve uyar\u0131 sistemleriyle entegre edilebilir ve operasyon ekiplerine daha derinlemesine g\u00f6r\u00fcn\u00fcrl\u00fck ve kontrol sa\u011flayabilir.<\/p>\n<h4>Hata Y\u00f6netimi ve Kurtarma S\u00fcre\u00e7leri<\/h4>\n<p>Programatik y\u00f6netim, hata durumlar\u0131nda otomatik kurtarma mekanizmalar\u0131 geli\u015ftirmek i\u00e7in de kullan\u0131labilir. \u00d6rne\u011fin, bir broker&#8217;\u0131n \u00e7evrimd\u0131\u015f\u0131 kalmas\u0131 durumunda, replikasyon fakt\u00f6rlerini veya partisyon da\u011f\u0131l\u0131mlar\u0131n\u0131 yeniden d\u00fczenlemek gibi \u00f6nlemler otomatik olarak al\u0131nabilir. T\u00fcketici gruplar\u0131n\u0131n offset&#8217;lerini belirli bir noktaya s\u0131f\u0131rlama gibi kurtarma i\u015flemleri de programatik olarak ger\u00e7ekle\u015ftirilebilir.<\/p>\n<h3>Kafka Y\u00f6netimi i\u00e7in Temel API&#8217;ler ve K\u00fct\u00fcphaneler<\/h3>\n<p>Kafka&#8217;y\u0131 programatik olarak y\u00f6netmek i\u00e7in \u00e7e\u015fitli API&#8217;ler ve k\u00fct\u00fcphaneler mevcuttur. Bunlar\u0131n en temel ve kapsaml\u0131 olan\u0131, Kafka&#8217;n\u0131n kendi Java API&#8217;sinde bulunan <code>AdminClient<\/code>&#8216;t\u0131r.<\/p>\n<h4>Java API&#8217;leri<\/h4>\n<p>Kafka ekosisteminde Java merkezi bir rol oynar. <code>AdminClient<\/code> s\u0131n\u0131f\u0131, Kafka k\u00fcmelerini programatik olarak y\u00f6netmek i\u00e7in tasarlanm\u0131\u015f ana aray\u00fczd\u00fcr.<\/p>\n<h5>AdminClient<\/h5>\n<p><code>AdminClient<\/code>, Kafka k\u00fcmesiyle etkile\u015fim kurarak y\u00f6netimsel g\u00f6revleri ger\u00e7ekle\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Bu g\u00f6revler aras\u0131nda konu olu\u015fturma, silme, listeleme, yap\u0131land\u0131rma de\u011fi\u015fiklikleri, broker bilgisi alma ve t\u00fcketici grubu y\u00f6netimi gibi i\u015flemler bulunur. <code>AdminClient<\/code> asenkron bir API&#8217;ye sahiptir, yani \u00e7a\u011fr\u0131lar hemen bir sonu\u00e7 d\u00f6nd\u00fcrmez; bunun yerine bir <code>KafkaFuture<\/code> nesnesi d\u00f6nd\u00fcr\u00fcr, bu da i\u015flemin tamamlanmas\u0131n\u0131 beklemek veya geri \u00e7a\u011f\u0131r\u0131m (callback) mekanizmalar\u0131 kullanmak i\u00e7in kullan\u0131labilir.<\/p>\n<p><strong><code>AdminClient<\/code> Olu\u015fturma:<\/strong><\/p>\n<p><code>AdminClient<\/code> olu\u015fturmak i\u00e7in temel Kafka yap\u0131land\u0131rma \u00f6zelliklerini i\u00e7eren bir <code>Properties<\/code> nesnesi gereklidir. En az\u0131ndan <code>bootstrap.servers<\/code> \u00f6zelli\u011fi belirtilmelidir.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.AdminClient;\nimport org.apache.kafka.clients.admin.AdminClientConfig;\nimport java.util.Properties;\n\npublic class KafkaAdminClientExample {\n\n    private AdminClient adminClient;\n\n    public KafkaAdminClientExample(String bootstrapServers) {\n        Properties props = new Properties();\n        props.put(AdminClientConfig.BOOTSTRAP_SERVERS_CONFIG, bootstrapServers);\n        \/\/ \u0130ste\u011fe ba\u011fl\u0131 olarak g\u00fcvenlik ve di\u011fer ayarlar eklenebilir\n        \/\/ props.put(AdminClientConfig.SECURITY_PROTOCOL_CONFIG, \"SASL_SSL\");\n        \/\/ props.put(AdminClientConfig.SASL_MECHANISM, \"PLAIN\");\n        \/\/ ...\n        this.adminClient = AdminClient.create(props);\n    }\n\n    public void close() {\n        if (adminClient != null) {\n            adminClient.close();\n        }\n    }\n\n    \/\/ ... y\u00f6netim metotlar\u0131 buraya gelecek\n}<\/code><\/pre>\n<p><strong>Konu Olu\u015fturma:<\/strong><\/p>\n<p><code>createTopics<\/code> metodu, bir veya daha fazla konu olu\u015fturmak i\u00e7in kullan\u0131l\u0131r. <code>NewTopic<\/code> nesneleri, olu\u015fturulacak konular\u0131n ad\u0131n\u0131, partisyon say\u0131s\u0131n\u0131 ve replikasyon fakt\u00f6r\u00fcn\u00fc belirtir.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.NewTopic;\nimport java.util.Collections;\nimport java.util.concurrent.ExecutionException;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void createTopic(String topicName, int numPartitions, short replicationFactor) {\n    NewTopic newTopic = new NewTopic(topicName, numPartitions, replicationFactor);\n    try {\n        adminClient.createTopics(Collections.singletonList(newTopic)).all().get();\n        System.out.println(\"Konu '\" + topicName + \"' ba\u015far\u0131yla olu\u015fturuldu.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Konu olu\u015fturulurken hata olu\u015ftu: \" + e.getMessage());\n    }\n}<\/code><\/pre>\n<p><strong>Konu Silme:<\/strong><\/p>\n<p><code>deleteTopics<\/code> metodu, belirtilen konular\u0131 silmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<pre><code class=\"language-java\">import java.util.Arrays;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void deleteTopic(String topicName) {\n    try {\n        adminClient.deleteTopics(Arrays.asList(topicName)).all().get();\n        System.out.println(\"Konu '\" + topicName + \"' ba\u015far\u0131yla silindi.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Konu silinirken hata olu\u015ftu: \" + e.getMessage());\n    }\n}<\/code><\/pre>\n<p><strong>Konular\u0131 Listeleme:<\/strong><\/p>\n<p><code>listTopics<\/code> metodu, k\u00fcmedeki t\u00fcm konular\u0131 listeler.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.ListTopicsOptions;\nimport org.apache.kafka.clients.admin.TopicListing;\nimport java.util.Set;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic Set<String> listTopics() {\n    try {\n        ListTopicsOptions options = new ListTopicsOptions();\n        options.listInternal(false); \/\/ Dahili konular\u0131 dahil etme\n        Set<TopicListing> topics = adminClient.listTopics(options).listings().get();\n        System.out.println(\"Kafka'daki konular:\");\n        for (TopicListing topic : topics) {\n            System.out.println(\" - \" + topic.name() + (topic.isInternal() ? \" (dahili)\" : \"\"));\n        }\n        return topics.stream().map(TopicListing::name).collect(java.util.stream.Collectors.toSet());\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Konular listelenirken hata olu\u015ftu: \" + e.getMessage());\n        return Collections.emptySet();\n    }\n}<\/code><\/pre>\n<h5>KafkaProducer ve KafkaConsumer<\/h5>\n<p><code>KafkaProducer<\/code> ve <code>KafkaConsumer<\/code> do\u011frudan y\u00f6netim API&#8217;leri olmasa da, belirli y\u00f6netimsel g\u00f6revlerde dolayl\u0131 olarak kullan\u0131labilirler. \u00d6rne\u011fin, bir konuya test mesajlar\u0131 g\u00f6ndermek veya bir t\u00fcketici grubunun mevcut offset&#8217;lerini izlemek i\u00e7in kullan\u0131labilirler. Ayr\u0131ca, bu s\u0131n\u0131flar\u0131n metrikleri, Kafka k\u00fcmesinin sa\u011fl\u0131k durumunu izlemek i\u00e7in programatik olarak toplanabilir.<\/p>\n<h5>KafkaStreams<\/h5>\n<p><code>KafkaStreams<\/code> k\u00fct\u00fcphanesi, Kafka&#8217;da ak\u0131\u015f i\u015fleme uygulamalar\u0131 geli\u015ftirmek i\u00e7in kullan\u0131l\u0131r. Do\u011frudan y\u00f6netimle ilgili olmasa da, karma\u015f\u0131k ak\u0131\u015f i\u015fleme topolojilerini da\u011f\u0131t\u0131rken veya izlerken y\u00f6netimsel g\u00f6revlerle entegre edilebilir.<\/p>\n<h4>Di\u011fer Diller i\u00e7in K\u00fct\u00fcphaneler<\/h4>\n<p>Kafka ekosistemi, Java d\u0131\u015f\u0131ndaki diller i\u00e7in de g\u00fc\u00e7l\u00fc istemci k\u00fct\u00fcphaneleri sunar. Bu k\u00fct\u00fcphaneler genellikle C\/C++ tabanl\u0131 <code>librdkafka<\/code> \u00fczerine in\u015fa edilmi\u015ftir ve <code>AdminClient<\/code> benzeri i\u015flevsellik sa\u011flarlar.<\/p>\n<h5>Python<\/h5>\n<p>*   <strong><code>kafka-python<\/code><\/strong>: Saf Python ile yaz\u0131lm\u0131\u015f pop\u00fcler bir Kafka istemcisidir. Y\u00f6netimsel i\u015flemler i\u00e7in <code>KafkaAdminClient<\/code> s\u0131n\u0131f\u0131n\u0131 sunar.<br \/>\n*   <strong><code>confluent-kafka-python<\/code><\/strong>: <code>librdkafka<\/code> \u00fczerine in\u015fa edilmi\u015f y\u00fcksek performansl\u0131 bir istemcidir. <code>AdminClient<\/code> s\u0131n\u0131f\u0131, konu olu\u015fturma, silme ve di\u011fer y\u00f6netimsel g\u00f6revler i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p><strong><code>confluent-kafka-python<\/code> ile Konu Olu\u015fturma \u00d6rne\u011fi:<\/strong><\/p>\n<pre><code class=\"language-python\">from confluent_kafka.admin import AdminClient, NewTopic, NewPartitions\nfrom confluent_kafka import KafkaException\nimport sys\n\ndef create_topic_python(bootstrap_servers, topic_name, num_partitions, replication_factor):\n    admin_client = AdminClient({'bootstrap.servers': bootstrap_servers})\n\n    new_topic = NewTopic(topic_name, num_partitions=num_partitions, replication_factor=replication_factor)\n    fs = admin_client.create_topics([new_topic])\n\n    for topic, f in fs.items():\n        try:\n            f.result()  # \u0130\u015flemin tamamlanmas\u0131n\u0131 bekle\n            print(f\"Konu '{topic}' ba\u015far\u0131yla olu\u015fturuldu.\")\n        except KafkaException as e:\n            print(f\"Konu '{topic}' olu\u015fturulurken hata olu\u015ftu: {e}\")\n        except Exception as e:\n            print(f\"Beklenmeyen hata: {e}\")\n    admin_client.poll(0) # Bekleyen olaylar\u0131 i\u015fle\n    # admin_client.close() # AdminClient'\u0131 kapatmak genellikle gerekli de\u011fildir, kendisi kapan\u0131r\n\nif __name__ == '__main__':\n    bootstrap_servers = \"localhost:9092\"\n    topic_name = \"my_python_topic\"\n    num_partitions = 3\n    replication_factor = 1\n    create_topic_python(bootstrap_servers, topic_name, num_partitions, replication_factor)<\/code><\/pre>\n<h5>Go<\/h5>\n<p>*   <strong><code>sarama<\/code><\/strong>: Go i\u00e7in pop\u00fcler ve olgun bir Kafka istemcisidir. Y\u00f6netimsel i\u015flemler i\u00e7in <code>ClusterAdmin<\/code> aray\u00fcz\u00fcn\u00fc sa\u011flar.<br \/>\n*   <strong><code>confluent-kafka-go<\/code><\/strong>: <code>librdkafka<\/code> \u00fczerine in\u015fa edilmi\u015f Confluent&#8217;in Go istemcisidir. <code>AdminClient<\/code> benzeri i\u015flevsellik sunar.<\/p>\n<h5>Node.js<\/h5>\n<p>*   <strong><code>kafkajs<\/code><\/strong>: Saf JavaScript ile yaz\u0131lm\u0131\u015f modern bir Kafka istemcisidir. Y\u00f6netimsel i\u015flemler i\u00e7in <code>admin<\/code> aray\u00fcz\u00fcn\u00fc sa\u011flar.<\/p>\n<h3>Temel Programatik Y\u00f6netim G\u00f6revleri<\/h3>\n<p>Kafka&#8217;y\u0131 programatik olarak y\u00f6netirken ger\u00e7ekle\u015ftirilebilecek ba\u015fl\u0131ca g\u00f6revler \u015funlard\u0131r:<\/p>\n<h4>Konu (Topic) Y\u00f6netimi<\/h4>\n<p>Konular, Kafka&#8217;daki veri ak\u0131\u015flar\u0131n\u0131n temel birimleridir ve y\u00f6netimsel i\u015flemlerin \u00f6nemli bir b\u00f6l\u00fcm\u00fcn\u00fc olu\u015fturur.<\/p>\n<p>*   <strong>Konu Olu\u015fturma<\/strong>: Yeni bir veri ak\u0131\u015f\u0131 i\u00e7in bir konu olu\u015fturmak en temel y\u00f6netim g\u00f6revidir. Partisyon say\u0131s\u0131 (mesajlar\u0131n paralel i\u015flenmesini sa\u011flar) ve replikasyon fakt\u00f6r\u00fc (veri dayan\u0131kl\u0131l\u0131\u011f\u0131n\u0131 sa\u011flar) gibi \u00f6nemli parametreler bu a\u015famada belirlenir. Ayr\u0131ca, <code>retention.ms<\/code> (mesajlar\u0131n ne kadar s\u00fcre saklanaca\u011f\u0131) veya <code>cleanup.policy<\/code> (mesajlar\u0131n nas\u0131l temizlenece\u011fi &#8211; delete\/compact) gibi konu seviyesi yap\u0131land\u0131rmalar da ayarlanabilir.<br \/>\n*   <strong>Konu Silme<\/strong>: Art\u0131k kullan\u0131lmayan veya test ama\u00e7l\u0131 olu\u015fturulmu\u015f konular\u0131n silinmesi, kaynak israf\u0131n\u0131 \u00f6nler.<br \/>\n*   <strong>Konu Listeleme ve Detaylar\u0131n\u0131 Alma<\/strong>: K\u00fcmedeki mevcut konular\u0131 ve her bir konunun partisyon say\u0131s\u0131, replikasyon fakt\u00f6r\u00fc, yap\u0131land\u0131rma ayarlar\u0131 gibi detaylar\u0131n\u0131 almak, k\u00fcmenin genel durumu hakk\u0131nda bilgi sa\u011flar.<br \/>\n*   <strong>Konu Yap\u0131land\u0131rmas\u0131n\u0131 G\u00fcncelleme<\/strong>: Mevcut bir konunun baz\u0131 yap\u0131land\u0131rma ayarlar\u0131n\u0131 (\u00f6rn. <code>retention.ms<\/code>) \u00e7al\u0131\u015fma zaman\u0131nda g\u00fcncellemek m\u00fcmk\u00fcnd\u00fcr.<br \/>\n*   <strong>Partisyon Say\u0131s\u0131n\u0131 Art\u0131rma<\/strong>: Bir konunun mesaj hacmi artt\u0131\u011f\u0131nda, i\u015fleme kapasitesini art\u0131rmak i\u00e7in partisyon say\u0131s\u0131 art\u0131r\u0131labilir. <strong>\u00d6nemli Not<\/strong>: Partisyon say\u0131s\u0131 genellikle azalt\u0131lamaz. Bu nedenle ba\u015flang\u0131\u00e7ta dikkatli planlama yapmak \u00f6nemlidir.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.ConfigEntry;\nimport org.apache.kafka.clients.admin.Config;\nimport org.apache.kafka.clients.admin.AlterConfigsResult;\nimport org.apache.kafka.common.config.ConfigResource;\nimport org.apache.kafka.common.config.ConfigResource.Type;\n\nimport java.util.Collections;\nimport java.util.HashMap;\nimport java.util.Map;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void updateTopicConfig(String topicName, String configKey, String configValue) {\n    ConfigResource configResource = new ConfigResource(Type.TOPIC, topicName);\n    ConfigEntry configEntry = new ConfigEntry(configKey, configValue);\n    Config config = new Config(Collections.singletonList(configEntry));\n\n    Map<ConfigResource, Config> configs = new HashMap<>();\n    configs.put(configResource, config);\n\n    AlterConfigsResult result = adminClient.alterConfigs(configs);\n    try {\n        result.all().get();\n        System.out.println(\"Konu '\" + topicName + \"' i\u00e7in '\" + configKey + \"' yap\u0131land\u0131rmas\u0131 '\" + configValue + \"' olarak g\u00fcncellendi.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Konu yap\u0131land\u0131rmas\u0131 g\u00fcncellenirken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n\n\/\/ Partisyon say\u0131s\u0131n\u0131 art\u0131rma\nimport org.apache.kafka.clients.admin.NewPartitions;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void increasePartitions(String topicName, int newTotalPartitions) {\n    Map<String, NewPartitions> newPartitionsMap = new HashMap<>();\n    newPartitionsMap.put(topicName, NewPartitions.increaseTo(newTotalPartitions));\n\n    try {\n        adminClient.createPartitions(newPartitionsMap).all().get();\n        System.out.println(\"Konu '\" + topicName + \"' i\u00e7in partisyon say\u0131s\u0131 \" + newTotalPartitions + \" olarak art\u0131r\u0131ld\u0131.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Partisyon say\u0131s\u0131 art\u0131r\u0131l\u0131rken hata olu\u015ftu: \" + e.getMessage());\n    }\n}<\/code><\/pre>\n<h4>Broker Y\u00f6netimi ve Bilgi Alma<\/h4>\n<p>Kafka k\u00fcmesindeki broker&#8217;lar hakk\u0131nda bilgi almak, k\u00fcmenin sa\u011fl\u0131\u011f\u0131n\u0131 ve durumunu anlamak i\u00e7in \u00f6nemlidir.<\/p>\n<p>*   <strong>Broker&#8217;lar\u0131 Listeleme<\/strong>: K\u00fcmedeki aktif broker&#8217;lar\u0131n listesini ve ID&#8217;lerini almak.<br \/>\n*   <strong>Broker Konfig\u00fcrasyonlar\u0131n\u0131 Alma<\/strong>: Her bir broker&#8217;\u0131n yap\u0131land\u0131rma ayarlar\u0131n\u0131 (\u00f6rn. <code>log.dirs<\/code>, <code>listeners<\/code>) incelemek.<br \/>\n*   <strong>Kontrol\u00f6r Broker&#8217;\u0131 Bulma<\/strong>: K\u00fcmenin lider broker&#8217;\u0131n\u0131 (controller) belirlemek, k\u00fcme y\u00f6netiminde \u00f6nemli bir rol oynar.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.DescribeClusterResult;\nimport org.apache.kafka.clients.admin.Node;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void describeCluster() {\n    DescribeClusterResult result = adminClient.describeCluster();\n    try {\n        System.out.println(\"K\u00fcme ID: \" + result.clusterId().get());\n        System.out.println(\"Kontrol\u00f6r: \" + result.controller().get().id());\n        System.out.println(\"Broker'lar:\");\n        for (Node node : result.nodes().get()) {\n            System.out.println(\" - ID: \" + node.id() + \", Host: \" + node.host() + \", Port: \" + node.port());\n        }\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"K\u00fcme bilgileri al\u0131n\u0131rken hata olu\u015ftu: \" + e.getMessage());\n    }\n}<\/code><\/pre>\n<h4>T\u00fcketici Grubu (Consumer Group) Y\u00f6netimi<\/h4>\n<p>T\u00fcketici gruplar\u0131, Kafka&#8217;daki mesajlar\u0131n paralel ve hataya dayan\u0131kl\u0131 bir \u015fekilde t\u00fcketilmesini sa\u011flar.<\/p>\n<p>*   <strong>T\u00fcketici Gruplar\u0131n\u0131 Listeleme<\/strong>: K\u00fcmedeki t\u00fcm aktif t\u00fcketici gruplar\u0131n\u0131 listelemek.<br \/>\n*   <strong>T\u00fcketici Grubu Detaylar\u0131n\u0131 Alma<\/strong>: Belirli bir t\u00fcketici grubunun hangi konular\u0131 t\u00fcketti\u011fini, hangi partisyonlar\u0131 atand\u0131\u011f\u0131n\u0131 ve her bir partisyon i\u00e7in en son i\u015flenen offset&#8217;leri \u00f6\u011frenmek. Bu, t\u00fcketici gecikmesini (consumer lag) izlemek i\u00e7in hayati \u00f6neme sahiptir.<br \/>\n*   <strong>T\u00fcketici Grubunun Offset&#8217;lerini S\u0131f\u0131rlama<\/strong>: Hata durumlar\u0131nda veya belirli bir noktadan yeniden i\u015fleme gerekti\u011finde, bir t\u00fcketici grubunun offset&#8217;lerini belirli bir zamana, en ba\u015fa, en sona veya belirli bir offset&#8217;e s\u0131f\u0131rlamak (seek) m\u00fcmk\u00fcnd\u00fcr. Bu i\u015flem dikkatli yap\u0131lmal\u0131d\u0131r, \u00e7\u00fcnk\u00fc veri kayb\u0131na veya tekrar i\u015flenmesine neden olabilir.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.clients.admin.ListConsumerGroupsResult;\nimport org.apache.kafka.clients.admin.ConsumerGroupListing;\nimport org.apache.kafka.clients.admin.DescribeConsumerGroupsResult;\nimport org.apache.kafka.clients.admin.MemberAssignment;\nimport org.apache.kafka.clients.admin.MemberDescription;\nimport org.apache.kafka.clients.admin.ConsumerGroupDescription;\nimport org.apache.kafka.clients.admin.OffsetSpec;\nimport org.apache.kafka.clients.admin.ListConsumerGroupOffsetsResult;\nimport org.apache.kafka.clients.admin.TopicPartitionReplica;\nimport org.apache.kafka.common.TopicPartition;\n\nimport java.util.HashSet;\nimport java.util.Set;\nimport java.util.Map;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void listConsumerGroups() {\n    ListConsumerGroupsResult result = adminClient.listConsumerGroups();\n    try {\n        System.out.println(\"Aktif T\u00fcketici Gruplar\u0131:\");\n        for (ConsumerGroupListing listing : result.all().get()) {\n            System.out.println(\" - \" + listing.groupId() + (listing.isSimpleConsumerGroup() ? \" (basit)\" : \"\"));\n        }\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"T\u00fcketici gruplar\u0131 listelenirken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void describeConsumerGroup(String groupId) {\n    DescribeConsumerGroupsResult result = adminClient.describeConsumerGroups(Collections.singletonList(groupId));\n    try {\n        ConsumerGroupDescription description = result.all().get().get(groupId);\n        if (description != null) {\n            System.out.println(\"T\u00fcketici Grubu: \" + description.groupId());\n            System.out.println(\"  Durum: \" + description.state());\n            System.out.println(\"  Koordinat\u00f6r: \" + description.coordinator().id());\n            System.out.println(\"  \u00dcyeler (\" + description.members().size() + \"):\");\n            for (MemberDescription member : description.members()) {\n                System.out.println(\"    - Client ID: \" + member.clientId() + \", Host: \" + member.host());\n                for (TopicPartition tp : member.assignment().topicPartitions()) {\n                    System.out.println(\"      - Konu: \" + tp.topic() + \", Partisyon: \" + tp.partition());\n                }\n            }\n        }\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"T\u00fcketici grubu '\" + groupId + \"' a\u00e7\u0131klan\u0131rken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n\n\/\/ T\u00fcketici grubunun offsetlerini alma\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void listConsumerGroupOffsets(String groupId) {\n    ListConsumerGroupOffsetsResult result = adminClient.listConsumerGroupOffsets(groupId);\n    try {\n        Map<TopicPartition, Long> offsets = result.partitionsToOffsetAndMetadata().get().entrySet().stream()\n                .collect(java.util.stream.Collectors.toMap(Map.Entry::getKey, e -> e.getValue().offset()));\n        System.out.println(\"T\u00fcketici Grubu '\" + groupId + \"' i\u00e7in offsetler:\");\n        offsets.forEach((tp, offset) -> System.out.println(\"  Konu: \" + tp.topic() + \", Partisyon: \" + tp.partition() + \", Offset: \" + offset));\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"T\u00fcketici grubu offsetleri al\u0131n\u0131rken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n\n\/\/ T\u00fcketici grubunun offsetlerini s\u0131f\u0131rlama (\u00d6rnek: Belirli bir konunun t\u00fcm partisyonlar\u0131n\u0131 en ba\u015fa)\n\/\/ Bu i\u015flem, Kafka 2.4 ve \u00fczeri s\u00fcr\u00fcmlerde AdminClient ile desteklenir.\n\/\/ Daha eski s\u00fcr\u00fcmler i\u00e7in Kafka CLI veya Kafka Consumer API'si kullan\u0131labilir.\n\/*\nimport org.apache.kafka.clients.admin.AlterConsumerGroupOffsetsOptions;\nimport org.apache.kafka.clients.admin.OffsetSpec;\n\npublic void resetConsumerGroupOffsetsToBeginning(String groupId, String topicName) {\n    \/\/ \u00d6nce konunun partisyonlar\u0131n\u0131 bul\n    Set<TopicPartition> topicPartitions = new HashSet<>();\n    try {\n        adminClient.describeTopics(Collections.singletonList(topicName)).all().get()\n                .get(topicName)\n                .partitions()\n                .forEach(p -> topicPartitions.add(new TopicPartition(topicName, p.partition())));\n\n        Map<TopicPartition, OffsetSpec> offsetsToReset = new HashMap<>();\n        for (TopicPartition tp : topicPartitions) {\n            offsetsToReset.put(tp, OffsetSpec.earliest()); \/\/ En ba\u015fa s\u0131f\u0131rla\n        }\n\n        AlterConsumerGroupOffsetsOptions options = new AlterConsumerGroupOffsetsOptions().groupId(groupId);\n        adminClient.alterConsumerGroupOffsets(groupId, offsetsToReset, options).all().get();\n        System.out.println(\"T\u00fcketici grubu '\" + groupId + \"' i\u00e7in '\" + topicName + \"' konusunun offsetleri en ba\u015fa s\u0131f\u0131rland\u0131.\");\n\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"Offsetler s\u0131f\u0131rlan\u0131rken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n*\/<\/code><\/pre>\n<h4>ACL (Eri\u015fim Kontrol Listesi) Y\u00f6netimi<\/h4>\n<p>Kafka&#8217;da g\u00fcvenlik, \u00f6zellikle \u00e7ok kullan\u0131c\u0131l\u0131 veya \u00e7oklu uygulama ortamlar\u0131nda kritik \u00f6neme sahiptir. ACL&#8217;ler, belirli kullan\u0131c\u0131lar\u0131n veya uygulamalar\u0131n belirli Kafka kaynaklar\u0131na (konular, broker&#8217;lar, t\u00fcketici gruplar\u0131) eri\u015fimini kontrol etmek i\u00e7in kullan\u0131l\u0131r.<\/p>\n<p>*   <strong>ACL Olu\u015fturma<\/strong>: Belirli bir prensibe (kullan\u0131c\u0131\/uygulama) belirli bir kaynak \u00fczerinde belirli bir izni (okuma\/yazma\/y\u00f6netim) veren ACL&#8217;ler olu\u015fturmak.<br \/>\n*   <strong>ACL Silme<\/strong>: Art\u0131k ge\u00e7erli olmayan ACL&#8217;leri kald\u0131rmak.<br \/>\n*   <strong>ACL Listeleme<\/strong>: K\u00fcmedeki t\u00fcm tan\u0131ml\u0131 ACL&#8217;leri veya belirli bir kaynakla ili\u015fkili ACL&#8217;leri listelemek.<\/p>\n<pre><code class=\"language-java\">import org.apache.kafka.common.acl.AclBinding;\nimport org.apache.kafka.common.acl.AccessControlEntry;\nimport org.apache.kafka.common.acl.AclOperation;\nimport org.apache.kafka.common.acl.AclPermissionType;\nimport org.apache.kafka.common.resource.ResourcePattern;\nimport org.apache.kafka.common.resource.ResourcePatternFilter;\nimport org.apache.kafka.common.resource.ResourceType;\nimport org.apache.kafka.common.resource.PatternType;\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void createTopicAcl(String principal, String host, AclOperation operation, AclPermissionType permissionType, String topicName) {\n    ResourcePattern resource = new ResourcePattern(ResourceType.TOPIC, topicName, PatternType.LITERAL);\n    AccessControlEntry entry = new AccessControlEntry(principal, host, operation, permissionType);\n    AclBinding aclBinding = new AclBinding(resource, entry);\n\n    try {\n        adminClient.createAcls(Collections.singletonList(aclBinding)).all().get();\n        System.out.println(\"Konu '\" + topicName + \"' i\u00e7in ACL ba\u015far\u0131yla olu\u015fturuldu.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"ACL olu\u015fturulurken hata olu\u015ftu: \" + e.getMessage());\n    }\n}\n\n\/\/ KafkaAdminClientExample s\u0131n\u0131f\u0131 i\u00e7inde bir metot\npublic void deleteTopicAcl(String principal, String topicName) {\n    ResourcePatternFilter resourceFilter = new ResourcePatternFilter(ResourceType.TOPIC, topicName, PatternType.LITERAL);\n    AccessControlEntry entry = new AccessControlEntry(principal, null, AclOperation.ANY, AclPermissionType.ANY); \/\/ null host, ANY operation\/permissionType ile t\u00fcm e\u015fle\u015fenleri sil\n    AclBinding aclBinding = new AclBinding(resourceFilter, entry);\n\n    try {\n        adminClient.deleteAcls(Collections.singletonList(aclBinding.toFilter())).all().get();\n        System.out.println(\"Konu '\" + topicName + \"' i\u00e7in ACL ba\u015far\u0131yla silindi.\");\n    } catch (InterruptedException | ExecutionException e) {\n        System.err.println(\"ACL silinirken hata olu\u015ftu: \" + e.getMessage());\n    }\n}<\/code><\/pre>\n<h4>Metrik ve \u0130zleme<\/h4>\n<p>Kafka k\u00fcmesinin performans\u0131n\u0131 ve sa\u011fl\u0131\u011f\u0131n\u0131 izlemek, operasyonel s\u00fcreklilik i\u00e7in kritik \u00f6neme sahiptir. <code>AdminClient<\/code> do\u011frudan zengin metrikler sunmasa da, Kafka broker&#8217;lar\u0131, \u00fcreticileri ve t\u00fcketicileri JMX (Java Management Extensions) arac\u0131l\u0131\u011f\u0131yla zengin metrikler yay\u0131mlar.<\/p>\n<p>*   <strong>JMX Metriklerini Programatik Olarak \u00c7ekme<\/strong>: JMX exporter&#8217;lar (\u00f6rn. Prometheus JMX exporter) kullan\u0131larak bu metrikler toplanabilir ve izleme sistemlerine aktar\u0131labilir.<br \/>\n*   <strong>Kafka API&#8217;leri \u00dczerinden Temel Metrikler<\/strong>: <code>KafkaProducer<\/code> ve <code>KafkaConsumer<\/code> gibi istemciler, kendi i\u00e7 metriklerini (\u00f6rn. gecikme, throughput, hata oranlar\u0131) <code>metrics()<\/code> metodu arac\u0131l\u0131\u011f\u0131yla sunarlar. Bu metrikler programatik olarak toplanarak \u00f6zel izleme \u00e7\u00f6z\u00fcmlerine entegre edilebilir.<br \/>\n*   <strong><code>describeLogDirs<\/code><\/strong>: Bu metot, her bir broker&#8217;daki log dizinlerinin kullan\u0131m durumunu ve partisyonlar\u0131n bu dizinlere nas\u0131l da\u011f\u0131ld\u0131\u011f\u0131n\u0131 g\u00f6sterir. Disk alan\u0131 y\u00f6netimi i\u00e7in faydal\u0131d\u0131r.<\/p>\n<h3>Geli\u015fmi\u015f Y\u00f6netim Senaryolar\u0131 ve \u0130pu\u00e7lar\u0131<\/h3>\n<p>Programatik Kafka y\u00f6netimi sadece temel g\u00f6revlerle s\u0131n\u0131rl\u0131 de\u011fildir; daha karma\u015f\u0131k senaryolar\u0131 ele almak i\u00e7in geli\u015fmi\u015f yakla\u015f\u0131mlar da mevcuttur.<\/p>\n<h4>Hata Y\u00f6netimi ve Tekrar Deneme Mekanizmalar\u0131<\/h4>\n<p>Da\u011f\u0131t\u0131k sistemlerde API \u00e7a\u011fr\u0131lar\u0131 s\u0131ras\u0131nda a\u011f sorunlar\u0131, broker \u00e7\u00f6kmesi veya zaman a\u015f\u0131mlar\u0131 gibi hatalar meydana gelebilir. <code>AdminClient<\/code> \u00e7a\u011fr\u0131lar\u0131 i\u00e7in sa\u011flam hata y\u00f6netimi ve tekrar deneme (retry) mekanizmalar\u0131 uygulamak \u00f6nemlidir. <code>KafkaFuture<\/code> nesneleri, <code>whenComplete<\/code> veya <code>exceptionally<\/code> gibi metotlarla hata i\u015fleme zincirleri olu\u015fturmaya olanak tan\u0131r. Ge\u00e7ici hatalar i\u00e7in \u00fcstel geri \u00e7ekilme (exponential backoff) stratejileri ile tekrar denemeler uygulanmal\u0131d\u0131r.<\/p>\n<h4>Idempotency ve \u0130\u015flem Garantileri<\/h4>\n<p>Programatik y\u00f6netimde, \u00f6zellikle otomasyon script&#8217;lerinde, i\u015flemlerin idempotent (birden fazla kez \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda ayn\u0131 sonucu veren) olmas\u0131 \u00f6nemlidir. \u00d6rne\u011fin, bir konu olu\u015fturma iste\u011fi, konu zaten mevcutsa hata vermemeli veya mevcut konuyu de\u011fi\u015ftirmemelidir (veya belirli bir politika dahilinde de\u011fi\u015ftirmelidir). <code>AdminClient<\/code>&#8216;\u0131n baz\u0131 metotlar\u0131 do\u011fal olarak idempotenttir (\u00f6rn. <code>createTopics<\/code> ayn\u0131 konuyu tekrar olu\u015fturmaya \u00e7al\u0131\u015f\u0131rken hata vermez), ancak di\u011ferleri i\u00e7in dikkatli olunmal\u0131d\u0131r.<\/p>\n<h4>G\u00fcvenlik<\/h4>\n<p>Kafka k\u00fcmesini programatik olarak y\u00f6netirken g\u00fcvenlik g\u00f6z ard\u0131 edilmemelidir.<\/p>\n<p>*   <strong>SSL\/TLS<\/strong>: Y\u00f6netim istemcisi ile Kafka broker&#8217;lar\u0131 aras\u0131ndaki ileti\u015fimi \u015fifrelemek i\u00e7in SSL\/TLS kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>SASL<\/strong>: \u0130stemcinin kimli\u011fini do\u011frulamak i\u00e7in SASL (Simple Authentication and Security Layer) mekanizmalar\u0131 (\u00f6rn. PLAIN, SCRAM) kullan\u0131lmal\u0131d\u0131r.<br \/>\n*   <strong>ACL&#8217;ler<\/strong>: Y\u00f6netim istemcisinin sadece ihtiya\u00e7 duydu\u011fu kaynaklara ve i\u015flemlere eri\u015fim izni oldu\u011fundan emin olmak i\u00e7in ACL&#8217;ler do\u011fru bir \u015fekilde yap\u0131land\u0131r\u0131lmal\u0131d\u0131r. Y\u00f6netim istemcisi, <code>AdminClient<\/code>&#8216;\u0131n belirli i\u015flemleri ger\u00e7ekle\u015ftirebilmesi i\u00e7in <code>ClusterAction<\/code> iznine sahip olmal\u0131d\u0131r.<\/p>\n<h4>Asenkron \u0130\u015flemler<\/h4>\n<p><code>AdminClient<\/code> API&#8217;si asenkron bir yap\u0131ya sahiptir ve <code>KafkaFuture<\/code> nesneleri d\u00f6nd\u00fcr\u00fcr. Bu, birden fazla y\u00f6netimsel g\u00f6revi paralel olarak \u00e7al\u0131\u015ft\u0131rman\u0131za olanak tan\u0131r ve uygulaman\u0131z\u0131n engellenmesini \u00f6nler. <code>CompletableFuture<\/code> ile birle\u015ftirilerek karma\u015f\u0131k asenkron i\u015f ak\u0131\u015flar\u0131 olu\u015fturulabilir.<\/p>\n<h4>Konfig\u00fcrasyon Y\u00f6netimi<\/h4>\n<p>Programatik olarak yap\u0131lan de\u011fi\u015fikliklerin kal\u0131c\u0131l\u0131\u011f\u0131 ve konfig\u00fcrasyon dosyalar\u0131yla ili\u015fkisi iyi anla\u015f\u0131lmal\u0131d\u0131r. <code>AdminClient<\/code> ile yap\u0131lan baz\u0131 de\u011fi\u015fiklikler (\u00f6rn. konu yap\u0131land\u0131rmalar\u0131) k\u00fcme genelinde kal\u0131c\u0131d\u0131r. Bu de\u011fi\u015fikliklerin bir konfig\u00fcrasyon y\u00f6netim sistemi (\u00f6rn. Git, Ansible, Terraform) ile takip edilmesi, de\u011fi\u015fikliklerin izlenebilirli\u011fini ve geri al\u0131nabilirli\u011fini sa\u011flar.<\/p>\n<h3>\u00d6rnek Kullan\u0131m Senaryolar\u0131<\/h3>\n<p>Kafka&#8217;y\u0131 programatik olarak y\u00f6netmenin pratik uygulamalar\u0131 olduk\u00e7a geni\u015ftir.<\/p>\n<h4>Otomatik Test Ortam\u0131 Kurulumu<\/h4>\n<p>Her test ko\u015fusundan \u00f6nce yeni, izole Kafka konular\u0131 olu\u015fturmak ve test bittikten sonra bunlar\u0131 temizlemek, testlerin tutarl\u0131l\u0131\u011f\u0131n\u0131 ve tekrarlanabilirli\u011fini sa\u011flar. CI\/CD pipeline&#8217;lar\u0131nda bu yakla\u015f\u0131m, entegrasyon testlerini h\u0131zland\u0131rabilir.<\/p>\n<pre><code class=\"language-java\">\/\/ Test \u00f6ncesi konular\u0131 olu\u015ftur\nkafkaAdminClient.createTopic(\"test-topic-1\", 1, (short) 1);\nkafkaAdminClient.createTopic(\"test-topic-2\", 3, (short) 1);\n\n\/\/ Test verisi g\u00f6nder\/t\u00fcket\n\/\/ Test sonras\u0131 konular\u0131 sil\nkafkaAdminClient.deleteTopic(\"test-topic-1\");\nkafkaAdminClient.deleteTopic(\"test-topic-2\");<\/code><\/pre>\n<h4>Dinamik Mikroservis Konfig\u00fcrasyonu<\/h4>\n<p>Yeni bir mikroservis devreye al\u0131nd\u0131\u011f\u0131nda, onun i\u00e7in gerekli Kafka konular\u0131n\u0131, t\u00fcketici gruplar\u0131n\u0131 ve ACL&#8217;leri otomatik olarak olu\u015fturmak, da\u011f\u0131t\u0131m s\u00fcre\u00e7lerini basitle\u015ftirir ve hata olas\u0131l\u0131\u011f\u0131n\u0131 azalt\u0131r. Bu, \u00f6zellikle h\u0131zla b\u00fcy\u00fcyen mikroservis mimarilerinde \u00e7ok de\u011ferlidir.<\/p>\n<h4>Operasyonel Otomasyon<\/h4>\n<p>*   <strong>Otomatik Konu Bak\u0131m\u0131<\/strong>: Belirli bir s\u00fcre kullan\u0131lmayan veya mesaj i\u00e7ermeyen konular\u0131 otomatik olarak tespit edip silmek.<br \/>\n*   <strong>Partisyon Yeniden Dengeleme<\/strong>: Broker&#8217;lar aras\u0131nda partisyonlar\u0131n dengeli da\u011f\u0131l\u0131m\u0131n\u0131 sa\u011flamak veya bir broker&#8217;\u0131n devre d\u0131\u015f\u0131 kalmas\u0131 durumunda partisyonlar\u0131 yeniden atamak.<br \/>\n*   <strong>T\u00fcketici Gecikmesi Y\u00f6netimi<\/strong>: Belirli bir t\u00fcketici grubunun gecikmesi (lag) kritik bir e\u015fi\u011fi a\u015ft\u0131\u011f\u0131nda otomatik olarak uyar\u0131 g\u00f6ndermek veya duruma g\u00f6re offset&#8217;leri s\u0131f\u0131rlama gibi kurtarma i\u015flemleri \u00f6nermek.<\/p>\n<h3>S\u0131k Kar\u015f\u0131la\u015f\u0131lan Zorluklar ve \u00c7\u00f6z\u00fcmleri<\/h3>\n<p>Programatik Kafka y\u00f6netimi bir\u00e7ok avantaj sunsa da, baz\u0131 zorluklarla kar\u015f\u0131la\u015fmak m\u00fcmk\u00fcnd\u00fcr:<\/p>\n<p>*   <strong>API Versiyon Uyumlulu\u011fu<\/strong>: Kafka API&#8217;leri zamanla geli\u015fir. Kulland\u0131\u011f\u0131n\u0131z Kafka istemci k\u00fct\u00fcphanesinin ve <code>AdminClient<\/code>&#8216;\u0131n, hedef Kafka k\u00fcmesinin versiyonuyla uyumlu oldu\u011fundan emin olun.<br \/>\n*   <strong>Da\u011f\u0131t\u0131k Sistem Hatalar\u0131<\/strong>: A\u011f kesintileri, broker \u00e7\u00f6kmesi veya lider se\u00e7imi gibi da\u011f\u0131t\u0131k sistem olaylar\u0131 y\u00f6netim \u00e7a\u011fr\u0131lar\u0131n\u0131 etkileyebilir. Sa\u011flam hata i\u015fleme ve tekrar deneme mant\u0131\u011f\u0131 bu durumlar\u0131 ele almak i\u00e7in kritik \u00f6neme sahiptir.<br \/>\n*   <strong>Hatal\u0131 Konfig\u00fcrasyonlar<\/strong>: Yanl\u0131\u015f partisyon say\u0131s\u0131 veya replikasyon fakt\u00f6r\u00fc gibi hatal\u0131 konu konfig\u00fcrasyonlar\u0131 performans sorunlar\u0131na veya veri kayb\u0131na yol a\u00e7abilir. Konfig\u00fcrasyonlar\u0131 dikkatlice planlay\u0131n ve test edin.<br \/>\n*   <strong>G\u00fcvenlik Konfig\u00fcrasyonlar\u0131<\/strong>: SSL\/TLS, SASL ve ACL&#8217;lerin do\u011fru \u015fekilde yap\u0131land\u0131r\u0131lmas\u0131 karma\u015f\u0131k olabilir. Yanl\u0131\u015f konfig\u00fcrasyonlar eri\u015fim sorunlar\u0131na veya g\u00fcvenlik a\u00e7\u0131klar\u0131na neden olabilir.<\/p>\n<h3>Sonu\u00e7<\/h3>\n<p>Kafka&#8217;y\u0131 programatik olarak y\u00f6netmek, modern veri platformlar\u0131nda operasyonel verimlili\u011fi, \u00f6l\u00e7eklenebilirli\u011fi ve g\u00fcvenilirli\u011fi art\u0131rmak i\u00e7in vazge\u00e7ilmez bir yakla\u015f\u0131md\u0131r. <code>AdminClient<\/code> gibi g\u00fc\u00e7l\u00fc API&#8217;ler sayesinde, konu olu\u015fturmadan ACL y\u00f6netimine kadar bir\u00e7ok kritik g\u00f6revi otomatikle\u015ftirmek ve \u00f6zelle\u015ftirilmi\u015f y\u00f6netim ara\u00e7lar\u0131 geli\u015ftirmek m\u00fcmk\u00fcnd\u00fcr. Java, Python, Go gibi farkl\u0131 dillerdeki istemci k\u00fct\u00fcphaneleri, geli\u015ftiricilere esneklik sunar.<\/p>\n<p>Bu makalede ele al\u0131nan prensipleri ve \u00f6rnekleri uygulayarak, ekipler Kafka altyap\u0131lar\u0131n\u0131 daha \u00e7evik, g\u00fcvenilir ve s\u00fcrd\u00fcr\u00fclebilir bir \u015fekilde y\u00f6netebilirler. Programatik y\u00f6netim, sadece operasyonel y\u00fck\u00fc azaltmakla kalmaz, ayn\u0131 zamanda Kafka&#8217;n\u0131n dinamik do\u011fas\u0131ndan tam olarak yararlanarak de\u011fi\u015fen i\u015f ihtiya\u00e7lar\u0131na h\u0131zla adapte olabilen sistemler in\u015fa etmenin de anahtar\u0131d\u0131r. Gelecekte, Kafka operasyonlar\u0131n\u0131n daha da otomatik hale gelmesi ve yapay zeka destekli y\u00f6netim ara\u00e7lar\u0131n\u0131n y\u00fckseli\u015fiyle, programatik y\u00f6netimin \u00f6nemi daha da artacakt\u0131r.<\/body><\/p>\n","protected":false},"excerpt":{"rendered":"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber\nApache Kafka, y\u00fcksek performansl\u0131, da\u011f\u0131t\u0131k bir ak\u0131\u015f platformu olarak g\u00fcn\u00fcm\u00fcz m","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"csco_page_header_type":"","csco_page_load_nextpost":"","csco_page_subscribe_form":"","csco_page_contact_form":"","footnotes":""},"categories":[1],"tags":[],"class_list":{"0":"post-32902","1":"post","2":"type-post","3":"status-publish","4":"format-standard","6":"category-genel","7":"cs-entry","8":"cs-video-wrap"},"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v20.5 (Yoast SEO v25.3.1) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Kafka&#039;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:locale\" content=\"tr_TR\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Kafka&#039;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber\" \/>\n<meta property=\"og:description\" content=\"Kafka&#039;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber Apache Kafka, y\u00fcksek performansl\u0131, da\u011f\u0131t\u0131k bir ak\u0131\u015f platformu olarak g\u00fcn\u00fcm\u00fcz m\" \/>\n<meta property=\"og:url\" content=\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\" \/>\n<meta property=\"og:site_name\" content=\"Kodlar\u0131n Gizemli D\u00fcnyas\u0131\" \/>\n<meta property=\"article:published_time\" content=\"2025-10-27T03:41:02+00:00\" \/>\n<meta name=\"author\" content=\"Fatih Soysal\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Yazan:\" \/>\n\t<meta name=\"twitter:data1\" content=\"Fatih Soysal\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tahmini okuma s\u00fcresi\" \/>\n\t<meta name=\"twitter:data2\" content=\"22 dakika\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#article\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\"},\"author\":{\"name\":\"Fatih Soysal\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"headline\":\"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber\",\"datePublished\":\"2025-10-27T03:41:02+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\"},\"wordCount\":2828,\"commentCount\":0,\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#respond\"]}],\"copyrightYear\":\"2025\",\"copyrightHolder\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\",\"name\":\"Kafka'y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131\",\"isPartOf\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\"},\"datePublished\":\"2025-10-27T03:41:02+00:00\",\"breadcrumb\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#breadcrumb\"},\"inLanguage\":\"tr\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Anasayfa\",\"item\":\"https:\/\/fatihsoysal.com\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#website\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/\",\"name\":\"Fatihsoysal.com\",\"description\":\"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim\",\"publisher\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"tr\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1\",\"name\":\"Fatih Soysal\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"tr\",\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"contentUrl\":\"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png\",\"width\":512,\"height\":512,\"caption\":\"Fatih Soysal\"},\"logo\":{\"@id\":\"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/\"},\"description\":\"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.\",\"url\":\"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"Kafka'y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/","og_locale":"tr_TR","og_type":"article","og_title":"Kafka'y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber","og_description":"Kafka'y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber Apache Kafka, y\u00fcksek performansl\u0131, da\u011f\u0131t\u0131k bir ak\u0131\u015f platformu olarak g\u00fcn\u00fcm\u00fcz m","og_url":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/","og_site_name":"Kodlar\u0131n Gizemli D\u00fcnyas\u0131","article_published_time":"2025-10-27T03:41:02+00:00","author":"Fatih Soysal","twitter_card":"summary_large_image","twitter_misc":{"Yazan:":"Fatih Soysal","Tahmini okuma s\u00fcresi":"22 dakika"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#article","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/"},"author":{"name":"Fatih Soysal","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"headline":"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber","datePublished":"2025-10-27T03:41:02+00:00","mainEntityOfPage":{"@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/"},"wordCount":2828,"commentCount":0,"publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"inLanguage":"tr","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#respond"]}],"copyrightYear":"2025","copyrightHolder":{"@id":"https:\/\/fatihsoysal.com\/blog\/#organization"}},{"@type":"WebPage","@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/","url":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/","name":"Kafka'y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber - Kodlar\u0131n Gizemli D\u00fcnyas\u0131","isPartOf":{"@id":"https:\/\/fatihsoysal.com\/blog\/#website"},"datePublished":"2025-10-27T03:41:02+00:00","breadcrumb":{"@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#breadcrumb"},"inLanguage":"tr","potentialAction":[{"@type":"ReadAction","target":["https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/fatihsoysal.com\/blog\/kafkayi-programatik-olarak-yonetmek-kapsamli-bir-rehber\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Anasayfa","item":"https:\/\/fatihsoysal.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Kafka&#8217;y\u0131 Programatik Olarak Y\u00f6netmek: Kapsaml\u0131 Bir Rehber"}]},{"@type":"WebSite","@id":"https:\/\/fatihsoysal.com\/blog\/#website","url":"https:\/\/fatihsoysal.com\/blog\/","name":"Fatihsoysal.com","description":"Blog - Yaz\u0131l\u0131m D\u00fcnyas\u0131 Tecr\u00fcbelerim","publisher":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/fatihsoysal.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"tr"},{"@type":["Person","Organization"],"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/002a254750921dcfd568a99e48240dd1","name":"Fatih Soysal","image":{"@type":"ImageObject","inLanguage":"tr","@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/","url":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","contentUrl":"https:\/\/fatihsoysal.com\/blog\/wp-content\/uploads\/2024\/04\/cropped-replicate-prediction-3kgg1hgjn5rgp0cf0p5tr0jw7w-1.png","width":512,"height":512,"caption":"Fatih Soysal"},"logo":{"@id":"https:\/\/fatihsoysal.com\/blog\/#\/schema\/person\/image\/"},"description":"Kullan\u0131m ve kodlama m\u00fckemmeliyetini odak alan uygulamalar olu\u015fturma deneyimine sahip, profesyonel olarak 15+ y\u0131l \u00fczeri deneyime sahip bir yaz\u0131l\u0131m m\u00fchendisi.","url":"https:\/\/fatihsoysal.com\/blog\/author\/fatihsoysal\/"}]}},"yoast_meta":{"yoast_wpseo_title":"","yoast_wpseo_metadesc":"","yoast_wpseo_canonical":""},"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32902","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/comments?post=32902"}],"version-history":[{"count":1,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32902\/revisions"}],"predecessor-version":[{"id":32903,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/posts\/32902\/revisions\/32903"}],"wp:attachment":[{"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/media?parent=32902"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/categories?post=32902"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fatihsoysal.com\/blog\/wp-json\/wp\/v2\/tags?post=32902"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}