hurah / events
基于inotifywait的事件处理/任务委派系统
v1.0.26
2024-06-12 16:59 UTC
Requires
- php: ^8.3
- ext-json: *
- hurah/data-types: ^v1
- psr/log: ^1.1
- symfony/console: ^5.4
Requires (Dev)
- phpunit/phpunit: ^9.3@dev
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"