Coyotes 的诞生起源于在使用 Laravel 的定时任务时,由于 PHP 本身的限制(不安装线程相关扩展),无法实现并发的任务执行,如果任务执行时间过长,就会影响到其它定时任务的执行。不同于其它重量级任务队列,Coyotes 仅仅提供了对命令行程序执行的支持,这样就避免了开发者需要学习任务队列相关 API,针对任务队列开发任务程序的需要。只需要提供一个可执行的文件或者脚本执行命令,Coyotes 就可以并发的执行。
channel-default string
默认channel名称,用于消息队列 (default "default")
colorful-tty
是否启用彩色模式的控制台输出
concurrent int
并发执行线程数 (default 5)
host string
redis连接地址,必须指定端口(depressed,使用redis-host) (default "127.0.0.1:6379")
http-addr string
HTTP监控服务监听地址+端口 (default "127.0.0.1:60001")
password string
redis连接密码(depressed,使用redis-password)
pidfile string
pid文件路径 (default "/tmp/coyotes.pid")
redis-db int
redis默认数据库0-15
redis-host string
redis连接地址,必须指定端口 (default "127.0.0.1:6379")
redis-password string
redis连接密码
task-mode
是否启用任务模式,默认启用,关闭则不会执行消费 (default true)
编译安装需要安装 Go1.7+,执行以下命令编译
make build-mac
上述命令编译后是当前平台的可执行文件(./bin/coyotes)。比如在Mac系统下完成编译后只能在Mac系统下使用,Linux系统下编译则可以在Linux系统下使用。 如果要在Mac系统下编译Linux系统下使用的可执行文件,需要本地先配置好交叉编译选线,之后执行下面的命令完成Linux版本编译
make build-linux
将生成的执行文件(在bin目录)复制到系统的/usr/local/bin
目录即可。
mv ./bin/coyotes /usr/local/bin/coyotes
项目目录下提供了supervisor.conf
配置文件可以直接在supervisor下使用,使用supervisor管理Coyotes进程。Coyotes在启动之前需要确保Redis服务是可用的。
/usr/local/bin/coyotes -redis-host 127.0.0.1:6379 -password REDIS访问密码
如果需要退出进程,需要向进程发送USR2
信号,以实现平滑退出。
kill -USR2 $(pgrep coyotes)
请不要直接使用
kill -9
终止进程,使用它会强制关闭进程,可能会导致正在执行中的命令被终止,造成任务队列数据不完整。
将待执行的任务推送给 Coyotes 执行有两种方式
直接将任务写入到Redis的队列task:prepare:queue
使用HTTP API
将任务以json编码的形式写入到Redis的task:prepare:queue
即可。
$redis->lpush('task:prepare:queue', json_encode([ 'task' => $taskName, 'chan' => $channel, 'ts' => time(), ], JSON_UNESCAPED_SLASHES | JSON_UNESCAPED_UNICODE))
写入到task:prepare:queue
之后,Coyotes会实时的去从中取出任务分发到相应的channel队列供worker消费。
Request:
POST /channels/default HTTP/1.1 Accept: */* Host: localhost:60001 content-type: multipart/form-data; boundary=--------------------------019175029883341751119913 content-length: 179 ----------------------------019175029883341751119913 Content-Disposition: form-data; name="task" ping -c 40 baidu.com ----------------------------019175029883341751119913--
Response:
HTTP/1.1 200 OK Content-Type: application/json; charset=utf-8 Date: Mon, 10 Apr 2017 13:05:56 GMT Content-Length: 92 {"status_code":200,"message":"ok","data":{"task_name":"ping -c 40 baidu.com","result":true}}
Coyotes 会使用shell执行任务队列里的任何命令,包括系统相关的命令,如果不严格控制好输入,恶意用户可以非常轻松的拿到系统的root权限。
一定不要直接开放给外网,只在内部信任的网络使用,比如绑定http地址到192.168
开头的网卡或者127.0.0.1
本地网络
如果执行的命令包含来自用户的输入,一定要对输入内容进行严格检查,否则会引起命令注入,造成严重的安全问题,不要相信任何来自用户的输入
不要使用root权限执行
解决退出信号会传递到子进程的问题
队列channel持久化
支持单个channel的退出
排队中的任务取消
实现队列调度器
使用可选后端记录任务执行结果、任务执行结果回调
实现RabbitMQ作为broker的支持
队列状态监控
集群支持(任务分发,新增队列)
支持脚本文件实时分发、执行
定时任务执行能力,发送一个任务到队列,设定一个执行时间,时间到了的时候再执行该任务(延迟执行)
增加配置文件
增加对Redis Sentinel和Redis Cluster的支持
解决可以执行任意系统命令带来的安全问题
问题内容: 我正在尝试使用以下代码执行Redis的几种异步方法 所有方法成功执行 但是我得到了错误 该方法被执行并返回true,它可能将其解释为true,但是我不明白为什么它必须使用该方法应用于它? 我可以通过将一个函数(err,结果)作为最后一个元素添加到client.hincrby中来获得增量的结果。但是,如何在end函数的result变量中获得所有结果呢? 问题答案: 我想您使用的async
问题内容: 我正在尝试使用Shell脚本来启动命令。我不在乎是否/何时/如何/为什么完成。我希望该过程开始并运行,但是我希望能够立即回到我的外壳… 问题答案: 您可以只在后台运行脚本: 请注意,这与将脚本放入内部不同,后者可能无法完成您想要的操作。
问题内容: 我需要在 node.js 函数中 它将 同步 执行给定的命令行并返回该命令文本的所有标准输出。 ps。同步是错误的。我知道。仅供个人使用。 更新 现在我们有了mgutz的解决方案,该解决方案为我们提供了退出代码,但没有stdout!仍在等待更准确的答案。 问题答案: Node.js(从0.12版本开始-已有一段时间)支持: 您现在可以直接执行以下操作: 它会做您期望的。(默认将I /O
异步注解@Async,默认情况下是不生效的,需要的话可以启用. 该加载器有一个可选参数,线程池大小,默认是32,详情可以查阅org.nutz.aop.interceptor.async.AsyncAopIocLoader @IocBy( args={"*json","ioc/", "*anno","net.wendal.nutzbook", "*a
Node 库以多种方式处理异步功能。最常见的模式是 error-first callbacks,但是你还可能会遇到 streams、promises、event emitters、child processes, 或 observables。gulp 任务(task)规范化了所有这些类型的异步功能。 任务(task)完成通知 当从任务(task)中返回 stream、promise、event e
null
修改项目配置 'url_model' => 3, # cd 到项目www目录下 # php index.php index user b 1 以上指令表示控制器为Index的user方法,可以通过$_GET['b']获取参数值
也可以直接执行一个SQL命令,即执行Insert, Update, Delete 等操作。此时不管数据库是何种类型,都可以使用 ` 和 ? 符号。 sql = "update `userinfo` set username=? where id=?" res, err := engine.Exec(sql, "xiaolun", 1)