hyperf/gotask

Go 语言版的 Swoole TaskWorker 替代方案


README

英文 | 中文

Build Status

GoTask 在 Swoole 中启动一个 Go 进程作为 Sidecar,并建立一个双向 IPC,以便将繁重任务卸载到 Go。可以将其视为 Go 中的 Swoole Taskworker。

composer require hyperf/gotask

特性

  • 高性能,占用资源小。
  • 基于 Swoole 4 协程 socket API。
  • 支持 Unix Socket、TCP 和 stdin/stdout 管道。
  • 支持 PHP 到 Go 和 Go 到 PHP 的调用。
  • 自动 Sidecar 生命周期管理。
  • 正确处理远程错误。
  • 支持结构化有效载荷和二进制有效载荷。
  • Sidecar API 与 net/rpc 兼容。
  • 内置连接池。
  • 可选集成 Hyperf 框架。

非常适合

  • Swoole 中的阻塞操作,例如 MongoDB 查询。
  • 密集型 CPU 操作,例如编码和解码。
  • 利用 Go 生态系统,例如 Kubernetes 客户端。

要求

  • PHP 7.2+
  • Go 1.13+
  • Swoole 4.4LTS+
  • Hyperf 1.1+ (可选)

任务交付演示

package main

import (
    "github.com/hyperf/gotask/v2/pkg/gotask"
)

type App struct{}

func (a *App) Hi(name string, r *interface{}) error {
    *r = map[string]string{
        "hello": name,
    }
    return nil
}

func main() {
    gotask.SetAddress("127.0.0.1:6001")
    gotask.Register(new(App))
    gotask.Run()
}
<?php

use Hyperf\GoTask\IPC\SocketIPCSender;
use function Swoole\Coroutine\run;

require_once "../vendor/autoload.php";

run(function(){
    $task = new SocketIPCSender('127.0.0.1:6001');
    var_dump($task->call("App.Hi", "Hyperf"));
    // [ "hello" => "Hyperf" ]
});

资源

英文文档尚未完成!请先查看示例。

基准测试

https://github.com/reasno/gotask-benchmark

致谢