Heim >Backend-Entwicklung >PHP-Tutorial >Ein vollständiges asynchrones Aufgabensystem basierend auf RabbitMQ und Swoole
Ausgehend vom anfänglichen asynchronen Aufgabensystem mit Einzelprozessverbrauch, implementiert mit redis Mit dem Zusatz Dank des Multiprozess-Verbrauchsmodells von Swoole kann unser asynchrones Aufgabensystem endlich einen weiteren Schritt nach vorne machen.
Aufgrund der Erfahrung der beiden vorherigen einfachen Systeme ist das asynchrone Aufgabensystem, das auf RabbitMQ basiert, weiter entwickelt , einschließlich Mehrprozessverbrauch, Ausnahmewiederholung usw.
Wie Sie auf dem Bild sehen können, ist unser System ein asynchrones Aufgabensystem, das auf Ereignissen basiert. Das heißt, wenn ein Ereignis eintritt, wirft der Produzent das Ereignis an den Planer Der Scheduler ist dafür verantwortlich<.>Fragen Sie ab, welche Aufgaben unter dem -Ereignis stehen, werfen Sie diese Aufgaben dann in die entsprechende Warteschlange, und schließlich verbraucht der Verbraucher die Aufgaben in der Aufgabenwarteschlange
im gesamten System. Ereignisproduzent, der die Nachrichtenereignisse generiert.2 .
Consumer ist für die Verarbeitung von Aufgaben in der Aufgabenwarteschlange verantwortlich.
Der Planer erledigt hauptsächlich zwei Dinge: Zum einen werden Ereignisse registriert, zum anderen werden Aufgaben geplant.
<?php require_once DIR.'/../autoload.php'; use Asynclib\Ebats\Event; try{ $event = new Event('order_paied'); //定义事件 $event->setOptions(['order_id' => 'FB138020392193312']); //事件产生的参数 $event->publish(); }catch (Exception $exc){ echo $exc->getMessage(); }Der Registrierungsereigniscode lautet wie folgt:
Auf diese Weise werden zwei Ereignisse mit jeweils einer Aufgabe registriert
Der spezifische Planungscode ist sehr einfach, daher werde ich nicht auf Details eingehen. Sie können einen Blick auf den Code werfen.
//注册事件 EventManager::register('order_create', 'closeOrder', 'demo', 10);//关闭未付款订单(延迟任务) EventManager::register('order_paied', 'virtualShipping', 'demo'); //虚拟商品自动发货Das Wichtigste in einem asynchronen Aufgabensystem ist der Verbraucher.
Lebenszyklusder nächsten Aufgabe
4. Die Ausführung schlägt fehl und eine RetryException wird ausgelöst, wenn ein erneuter Versuch erforderlich ist. Eine TaskException wird ausgelöst, wenn ein erneuter Versuch erforderlich ist. 5. Der Unterprozess ntask erfasst die Wiederholungsausnahme und wirft die Aufgabe an den Austauscher für verzögerte Aufgaben Exchange [ebats_core_dtask] 6. Ruft die Informationen zur Aufgabenausführung zum Speichern und Anzeigen zurück
1 Der untergeordnete Prozess dtask blockiert und wartet darauf, dass die Aufgabe erfolgreich abgerufen wird.
2 Die Ausführung schlägt fehl und eine RetryException wird ausgelöst. Es ist kein erneuter Versuch erforderlich.
3 -process dtask erfasst die Wiederholungsausnahme und sendet die Aufgabe an den verzögerten Aufgabenaustauscher Exchange[ebats_core_dtask]
4. Ruft die Aufgabenausführungsinformationen zum Speichern und Anzeigen an den übergeordneten Entwickler zurück
Der Verbrauchercode lautet wie folgt:
Im Allgemeinen handelt es sich um ein ereignisbasiertes Aufgabensystem. Können Aufgaben also direkt generiert werden? Die Antwort ist ja.
Sie müssen lediglich einen benutzerdefinierten Planer erstellen, die Planungslogik selbst implementieren und schließlich eine Aufgabe generieren. Der Code lautet wie folgt:
require_once DIR.'/../autoload.php'; require_once DIR.'/task/TaskDemoModel.php'; use Asynclib\Ebats\Worker; //执行结果回调函数 $callback = function ($topic, $taskid, $taskname, $params, $timeuse, $message){ }; $worker = new Worker($callback); //支持多进程消费默认为1 $worker->setQueue('demo'); //队列名和事件的topic一一对应 $worker->run();
Das obige ist der detaillierte Inhalt vonEin vollständiges asynchrones Aufgabensystem basierend auf RabbitMQ und Swoole. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!