0Pricing
PHP Academy · Ders

PHP ile Apache Kafka

Kafka kullanarak yüksek aktarım hızlı olayları akış olarak işleyin.

PHP ile Apache Kafka, CoddyKit'te ücretsiz bir PHP Academy dersidir. Bu, 4 dersinin 3. dersidir. Aşağıdan dersin tamamını ücretsiz okuyabilir, sonra tarayıcıda yerleşik kod editörü ve 7/24 yapay zeka koçu ile uygulamalı olarak pratik yapabilirsin. Bu, PHP Academy öğrenme yolunun bir parçasıdır ve ilerlemeniz web ve CoddyKit uygulaması arasında senkronize olur. PHP Academy kursu toplamda 4 dersten oluşur.

PHP ile Kafka

Kafka bir görev kuyruğu değildir — dağıtık, yalnızca eklemeli bir işlem günlüğüdür. Üreticiler kayıtları konulara ekler; tüketiciler kendi ofsetlerinden okur ve geçmişi yeniden oynatabilir. Bu özellik, Kafka'yı yüksek aktarım hızlı olay akışları, olay kaynaklandırma ve tek bir akıştan birden çok bağımsız tüketici grubunu besleme için ideal kılar.

PHP'de Kafka ile, kendini kanıtlamış C kitaplığı librdkafka üzerine kurulmuş bir bağlayıcı olan ext-rdkafka aracılığıyla iletişim kurarsınız.

Kuyruk Değil, Günlük

RabbitMQ'dan Kafka'ya geçişteki the zihinsel değişim:

  • Mesajlar tüketildiklerinde silinmez; saklama politikasına göre (zamana veya boyuta bağlı olarak) süreleri dolar.
  • Her tüketici kendi ofsetini — günlükteki konumunu — izler.
  • Bir konu bölümlere ayrılır; sıralama yalnızca bir bölüm içinde garanti edilir.
  • Birden çok tüketici grubu aynı konuyu birbirinden bağımsız olarak okur.

Yeniden oynatma, çok sayıda okuyucuya dağıtım veya çok yüksek aktarım hızı gerekiyorsa Kafka uygundur. Mesaj başına yönlendirme ve TTL'ler gerekiyorsa RabbitMQ uygundur.

ext-rdkafka Uzantısını Kurma

Önce the yerel kitaplığı, ardından PECL uzantısını ve isteğe bağlı olarak daha üst düzey bir sarmalayıcıyı kurun.

# Debian/Ubuntu
apt-get install -y librdkafka-dev
pecl install rdkafka
echo "extension=rdkafka.so" >> php.ini

# Optional ergonomic wrapper
composer require longlang/phpkafka  # or arnaud-lb/php-rdkafka-stubs for IDE

Kayıt Üretme

Bir RdKafka\Producer oluşturun, bir konu tutamacı alın ve produce() çağrısını yapın. the Anahtar, kaydın hangi bölüme yerleşeceğini belirler — aynı anahtar aynı bölüme gider ve sıralama korunur. Çıkmadan önce her zaman flush() çağrısını yapın; yoksa arabelleğe alınmış kayıtları kaybedersiniz.

<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$producer = new RdKafka\Producer($conf);

$topic = $producer->newTopic('orders');
// RD_KAFKA_PARTITION_UA = let the partitioner choose by key
$key = 'order-42';
$topic->produce(RD_KAFKA_PARTITION_UA, 0, json_encode(['id' => 42]), $key);

$producer->poll(0);
$result = $producer->flush(10000); // wait up to 10s
if ($result !== RD_KAFKA_RESP_ERR_NO_ERROR) {
    throw new RuntimeException('Failed to flush');
}

Anahtara Göre Bölümlendirme

Bölümlendirme, Kafka'nın ölçeklenebilirliğinin ve sıralamasının temelidir. Varsayılan bölümlendirici, kayıt anahtarının özetini çıkarır: partition = hash(key) % numPartitions. İyi bir anahtar seçmek önemlidir:

  • customerId ile anahtarlama → bir müşterinin tüm olayları sıralı kalır ve tek bir bölümde bulunur.
  • Boş anahtar → bölümler arasında sırayla dağıtım (en yüksek aktarım hızı, sıralama yok).

Bir konunun bölüm sayısını hiçbir zaman azaltamazsınız; ayrıca bölüm eklemek özet eşlemesini yeniden düzenler. Bu nedenle bölümleri en yüksek paralellik gereksinimine göre baştan boyutlandırın.

Tüketici Grupları ve Ofsetler

Üst düzey KafkaConsumer ile birlikte group.id kullanın. Kafka, bölümleri grubun üyelerine dağıtır ve üyeler katıldığında veya ayrıldığında yeniden dengeleme yapar. Her üye yalnızca kendisine atanmış bölümleri okur; böylece ek çaba olmadan yatay ölçekleme elde edersiniz.

<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->set('group.id', 'order-emailers');
$conf->set('auto.offset.reset', 'earliest'); // start of log if no offset
$conf->set('enable.auto.commit', 'false');   // we commit manually

$consumer = new RdKafka\KafkaConsumer($conf);
$consumer->subscribe(['orders']);

while (true) {
    $msg = $consumer->consume(5000);
    if ($msg->err === RD_KAFKA_RESP_ERR_NO_ERROR) {
        handle($msg->payload);
        $consumer->commit($msg); // commit offset AFTER work
    }
}
function handle(string $p): void {}

Ne Zaman Onaylanmalı

Ofsetin onaylanması, teslim semantiğini belirler:

  • İşlemeden sonra onaylama → en az bir kez (onaylamadan önceki bir çökme kaydı yeniden oynatır).
  • İşlemeden önce onaylama → en fazla bir kez (bir çökme kaydı kaybettirir).

Otomatik onaylama (enable.auto.commit=true), işinizin tamamlanıp tamamlanmadığına bakmaksızın zamanlayıcıya göre onaylar — kullanışlıdır, ancak çökme sırasında kayıtları sessizce kaybettirebilir. Bunu devre dışı bırakın ve doğruluğun önemli olduğu durumlarda el ile onaylayın.

Tüketim Hatalarını Ele Alma

consume() işlevinden dönen her sonuç bir mesaj değildir. Hata koduna göre dallanmanız gerekir — __PARTITION_EOF ve __TIMED_OUT başarısızlık değil, normal denetim sinyalleridir.

<?php
$msg = $consumer->consume(2000);
switch ($msg->err) {
    case RD_KAFKA_RESP_ERR_NO_ERROR:
        echo "Got: {$msg->payload} @ offset {$msg->offset}\n";
        break;
    case RD_KAFKA_RESP_ERR__PARTITION_EOF:
        echo "Reached end of partition\n"; // caught up, keep polling
        break;
    case RD_KAFKA_RESP_ERR__TIMED_OUT:
        echo "No message this poll\n";
        break;
    default:
        throw new \Exception($msg->errstr(), $msg->err);
}

Aktarım Hızını Ayarlama

Kafka'nın aktarım hızı toplu işlemeden gelir. Temel üretici ayarları:

  • linger.ms — istek başına daha fazla kaydı toplu işlemek için kısa süre bekler (ör. 5–20 ms).
  • batch.size / queue.buffering.max.messages — daha büyük arabellekler ve daha az gidiş-geliş.
  • compression.type — lz4 veya zstd, ağ maliyetini büyük ölçüde azaltır.
  • acks — kalıcılık için all, daha düşük gecikme için 1.
<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->set('compression.type', 'lz4');
$conf->set('linger.ms', '10');
$conf->set('batch.size', '65536');
$conf->set('acks', 'all');
$producer = new RdKafka\Producer($conf);

Teslim Raporu Geri Çağırmaları

produce() zaman uyumsuz olduğundan başarısız bir gönderim anında hata oluşturmaz. Her kaydın akıbetini öğrenmek için üretici yapılandırmasına bir teslim raporu geri çağırması kaydedin — PHP'de sessiz üretici hatalarını algılamanın tek güvenilir yolu budur.

<?php
$conf = new RdKafka\Conf();
$conf->set('bootstrap.servers', 'localhost:9092');
$conf->setDrMsgCb(function ($producer, $msg) {
    if ($msg->err) {
        fwrite(STDERR, 'Delivery FAILED: ' . rd_kafka_err2str($msg->err) . "\n");
    } else {
        echo "Delivered to partition {$msg->partition} @ offset {$msg->offset}\n";
    }
});
$producer = new RdKafka\Producer($conf);
// poll() services the callback queue; call it after producing
$producer->poll(0);

PHP'ye Özgü Tuzaklar

Kafka uzun ömürlü istemcileri varsayar; PHP'nin istek yaşam döngüsü ise buna ters düşer:

  • Üreticiler zaman uyumsuz olarak arabelleğe alır — betik sona ermeden önce her zaman flush() çağrısını yapın; yoksa kayıtlar kaybolur.
  • Tüketicileri bir süreç yöneticisi altında kalıcı CLI işçileri olarak çalıştırın; bunları hiçbir zaman bir web isteğinin içinde çalıştırmayın.
  • Yeniden dengelemeler tüketimi duraklatır; gruptan çıkarılmamak için mesaj başına işinizi kısa tutun veya max.poll.interval.ms değerini cömertçe ayarlayın.
  • Sessiz hataları yakalamak için log_level değerini ayarlayın ve üreticinin teslim raporu geri çağırmasını kaydedin.

Hızlı Kontrol

Kafka'da sıralama garantileri.

Özet

PHP yaklaşımıyla Kafka:

  • Kafka bir kuyruk değil, yeniden oynatılabilir bir günlüktür; tüketiciler ofsetleri izler.
  • Anahtara göre bölümlendirme, anahtar başına sıralama ve ölçekleme sağlar.
  • Tüketici grupları bölümleri paylaşır ve otomatik olarak yeniden dengelenir.
  • En az bir kez teslim için ofsetleri işten sonra onaylayın; denetim için otomatik onaylamayı devre dışı bırakın.
  • linger.ms, batch.size ve compression.type değerlerini ayarlayın; her zaman flush() çağrısını yapın.

Sırada: Bu temel yapı taşlarını güvenilir, olay odaklı iş akışlarına bağlamak.

Sıkça Sorulan Sorular

“PHP ile Apache Kafka” dersi ücretsiz mi?

Evet — “PHP ile Apache Kafka” dersin tüm metni burada web'de ücretsiz olarak okunabilir. Etkileşimli olarak pratik yapmak (yerleşik kod editörü ve 7/24 yapay zeka koçu) ve PHP Academy kursunun geri kalanını açmak için CoddyKit PRO'ya yükselt. PHP Academy kursu toplamda 4 dersten oluşur.

“PHP ile Apache Kafka” dersinde ne öğreneceğim?

Kafka kullanarak yüksek aktarım hızlı olayları akış olarak işleyin. PHP Academy ile uygulamalı kodu tarayıcıda doğrudan çalıştırarak pratik yaparsın ve 7/24 yapay zeka koçu dersi çalışırken sorularını yanıtlar.

PHP Academy öğrenmeye başlamak için deneyim gerekli mi?

Önceden deneyim gerekmez. CoddyKit'te PHP Academy, başlangıçtan ileri seviyeye kadar yapılandırıldığı için buradan başlayabilir veya başından başlayıp kendi hızında ilerleme yapabilirsin. Bu, 4 dersinin 3. dersidir.

“PHP ile Apache Kafka” dersi ne kadar sürer?

Çoğu CoddyKit dersi yaklaşık 5–10 dakika sürer. Her biri kısa ve etkileşimli olduğu için sabit ilerleme yaparsın ve web ile uygulama arasında tam olarak bıraktığın yerden devam edebilirsin.

Bu PHP Academy dersinde kod yazıp çalıştırabilir miyim?

Evet. Her PHP Academy dersi yerleşik bir kod editörü içerir, bu sayede tarayıcıda gerçek kod yazıp çalıştırabilir ve anlık yapay zeka geri bildirimi alırsın — yerel kurulum gerekli değildir.

Bu kursun tüm dersleri

  1. Eşzamansız Mesajlaşma Neden Önemlidir
  2. PHP'te RabbitMQ ile Çalışma
  3. PHP ile Apache Kafka
  4. Olay Odaklı İş Akışları Oluşturma
← PHP Academy Sayfasına Dön