Redpanda를 PHP와 함께 사용하는 방법

이 블로그에서는 Redpanda를 설정하고 PHP와 함께 사용하는 방법을 보여드리겠습니다.

Docker 설정에서 매우 간단한 생산자 및 소비자 예제를 빌드합니다.

이것은 Redpanda에 대한 소개이므로 Redpanda 또는 유사한 스트리밍 플랫폼에 대한 경험이 이미 있는 경우 this one on consistency 또는 this one on autotuning 와 같은 고급 주제에 대한 일부 게시물을 확인할 수 있습니다.

지금까지 들으셨겠지만 Redpanda는 APache Kafka®와 API 호환됩니다. 즉, Kafka용으로 생성된 수많은 클라이언트 라이브러리를 활용할 수 있습니다(지원되지 않는 것을 발견한 경우 our Slack community에서 당사 팀에 문의하십시오. ).

이 경우 PHP 확장simple_kafka_client을 사용합니다.

도커 설정 준비



먼저 PHP 컨테이너용 Dockerfile을 만듭니다.

FROM php:8.0-cli-alpine3.13

Install packages
RUN apk --no-cache add bash gcc g++ make autoconf && \
    apk add librdkafka librdkafka-dev \
                    --update-cache --repository http://dl-3.alpinelinux.org/alpine/edge/community && \
    pecl install simple_kafka_client && \
    docker-php-ext-enable simple_kafka_client


그런 다음 다음과 같이 docker-compose.yml를 생성해 보겠습니다.

version: '3.7'
services:
  php:
    build:
      context: ./
    tty: true
    working_dir: /src
    volumes:
      - ./src:/src
  redpanda:
    entrypoint:
      - /usr/bin/rpk
      - redpanda
      - start
      - --smp
      - '1'
      - --reserve-memory
      - 0M
      - --overprovisioned
      - --node-id
      - '0'
      - --kafka-addr
      - PLAINTEXT://0.0.0.0:29097,OUTSIDE://0.0.0.0:9097
      - --advertise-kafka-addr
      - PLAINTEXT://redpanda:29097,OUTSIDE://redpanda:9097
      - --check=false
    image: vectorized/redpanda:v21.4.12
    ports:
      - 9097:9097
      - 29097:29097


PHP 코드 예제 생성



다음으로 예제를 사용하여 src 폴더를 만듭니다.
이 폴더는 Docker 설정에 마운트됩니다.

mkdir src;cd src


그런 다음 producer.php 폴더에 다음 내용으로 src를 생성해 보겠습니다.

<?php

declare(strict_types=1);

use SimpleKafkaClient\Configuration;
use SimpleKafkaClient\Message;
use SimpleKafkaClient\Producer;

$conf = new Configuration();
$conf->set('metadata.broker.list', 'redpanda:9097');
$conf->set('compression.codec', 'zstd');

$producer = new Producer($conf);
$topic = $producer->getTopicHandle('php-test-topic');

for ($i = 0; $i < 10; ++$i) {
    $topic->producev(
        RD_KAFKA_PARTITION_UA,
        RD_KAFKA_MSG_F_BLOCK, // will block produce if queue is full
        sprintf('test message-%d',$i),
        sprintf('test-key-%d', $i),
        [
            'some' => sprintf('header value %d', $i)
        ]
    );

    $producer->poll(0);
}

$result = $producer->flush(20000);

echo sprintf('Produced %d messages', $i) . PHP_EOL;

if (RD_KAFKA_RESP_ERR_NO_ERROR !== $result) {
    echo 'Was not able to shutdown within 20s. Messages might be lost!' . PHP_EOL;
}


다음으로 consumer.php 폴더에 다음 내용으로 src를 생성해 보겠습니다.

<?php

declare(strict_types=1);

use SimpleKafkaClient\Configuration;
use SimpleKafkaClient\Consumer;

$conf = new Configuration();
$conf->set('group.id', 'php-consumer');
$conf->set('metadata.broker.list', 'redpanda:9097');
$conf->set('auto.offset.reset', 'earliest');
$conf->set('enable.partition.eof', 'true');

$consumer = new Consumer($conf);
$consumer->subscribe(['php-test-topic']);

while (true) {
    $message = $consumer->consume(20000);

    if (RD_KAFKA_RESP_ERR__PARTITION_EOF === $message->err) {
        echo 'Reached end of partition, shutting down' . PHP_EOL;
        break;
    } else if (RD_KAFKA_RESP_ERR__TIMED_OUT === $message->err) {
        echo 'Timed out without receiving a new message, waiting for more messages...' . PHP_EOL;
        continue;
    } else if (RD_KAFKA_RESP_ERR_NO_ERROR !== $message->err) {
        echo kafka_err2str($message->err) . PHP_EOL;
        continue;
    }

    echo sprintf(
            'Read message with key:%s payload:%s topic:%s partition:%d offset:%d',
            $message->key,
            $message->payload,
            $message->topic_name,
            $message->partition,
            $message->offset
        ) . PHP_EOL;
}


예제 실행



이제 모든 것을 종합하고 예제를 실행해 보겠습니다.

docker-compose up -d
docker-compose exec php php producer.php
docker-compose exec php php consumer.php


다음에는 무엇을 만들 것인가?



보시다시피 Redpanda와 PHP 통합을 설정하는 것은 매우 쉽습니다. 직접 해보십시오. 무한한 사용 사례가 있습니다. 여기서 구축한 것은 가장 간단한 예일 뿐입니다. Redpanda 및 Redpanda로 수행할 수 있는 작업에 대해 자세히 알아보려면 other tutorials here 또는 join our Slack community을 확인하여 엔지니어와 직접 상호 작용하십시오.

이 블로그는 Nick Chiu가 기여했습니다.

좋은 웹페이지 즐겨찾기