0Pricing
Lua Academy · Leçon

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)
end

Envoi 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)
end

Ré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 100

Effectuer 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
end

Cosocket 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

  1. Architecture d’OpenResty
  2. Gérer les requêtes HTTP en Lua
  3. Cosockets et TCP non bloquant
  4. Dictionnaires de mémoire partagée
← Retour à Lua Academy