hurah/events

基于inotifywait的事件处理/任务委派系统

v1.0.26 2024-06-12 16:59 UTC

This package is auto-updated.

Last update: 2024-09-12 17:37:52 UTC


README

一个简单的基于文件的任务委派解决方案。

⚠️ 无锁定:本包旨在作为任务委派的一个简单解决方案,适用于无需扩展的场景。它假定每个特定任务的处理器只运行一次。同时运行多个相同处理器的实例可能会导致任务多次执行。

使用场景

  • 使通用软件可扩展。
  • 将耗时工作移至单独的后台进程。
  • 防止缓慢或可能不可用的资源降低您系统的性能。

安装

    composer require hurah/events

设置

由于这是一个基于文件的系统,需要一个空目录以供系统存储数据。如果您希望事件处理器尽可能接近实时运行,可以使用Inotifywait之类的工具。如果延迟不是问题且无法安装Inotifywait,也可以使用cron作业。

分发事件

从需要委派任务或一些任务的代码处

$exampleContextData = ['product_id' => 123];
$dispatcher = new Dispatcher('/some/root/directory/where/events/will/live');
$dispatcher->dispatch('product/created', $exampleContextData);

实现处理器

创建一个新的类,让它继承AbstractHandler。在最基本的形式中,您的处理器将只实现handleTask,您应该使用它来实施执行您想要的任何任务的逻辑。

class MyHandler extends AbstractHandler
{
    protected function handleTask(Context $myTaskData): int
    {
      return Task::SUCCESS;
    }
}

返回类型和失败

当按照上述方式实现处理器时,您必须返回正确的指令,以便处理器知道接下来要做什么。

事件

当分发事件时,它会通过一个唯一的名称(例如,product/created)来标识,任何数量的处理器都可能正在监听。每个处理器存储一个包含上下文数据的单独json文件。当处理器被触发时,每个任务按顺序执行。

事件树

事件类型由一个或多个通过正斜杠分隔的字符串组成。事件监听器可以绑定到事件树的任何级别。设置为监听"product"事件的监听器,当分发"product/created"事件时将被触发等。

运行处理器

您需要一些机制来按需触发处理器代码或(不推荐)定期运行处理器代码以检查新事件并处理它们。

手动/定期

php bin/application.php worker:runner <handler_name> <event_type> <handler> <event_root>

按需/自动

bin目录包含以下bash脚本,您可以使用它来监视事件目录。此脚本应基于每个事件运行,可能使用supervisor或systemd以在出现故障时自动重启。

#!/bin/sh

# Usage:
# ./inotify-wait.sh <event-directory> <handler-name> <handler-fully-qualified-class-name>
#


echo "Starting listener in $1"
DIRECTORY="$1/$3/$2_listener/inbox"

echo "Event directory $DIRECTORY";

if [ ! -d "$DIRECTORY" ]; then
  echo "Creating $DIRECTORY which will act as the event inbox"
  mkdir -p "$DIRECTORY"
fi

inotifywait -m "$DIRECTORY" -e create |
    while read path action file; do
	       echo "$action - $path - $file"
	       /usr/bin/pwd
        /usr/bin/php ./application.php worker:runner $2 $3 $4 $1
    done

echo "Listener stopped"

antonboutkam