Littlesqx / aint-queue

:rocket: An async-queue library built on top of swoole, flexable multi-consumer, coroutine supported. 基于 Swoole 的一个异步队列库,可弹性伸缩的工作进程池,工作进程协程支持。
MIT License
178 stars 32 forks source link

结合这个项目有什么好的orm包推荐没有? #28

Closed xieyuhua closed 4 years ago

Littlesqx commented 4 years ago

主要考虑到协程的使用吗?可以 hook 一键开启(支持 PDO),推荐 laravel Eloquent ORM,但是要稍微改造一下,ORM 底层的连接应该从协程连接池获取或协程单例

xieyuhua commented 4 years ago

底层协程方式去操作,也有连接池控制这种,类似

Littlesqx commented 4 years ago

底层协程方式去操作,也有连接池控制这种,类似

推荐你熟悉的 ORM + 连接池(https://github.com/open-smf/connection-pool

如果是现成的,推荐 hyperf 的 orm 组件

xieyuhua commented 4 years ago

`go(function () { // All MySQL connections: [10, 30] $pool = new ConnectionPool( [ 'minActive' => 10, 'maxActive' => 30, 'maxWaitTime' => 5, 'maxIdleTime' => 20, 'idleCheckInterval' => 10, ], new CoroutineMySQLConnector, [ 'host' => '127.0.0.1', 'port' => '3306', 'user' => 'root', 'password' => 'xy123456', 'database' => 'mysql', 'timeout' => 10, 'charset' => 'utf8mb4', 'strict_type' => true, 'fetch_mode' => true, ] ); echo "Initializing connection pool\n"; $pool->init(); defer(function () use ($pool) { echo "Closing connection pool\n"; $pool->close(); });

echo "Borrowing the connection from pool\n";
/**@var MySQL $connection */
$connection = $pool->borrow();

$status = $connection->query('SHOW STATUS LIKE "Threads_connected"');

echo "Return the connection to pool as soon as possible\n";
$pool->return($connection);

var_dump($status);

});`

建议去哪里启动这个比较好,$connection这个是全局都能获取到吗?

Littlesqx commented 4 years ago

这个在 Job 类的 handle() 方法使用,handle 方法已经是协程环境,那么可以从外部获取一个 Pool 实例,然后获取连接设置到 ORM,最后用完了再还到 Pool。也可以做的更好,比如改造 ORM 底层,连接直接从 Pool 获取就好。

xieyuhua commented 4 years ago

handle 方法已经是协程环境??是一个进程对应一个协程吗?Job处理时候 外部pool实例哪里搞比较好,协程执行完一次,自动还回pool,或者手动还回, 类似的这种操作,orm,用的多吗?

Littlesqx commented 4 years ago

handle 方法已经是协程环境??是一个进程对应一个协程吗?Job处理时候 外部pool实例哪里搞比较好,协程执行完一次,自动还回pool,或者手动还回, 类似的这种操作,orm,用的多吗?

一个进程多个协程,一个父协程可以有多个子协程。

我说的都是维护 ORM 的连接,怎么维护看情况而定。可以参考 https://github.com/hyperf/database

xieyuhua commented 4 years ago

应该是我没有表达清楚, 我说的意思是实现Job这个类时候,执行时候是使用协程执行,还是进程,或者是进程里面已经创建好一个了协程??因为你说的已经是协程环境, 当然如果是进程可以创建协程,如果是协程也可以创建子协程,

Littlesqx commented 4 years ago

哈哈,看这里:https://github.com/Littlesqx/aint-queue/blob/master/src/Worker/ConsumerWorker.php#L51-L68

执行的时候是使用协程执行,其实严格来说也是进程,毕竟进程是协程的载体。