ホームページ  >  記事  >  PHPフレームワーク  >  Swoole 非同期プログラミングの実践: 高性能キュー システムの構築

Swoole 非同期プログラミングの実践: 高性能キュー システムの構築

WBOY
WBOYオリジナル
2023-06-13 09:11:531369ブラウズ

インターネット アプリケーションの急速な発展に伴い、コードのパフォーマンスとアプリケーションの効率を向上させるために非同期プログラミングを使用する企業が増えています。 Swoole は、高性能、高い同時実行性、優れたスケーラビリティを備えた、PHP 用の強力な非同期プログラミング フレームワークです。この記事では、Swooleを使って高性能なキューイングシステムを構築する方法を紹介します。

まず、キュー システムとは何かを理解する必要があります。キューイングシステムは、各種サービスのキュー管理やスケジューリングを行うことで、サービスの応答速度やシステムの同時処理能力を向上させるサービス全体のスケジューリングシステムです。実際のアプリケーションでは、キューイング システムは通常、高同時アクセス、非同期タスク スケジューリング、負荷分散などの機能を実装するために使用されます。そのため、キューイング システムの高いパフォーマンスと高可用性が必要です。

次に、次の要件を例として、Swoole を使用して高パフォーマンスのキュー システムを構築する方法を説明します:

  1. 複数のキューをサポートし、キューを管理できます ;
  2. タスクの追加と実行をサポートし、タスクのステータスを管理できます。
  3. # 複数のコンシューマによるタスクの処理をサポートし、コンシューマを管理できます。
  4. タスクの再試行とタイムアウトをサポートします。処理;
  5. タスクの非同期処理と同期処理をサポートします。

それでは、本題に取り掛かり、Swoole を使用してこの高性能キュー システムを構築してみましょう。

1. Swoole の導入

まず、Swoole をプロジェクトに導入する必要があります。ここでは、Composer を通じて Swoole の依存関係を簡単に導入できます。

composer require swoole/swoole

2. キューの構築

キュー システムでは、キューはタスクを保存するための中心的な構造です。キューを構築し、タスクをキューに追加する必要があります。ここではキューの保存方法として Redis を使用し、キューの操作には PHP Redis 拡張機能を使用します。

  1. Redis 接続の作成

Redis を使用する前に、まず Redis との接続を作成する必要があります。ここでは、Redis 接続を管理するための Redis 接続プールを作成します。

SwooleCoroutineChannel を使用します;

クラス RedisPool
{

private $max;
private $pool;

public function __construct($max = 100)
{
    $this->max = $max;
    $this->pool = new Channel($max);
}

public function get($config)
{
    if (!$this->pool->isEmpty()) {
        return $this->pool->pop();
    }

    $redis = new Redis();
    $redis->connect($config['host'], $config['port']);
    $redis->select($config['db']);
    
    return $redis;
}

public function put($redis)
{
    if ($this->pool->length() < $this->max) {
        $this->pool->push($redis);
    } else {
        $redis->close();
    }
}

}

  1. キューを作成します

接続します次に、タスクの追加、タスクの取得、タスクの削除などのキュー操作を管理するキュー クラスを作成します。

class Queue
{

private $redis;

public function __construct($config)
{
    $this->redis = (new RedisPool())->get($config);
}

public function push($queueName, $data)
{
    $this->redis->lpush($queueName, $data);
}

public function pop($queueName)
{
    return $this->redis->rpop($queueName);
}

public function del($queueName, $data)
{
    $this->redis->lrem($queueName, -1, $data);
}

}

3. タスク実行の実装

タスクをキューに追加した後、タスク実行プログラムが必要です。タスクを実行するため。ここでは、コルーチンを使用してタスクの非同期実行を実装し、ワーカー プロセスを使用してタスクの実行効率を向上させます。

  1. ワーカー プロセスの作成

Swoole では、ワーカー プロセスを使用してマルチプロセス処理タスクを実装できます。ここでは、タスクを処理するワーカー プロセスを作成します。

$worker = new SwooleProcessWorker();

  1. コルーチン エグゼキューターの作成

次に、タスクを処理するコルーチン エグゼキューターを作成できます。ここでは、コルーチンを使用して非同期タスクの実行を実装し、Golang スタイルのコルーチン プールを使用して同時処理の効率を向上させます。

class CoroutineExecutor
{

private $pool;
private $redisConfig;

public function __construct($maxCoroutineNum, $redisConfig)
{
    $this->pool = new SwooleCoroutineChannel($maxCoroutineNum);
    $this->redisConfig = $redisConfig;

    for ($i = 0; $i < $maxCoroutineNum; $i++) {
        $this->pool->push(new Coroutine());
    }
}

public function execute($callback, $data)
{
    $coroutine = $this->pool->pop();
    $coroutine->execute($callback, $data, $this->redisConfig);
    $this->pool->push($coroutine);
}

}

  1. コルーチンの作成

次に、実行するコルーチンを作成します。タスク。

class Coroutine
{

private $redis;

public function __construct()
{
    $this->redis = null;
}

public function execute($callback, $data, $config)
{
    if (!$this->redis) {
        $this->redis = (new RedisPool())->get($config);
    }
    
    Coroutine::create(function () use ($callback, $data) {
        call_user_func($callback, $this->redis, $data);
    });
}

}

4. サービスの作成

最後に、Swoole を使用してキューを提供するサービスを作成できます。クエリとタスクによって追加された機能。

  1. キュー管理の実装

Swoole の HTTP サーバーを使用して、サービス ポートの監視を実装し、HTTP リクエストを通じてキュー管理を実行できます。ここではリストの取得、タスクの削除、タスクの追加のためのインターフェースを提供します。

  1. タスク実行の実現

Swoole の TaskWorker プロセスを使用してタスク実行を実装できます。 TaskWorker プロセスにタスクをディスパッチすることにより、TaskWorker プロセスはタスクを非同期に実行します。

class Task
{

public function execute($worker, $workerId, $taskId, $taskData)
{
    $executor = new CoroutineExecutor(64, [
        'host' => '127.0.0.1',
        'port' => 6379,
        'db' => 0
    ]);
    $executor->execute($taskData['callback'], $taskData['data']);

    return true;
}

}

  1. サービスの起動の実装

最後に、サービスの起動と監視を実装できます。ポートを指定し、TaskWorker プロセスを開始してタスクを実行します。

$http = new SwooleHttpServer("127.0.0.1", 9501);
$http->on('start', function () {

echo "Server started

";
});

$http->on('request', function ($request, $response) {

$queue = new Queue([
    'host' => '127.0.0.1',
    'port' => 6379,
    'db' => 0
]);

switch ($request->server['request_uri']) {
    case '/queue/list':
        // 获取队列列表
        break;
    case '/queue/delete':
        // 删除任务
        break;
    case '/queue/add':
        $data = json_decode($request->rawContent(), true);
        $queue->push($data['queue'], $data['data']);
        $http->task([
            'callback' => function ($redis, $data) {
                // 任务执行逻辑
            },
            'data' => $data
        ]);
        break;
    default:
        $response->status(404);
        $response->end();
        break;
}

});

$http-> ;on('タスク', function ($http, $taskId, $workerId, $data) {

$task = new Task();
$result = $task->execute($http, $workerId, $taskId, $data);

return $result;

});

$http->on('finish', function ($http, $taskId, $data) {

// 任务执行完成逻辑

});

$http->start();

5. 概要

この記事では、Swoole を使用して高性能キュー システムを実装する方法を紹介します。Swoole のコルーチンとワーカー プロセスを通じて、非同期タスクの高性能処理を実現し、Redis ストレージ構造を通じて効率的なタスク管理とスケジューリングを実現します。キュー システムは、非同期タスク スケジューリング、高同時アクセス、負荷分散などの機能シナリオで広く使用できます。これは、推進して使用する価値のあるソリューションです。

以上がSwoole 非同期プログラミングの実践: 高性能キュー システムの構築の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。