0Pricing
Lua Academy · Lekcja

Cosockety i nieblokujący TCP

Proszę używać ngx.socket.tcp do asynchronicznych połączeń z backendem w content_by_lua.

Cosockety i nieblokujący TCP to bezpłatna lekcja Lua Academy na CoddyKit. To lekcja 3 z 4. Możesz przeczytać całą lekcję poniżej za darmo — a potem ćwiczyć ją interaktywnie w przeglądarce z wbudowanym edytorem kodu i tutorem AI dostępnym 24/7. To część ścieżki edukacyjnej Lua Academy, a Twój postęp synchronizuje się między webem a aplikacją CoddyKit. Kurs Lua Academy zawiera 4 lekcji w sumie.

Czym są cosockety?

Cosockety OpenResty to nieblokujące gniazda TCP/UDP, które integrują się z pętlą zdarzeń Nginx. Podczas oczekiwania na dane zawieszają korutynę, zwalniając proces roboczy do obsługi innych żądań.

Tworzenie cosocketu TCP

Do utworzenia cosocketu należy użyć ngx.socket.tcp(). Operacje łączenia, wysyłania i odbierania automatycznie zawieszają korutynę, gdy operacja wejścia-wyjścia mogłaby zablokować wykonanie.

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

Wysyłanie danych

sock:send(data) wysyła ciąg znaków. Zwraca liczbę wysłanych bajtów albo nil + komunikat błędu.

local bytes, err = sock:send("PING\r\n")
if not bytes then
  ngx.log(ngx.ERR, "Send error: ", err)
end

Odbieranie danych

sock:receive(pattern) odczytuje dane. Wzorce: "*l" odczytuje wiersz, "*a" odczytuje wszystko aż do zamknięcia połączenia, a liczba oznacza odczyt dokładnie N bajtów.

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)

Ustawianie limitów czasu

Należy ustawić limity czasu dla łączenia, wysyłania i odbierania, aby zapobiec zawieszaniu.

sock:settimeout(1000)  -- 1 second timeout
-- or separate timeouts:
sock:settimeouts(1000, 5000, 5000)  -- connect, send, receive (ms)

Pula połączeń

sock:setkeepalive(timeout, pool_size) odkłada gniazdo z powrotem do puli w celu ponownego użycia. Ma to kluczowe znaczenie dla wydajności Redis/MySQL.

sock:setkeepalive(60000, 100)  -- 60s timeout, pool size 100

Wysyłanie żądania HTTP

Należy zaimplementować proste żądanie GET HTTP/1.0 za pomocą cosocketu.

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() tworzy cosocket UDP. Jest przydatny do raportowania metryk do statsd.

local udp = ngx.socket.udp()
udp:setpeername("statsd.local", 8125)
udp:send("requests:1|c")

Schemat obsługi błędów

Wszystkie metody cosocketów stosują konwencję Lua: w przypadku niepowodzenia zwracają nil + ciąg znaków z komunikatem błędu. Należy zawsze sprawdzać obie wartości zwracane.

Ograniczenia cosocketów

Cosocketów nie można używać w: init_by_lua, set_by_lua, header_filter_by_lua. Należy używać ich wyłącznie w fazach content, access i rewrite.

Porównanie wydajności

Cosockety osiągają taką samą przepustowość jak nieabstrakcyjny kod C oparty na epoll, ponieważ bezpośrednio korzystają z mechanizmów wejścia-wyjścia Nginx. Nie występuje dodatkowy narzut związany z wątkami ani procesami.

Pytanie dotyczące cosocketów

Co się dzieje, gdy cosocket oczekuje na dane od wolnego serwera?

Podsumowanie: cosockety i nieblokujący TCP

Cosockety OpenResty zapewniają nieblokującą obsługę TCP/UDP i zawieszają korutynę podczas operacji wejścia-wyjścia, umożliwiając wysoką współbieżność. Do tworzenia puli połączeń należy używać setkeepalive. Należy ustawić limity czasu, aby uniknąć zawieszania. Cosockety są dostępne wyłącznie w fazach content/access/rewrite.

Często zadawane pytania

Czy lekcja „Cosockety i nieblokujący TCP” jest bezpłatna?

Tak — pełny tekst „Cosockety i nieblokujący TCP” jest dostępny za darmo tutaj w sieci. Aby ćwiczyć ją interaktywnie (wbudowany edytor kodu i tutor AI dostępny 24/7) i odblokować resztę kursu Lua Academy, przejdź na CoddyKit PRO. Kurs Lua Academy zawiera 4 lekcji w sumie.

Co nauczysz się w „Cosockety i nieblokujący TCP”?

Proszę używać ngx.socket.tcp do asynchronicznych połączeń z backendem w content_by_lua. Ćwiczysz Lua Academy z praktycznym kodem, który uruchamiasz bezpośrednio w przeglądarce, a tutor AI dostępny 24/7 odpowiada na Twoje pytania podczas pracy nad lekcją.

Czy potrzebuję doświadczenia, aby zacząć Lua Academy?

Nie wymagamy żadnego doświadczenia. Lua Academy w CoddyKit jest strukturyzowany dla początkujących i zaawansowanych użytkowników, więc możesz zacząć tutaj lub od początku i uczyć się w swoim tempie. To lekcja 3 z 4.

Ile czasu zajmuje lekcja „Cosockety i nieblokujący TCP”?

Większość lekcji CoddyKit trwa około 5–10 minut. Każda lekcja to mały, interaktywny krok, dzięki czemu robisz systematyczne postępy i zawsze wracasz dokładnie do tego samego miejsca — na webie i w aplikacji.

Czy mogę pisać i uruchamiać kod w tej lekcji Lua Academy?

Tak. Każda lekcja Lua Academy zawiera wbudowany edytor kodu, więc piszesz i uruchamiasz prawdziwy kod bezpośrednio w przeglądarce i od razu otrzymujesz sprzężenie zwrotne od AI — bez konfiguracji na komputerze.

Wszystkie lekcje w tym kursie

  1. Architektura OpenResty
  2. Obsługa żądań HTTP w Lua
  3. Cosockety i nieblokujący TCP
  4. Słowniki pamięci współdzielonej
← Powrót do Lua Academy