Cosockets et TCP non bloquant
Utilisez ngx.socket.tcp pour les connexions asynchrones aux services en aval dans content_by_lua.
Cosockets et TCP non bloquant est une leçon Lua Academy gratuite sur CoddyKit. Ceci est la leçon 3 sur 4. Tu peux lire la leçon complète ci-dessous gratuitement — puis la pratiquer en direct dans le navigateur avec un éditeur de code intégré et un tuteur IA 24/7. Elle fait partie du parcours d'apprentissage Lua Academy, et ta progression se synchronise sur le web et l'application CoddyKit. Le cours Lua Academy comprend 4 leçons au total.
Que sont les cosockets ?
Les cosockets d’OpenResty sont des sockets TCP/UDP non bloquants qui s’intègrent à la boucle d’événements de Nginx. Lorsqu’ils attendent des données, ils suspendent la coroutine, ce qui permet au processus de travail de traiter d’autres requêtes.
Création d’un cosocket TCP
Utilisez ngx.socket.tcp() pour créer un cosocket. Les opérations de connexion, d’envoi et de réception suspendent automatiquement la coroutine lorsque les entrées-sorties risquent de bloquer.
-- content_by_lua_block
local sock = ngx.socket.tcp()
local ok, err = sock:connect("redis.local", 6379)
if not ok then
ngx.log(ngx.ERR, "Connect failed: ", err)
return ngx.exit(500)
endEnvoi de données
sock:send(data) envoie une chaîne. La fonction renvoie le nombre d’octets envoyés, ou nil et une erreur.
local bytes, err = sock:send("PING\r\n")
if not bytes then
ngx.log(ngx.ERR, "Send error: ", err)
endRéception de données
sock:receive(pattern) lit des données. Les modèles sont les suivants : "*l" lit une ligne, "*a" lit tout jusqu’à la fermeture, et un nombre lit exactement N octets.
local data, err = sock:receive("*l")
if not data then
ngx.log(ngx.ERR, "Receive error: ", err)
return ngx.exit(500)
end
ngx.say("Response: " .. data)Définition des délais d’attente
Définissez des délais d’attente pour la connexion, l’envoi et la réception afin d’éviter tout blocage indéfini.
sock:settimeout(1000) -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000) -- connect, send, receive (ms)Pool de connexions
sock:setkeepalive(timeout, pool_size) remet le socket dans un pool pour le réutiliser. Cela est essentiel pour les performances de Redis/MySQL.
sock:setkeepalive(60000, 100) -- 60s timeout, pool size 100Effectuer une requête HTTP
Implémentez une requête HTTP/1.0 GET simple à l’aide d’un cosocket.
local function httpGet(host, path)
local sock = ngx.socket.tcp()
sock:connect(host, 80)
sock:send("GET " .. path .. " HTTP/1.0\r\nHost: " .. host .. "\r\n\r\n")
local resp = sock:receive("*a")
sock:close()
return resp
endCosocket UDP
ngx.socket.udp() crée un cosocket UDP. Il est utile pour envoyer des métriques à statsd.
local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")Modèle de gestion des erreurs
Toutes les méthodes de cosocket suivent la convention de Lua : nil et une chaîne d’erreur en cas d’échec. Vérifiez toujours les deux valeurs renvoyées.
Limites des cosockets
Les cosockets ne peuvent pas être utilisés dans : init_by_lua, set_by_lua, header_filter_by_lua. Utilisez-les uniquement pendant les phases de contenu, d’accès et de réécriture.
Comparaison des performances
Les cosockets atteignent le même débit que du code C brut fondé sur epoll, car ils utilisent directement le mécanisme d’entrées-sorties de Nginx. Il n’y a aucune surcharge liée à des threads ou à des processus supplémentaires.
Question sur les cosockets
Que se passe-t-il lorsqu’un cosocket attend des données provenant d’un serveur lent ?
Récapitulatif : cosockets et TCP non bloquant
Les cosockets d’OpenResty fournissent des connexions TCP/UDP non bloquantes qui suspendent la coroutine pendant les entrées-sorties, ce qui permet une forte concurrence. Utilisez setkeepalive pour mettre en pool les connexions. Définissez des délais d’attente pour éviter les blocages indéfinis. Ils sont disponibles uniquement pendant les phases de contenu, d’accès et de réécriture.
Questions Fréquemment Posées
La leçon « Cosockets et TCP non bloquant » est-elle gratuite ?
Oui — le texte complet de « Cosockets et TCP non bloquant » est gratuit à lire ici sur le web. Pour la pratiquer de manière interactive (un éditeur de code intégré et un tuteur IA 24/7) et déverrouiller le reste du cours Lua Academy, passe à CoddyKit PRO. Le cours Lua Academy comprend 4 leçons au total.
Qu'est-ce que j'apprendrai dans « Cosockets et TCP non bloquant » ?
Utilisez ngx.socket.tcp pour les connexions asynchrones aux services en aval dans content_by_lua. Tu pratiques Lua Academy avec du code pratique que tu exécutes directement dans le navigateur, et un tuteur IA 24/7 répond à tes questions au fur et à mesure que tu avances dans la leçon.
Dois-je avoir de l'expérience pour commencer Lua Academy ?
Aucune expérience préalable n'est requise. Lua Academy sur CoddyKit est structuré pour les débutants jusqu'aux apprenants avancés, donc tu peux commencer ici ou depuis le début et avancer à ton rythme. Ceci est la leçon 3 sur 4.
Combien de temps prend la leçon « Cosockets et TCP non bloquant » ?
La plupart des leçons CoddyKit prennent environ 5–10 minutes. Chacune est courte et interactive, tu progresses régulièrement et tu repiques exactement où tu t'es arrêté sur le web et l'app.
Peux-tu écrire et exécuter du code dans cette leçon Lua Academy ?
Oui. Chaque leçon Lua Academy inclut un éditeur de code intégré, tu écris et exécutes du vrai code directement dans ton navigateur et tu reçois des retours IA instantanés — aucune configuration locale requise.
Toutes les leçons de ce cours
- Architecture d’OpenResty
- Gérer les requêtes HTTP en Lua
- Cosockets et TCP non bloquant
- Dictionnaires de mémoire partagée