Heim >PHP-Framework >Swoole >Swoole asynchrone Programmierpraxis: Erstellen eines Hochleistungs-Warteschlangensystems

Swoole asynchrone Programmierpraxis: Erstellen eines Hochleistungs-Warteschlangensystems

WBOY
WBOYOriginal
2023-06-13 09:11:531416Durchsuche

Mit der rasanten Entwicklung von Internetanwendungen beginnen immer mehr Unternehmen, asynchrone Programmierung zu nutzen, um die Codeleistung und Anwendungseffizienz zu verbessern. Swoole ist ein leistungsstarkes asynchrones Programmierframework für PHP mit hoher Leistung, hoher Parallelität und hervorragender Skalierbarkeit. In diesem Artikel stellen wir vor, wie Sie mit Swoole ein leistungsstarkes Warteschlangensystem aufbauen.

Zuerst müssen wir verstehen, was ein Warteschlangensystem ist. Das Warteschlangensystem ist ein Dienst-Gesamtplanungssystem, das die Reaktionsgeschwindigkeit von Diensten und die gleichzeitigen Verarbeitungsfähigkeiten des Systems durch Warteschlangenverwaltung und Planung verschiedener Dienste verbessert. In praktischen Anwendungen werden Warteschlangensysteme normalerweise verwendet, um Funktionen wie hohen gleichzeitigen Zugriff, asynchrone Aufgabenplanung, Lastausgleich usw. zu implementieren. Daher sind ihre hohe Leistung und hohe Verfügbarkeit erforderlich.

Als nächstes erklären wir anhand der folgenden Anforderungen, wie man mit Swoole ein Hochleistungs-Warteschlangensystem aufbaut:

  1. unterstützt mehrere Warteschlangen und kann Warteschlangen verwalten;
  2. unterstützt das Hinzufügen und Ausführen von Aufgaben kann den Status von Aufgaben verwalten;
  3. unterstützt mehrere Verbraucher bei der Verarbeitung von Aufgaben und bei der Verwaltung von Verbrauchern;
  4. unterstützt die Aufgabenwiederholung und Timeout-Verarbeitung;
  5. Jetzt kommen wir zur Sache und beginnen mit der Verwendung von Swoole zum Aufbau dieses leistungsstarken Warteschlangensystems.

1. Wir stellen Swoole vor

Zuerst müssen wir Swoole in das Projekt einführen. Hier können wir Swoole-Abhängigkeiten einfach über Composer einführen.

Komponist benötigt Swoole/Swoole

2. Erstellen Sie die Warteschlange

Im Warteschlangensystem ist die Warteschlange die Kernstruktur zum Speichern von Aufgaben. Wir müssen eine Warteschlange erstellen und Aufgaben zur Warteschlange hinzufügen. Hier verwenden wir Redis als Warteschlangenspeichermethode und verwenden die PHP Redis-Erweiterung zum Betreiben der Warteschlange.

Redis-Verbindung erstellen
  1. Bevor wir Redis verwenden, müssen wir zunächst eine Verbindung zu Redis erstellen. Hier erstellen wir einen Redis-Verbindungspool, um Redis-Verbindungen zu verwalten.

use SwooleCoroutineChannel;

class 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();
    }
}

}

Eine Warteschlange erstellen
  1. Als nächstes können wir eine Warteschlangenklasse erstellen, um Warteschlangenvorgänge zu verwalten, einschließlich Aufgabenhinzufügung, Aufgabenerfassung und Aufgabenlöschvorgänge.

Klassenwarteschlange

{

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. Aufgabenausführung implementieren

Nachdem wir Aufgaben zur Warteschlange hinzugefügt haben, benötigen wir einen Aufgabenausführer, der die Aufgaben ausführt. Hier verwenden wir Coroutinen, um die asynchrone Ausführung von Aufgaben zu implementieren, und verwenden Worker-Prozesse, um die Effizienz der Aufgabenausführung zu verbessern.

Worker-Prozess erstellen
  1. In Swoole können wir Worker-Prozesse verwenden, um Multiprozess-Verarbeitungsaufgaben zu implementieren. Hier erstellen wir einen Worker-Prozess, um die Aufgabe zu erledigen.

$worker = new SwooleProcessWorker();

Erstellen eines Coroutine-Executors
  1. Als nächstes können wir einen Coroutine-Executor erstellen, um Aufgaben zu erledigen. Hier verwenden wir Coroutinen, um die asynchrone Aufgabenausführung zu implementieren, und verwenden Coroutine-Pools im Golang-Stil, um die Effizienz der gleichzeitigen Verarbeitung zu verbessern.

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);
}

}

Eine Coroutine erstellen
  1. Als nächstes können wir eine Coroutine erstellen, um Aufgaben auszuführen.

Klasse 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. Erstellen Sie einen Dienst

Schließlich können wir Swoole verwenden, um einen Dienst zu erstellen, der Funktionen zur Warteschlangenabfrage und zum Hinzufügen von Aufgaben bereitstellt.

Warteschlangenverwaltung implementieren
  1. Wir können den HTTP-Server von Swoole verwenden, um die Überwachung des Service-Ports zu implementieren und die Warteschlangenverwaltung über HTTP-Anfragen durchzuführen. Hier stellen wir Schnittstellen zur Listenerfassung, Aufgabenlöschung und Aufgabenergänzung zur Verfügung.

Aufgabenausführung implementieren
  1. Wir können den TaskWorker-Prozess von Swoole verwenden, um die Aufgabenausführung zu implementieren. Durch die Zuteilung von Aufgaben an den TaskWorker-Prozess führt der TaskWorker-Prozess die Aufgaben asynchron aus.

Klassenaufgabe

{

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;
}

}

Dienststart implementieren
  1. Schließlich können wir den Dienststart implementieren, den Port abhören und den TaskWorker-Prozess starten, um Aufgaben auszuführen.

$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('task', 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. Zusammenfassung

In diesem Artikel wird erläutert, wie Sie mit Swoole ein leistungsstarkes Warteschlangensystem implementieren. Durch die Coroutinen und Worker-Prozesse von Swoole können wir eine leistungsstarke Verarbeitung asynchroner Aufgaben sowie eine effiziente Aufgabenverwaltung und -verwaltung durch die Redis-Speicherstruktur erreichen. Planung. Ein solches Warteschlangensystem kann häufig in Funktionsszenarien wie der asynchronen Aufgabenplanung, dem hohen gleichzeitigen Zugriff und dem Lastausgleich eingesetzt werden. Es ist eine Lösung, die es wert ist, gefördert und verwendet zu werden

Das obige ist der detaillierte Inhalt vonSwoole asynchrone Programmierpraxis: Erstellen eines Hochleistungs-Warteschlangensystems. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn