trabajador cómo escribir grupo de conexiones mysql

En primer lugar, debemos entender por qué se usa el grupo de conexiones y qué problemas puede resolver el grupo de conexiones por usted.

El papel principal del grupo de conexiones
1. Reduzca la sobrecarga de establecer tres protocolos de enlace TCP con el servidor de datos y cierre la conexión y agite cuatro veces, reduciendo así la carga en el cliente y el servidor mysql, acortando el tiempo de respuesta de la solicitud
2. Reduciendo el número de conexiones concurrentes a la base de datos, es decir, la solución Demasiadas conexiones de la base de datos causadas por demasiados servidores de aplicaciones

Si se trata de resolver el problema 1
, la agrupación de conexiones de la base de datos no es el método más eficiente en Workman. Debido a que PHP es de proceso único y de subproceso único, el uso de PHP para implementar un grupo de conexiones de base de datos definitivamente debe usar un proceso separado para hacerlo, entonces involucrará la comunicación entre procesos, de modo que el proceso de comunicarse directamente con mysql se convierta en el grupo de conexiones. La comunicación de mysql aumenta la carga en el lado de la aplicación.

La forma más eficiente de resolver el problema 1 es establecer una única instancia de base de datos para cada proceso de negocio (como la clase de base de datos proporcionada por trabajador) para implementar una conexión de base de datos larga, de modo que todas las solicitudes de cada proceso usen su propia conexión de base de datos larga. El ciclo de vida del proceso es solo la sobrecarga de un protocolo de enlace TCP y una onda de desconexión, y la aplicación se comunica directamente con mysql. No hay un grupo intermedio de comunicación IPC entre procesos en el medio del grupo de conexiones. El rendimiento es el más alto y no hay nadie.

Si se trata de la pregunta 2,
primero mire cuántos servidores de aplicaciones hay, y cada servidor tiene múltiples conexiones concurrentes a mysql. Si solo tiene 10 servidores de aplicaciones, 50 procesos por servidor y 1 conexión de base de datos por proceso, entonces solo hay 10 * 50 = 500 conexiones concurrentes (conexiones no activas) al servidor mysql y 500 conexiones concurrentes a mysql Es pan comido. Para resolver el problema 2, no es necesario usar el grupo de conexiones.

Si tiene 1000 servidores de aplicaciones, es necesario un grupo de conexiones, pero este grupo de conexiones no puede ser un grupo de conexiones que se ejecute en el servidor de aplicaciones local, porque 1000 servidores de aplicaciones tienen 1000 grupos de conexiones, incluso si cada grupo de conexiones solo Abra 10 conexiones, luego la cantidad de conexiones de la base de datos se completará fácilmente. Por lo tanto, no espere abrir el grupo de conexiones implementado por varios procesos de tareas en el servidor actual para resolver este problema.

En un clúster de 1000 servidores de aplicaciones, tampoco es confiable involucrar varios procesos en cada servidor para implementar la agrupación de conexiones. El método que realmente puede resolver el problema 2 es establecer un servidor o clúster de grupo de conexión de base de datos independiente para administrar todos los enlaces de la base de datos a nivel mundial.

En resumen,
si el grupo de conexiones mysql para PHP se implementa únicamente para la pregunta 1, entonces el singleton de la base de datos es un enfoque más simple y más eficiente que el denominado grupo de conexiones.
Si se trata de lograr el problema 2, entonces la empresa también debe tener una cierta escala. Si realmente desea utilizar Workman para hacer un grupo de conexiones por separado, la siguiente es una manera simple de establecer algunos procesos de tareas, cada proceso crea una conexión de base de datos El proceso de tarea envía la solicitud sql al servidor mysql. Después de que el servidor mysql regresa, el proceso de tarea envía el resultado al iniciador sql.

El código del grupo de conexiones es similar al siguiente: si se trata de un grupo de grupos de conexiones compuesto por varios servidores, es mejor agregar un lvs frente al trabajador para llamar
// task worker,使用Text协议
$task_worker = new Worker('Text://0.0.0.0:1234');
$task_worker->count = 64;
$task_worker->name = 'MysqlTask';
$task_worker->onMessage = function($connection, $sql)
{
     // 执行sql.... 得到结果,这里省略....
     $sql_result = your_mysql_query($sql);
     // 发送结果
     $connection->send(json_encode($sql_result));
};


use \Workerman\Connection\AsyncTcpConnection;

// 与远程连接池服务建立异步链接,ip为远程连接池服务的ip,如果是集群就是lvs的ip
$sql_connection = new AsyncTcpConnection('Text://ip:1234');
// 发送sql
$sql_connection->send("SELECT ... FROM .....");
// 异步获得sql结果
$sql_connection->onMessage = function($sql_connection, $sql_result)
{
     // 这里只是打印结果
     var_dump(json_decode($task_result));
};
// 执行异步链接
$sql_connection->connect();

Publicado 23 artículos originales · ganado elogios 2 · Vistas 5260

Supongo que te gusta

Origin blog.csdn.net/bianlitongcn/article/details/79025537
Recomendado
Clasificación