Workerman comment écrire un pool de connexion mysql

Tout d'abord, nous devons comprendre pourquoi le pool de connexions est utilisé et quels problèmes le pool de connexions peut résoudre pour vous.

Le rôle principal du pool de connexions
1. Réduisez le temps nécessaire pour établir trois prises de contact TCP avec le serveur de données et fermer la connexion et onduler quatre fois, réduisant ainsi la charge sur le client et le serveur mysql, raccourcissant le temps de réponse de la demande
2. Réduisant le nombre de connexions simultanées à la base de données, c'est-à-dire la solution Trop de connexions à la base de données provoquées par trop de serveurs d'applications

Pour résoudre le problème 1
, le regroupement de connexions à la base de données n'est pas la méthode la plus efficace dans Workerman. Étant donné que PHP est un processus unique et un thread unique, l'utilisation de PHP pour implémenter un pool de connexions de base de données doit certainement utiliser un processus distinct pour le faire, alors cela impliquera une communication inter-processus, de sorte que le processus de communication directe avec mysql devienne le pool de connexions. La communication de mysql augmente la charge côté application.

Le moyen le plus efficace de résoudre le problème 1 consiste à établir une instance de base de données unique pour chaque processus métier (comme la classe DB fournie par Workerman) pour implémenter une longue connexion à la base de données, de sorte que toutes les demandes pour chaque processus utilisent leur propre connexion à la longue base de données. Le cycle de vie du processus n'est que la surcharge d'une poignée de main TCP et d'une vague de déconnexion, et l'application communique directement avec mysql. Il n'y a pas de pool intermédiaire de communication IPC entre les processus au milieu du pool de connexions. Les performances sont les plus élevées et il n'y a personne.

Si c'est pour la question 2,
regardez d'abord combien de serveurs d'applications il y a, et chaque serveur a plusieurs connexions simultanées à mysql. Si vous n'avez que 10 serveurs d'applications, 50 processus par serveur et 1 connexion à la base de données par processus, alors il n'y a que 10 * 50 = 500 connexions simultanées (non actives) au serveur mysql et 500 connexions simultanées à mysql C'est un jeu d'enfant. Pour résoudre le problème 2, il n'est pas nécessaire d'utiliser le pool de connexions.

Si vous avez 1000 serveurs d'applications, un pool de connexions est nécessaire, mais ce pool de connexions ne peut pas être un pool de connexions s'exécutant sur le serveur d'applications local, car 1000 serveurs d'applications ont 1000 pools de connexions, même si chaque pool de connexions uniquement Ouvrez 10 connexions, le nombre de connexions à la base de données sera facilement rempli. Ne vous attendez donc pas à ouvrir le pool de connexions implémenté par plusieurs processus de tâche sur le serveur actuel pour résoudre ce problème.

Dans un cluster de 1 000 serveurs d'applications, il est également peu fiable d'engager plusieurs processus sur chaque serveur pour implémenter le regroupement de connexions. La méthode qui peut vraiment résoudre le problème 2 consiste à établir un serveur de pool de connexions de base de données indépendant ou un cluster pour gérer toutes les liaisons de base de données à l'échelle mondiale.

En résumé,
si le pool de connexions mysql pour PHP est implémenté uniquement pour la question 1, alors la base de données singleton est une approche plus simple et plus efficace que le soi-disant pool de connexions.
Pour atteindre le problème 2, l'entreprise doit également avoir une certaine échelle. Si vous voulez vraiment utiliser Workerman pour créer un cluster de pools de connexions distinct, voici un moyen simple d'établir des processus de tâche, chaque processus crée une connexion à la base de données, Le processus de tâche envoie la requête sql au serveur mysql. Après le retour du serveur mysql, le processus de tâche envoie le résultat à l'initiateur sql.

Le code du pool de connexions est similaire au suivant: S'il s'agit d'un cluster de pools de connexions composé de plusieurs serveurs, il est préférable d'ajouter un lvs devant Workerman pour appeler
// 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();

Publié 23 articles originaux · louange gagné 2 · Vues 5260

Je suppose que tu aimes

Origine blog.csdn.net/bianlitongcn/article/details/79025537
conseillé
Classement