0Pricing
Lua Academy · レッスン

CosocketとノンブロッキングTCP

content_by_luaでコルーチンスケジューラーと連携し、ngx.socket.tcpを使って非同期にバックエンドへ接続します。

「CosocketとノンブロッキングTCP」はCoddyKit上の無料Lua Academyレッスンです。 これはレッスン3/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはLua Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Lua Academyコースには全4レッスンが含まれています。

Cosocketとは

OpenRestyのcosocketは、Nginxのイベントループと統合されたノンブロッキングTCP/UDPソケットです。データを待機するときはコルーチンをyieldして、ワーカーがほかのリクエストを処理できるようにします。

TCP Cosocketの作成

ngx.socket.tcp()を使用してcosocketを作成します。接続、送信、受信では、I/Oがブロックする状況になるとすべて自動的にyieldします。

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

データの送信

sock:send(data)は文字列を送信します。送信したバイト数、またはnilとエラーを返します。

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

データの受信

sock:receive(pattern)はデータを読み取ります。パターンの"*l"は1行を、"*a"は接続が閉じられるまでのすべてを読み取り、数値を指定すると正確にNバイトを読み取ります。

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)

タイムアウトの設定

接続、送信、受信のタイムアウトを設定して、処理がハングするのを防ぎます。

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

接続プール

sock:setkeepalive(timeout, pool_size)は、ソケットを再利用できるようプールに戻します。RedisやMySQLのパフォーマンスに不可欠です。

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

HTTPリクエストの実行

cosocketを使用して、単純なHTTP/1.0 GETリクエストを実装します。

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

UDP Cosocket

ngx.socket.udp()はUDP cosocketを作成します。statsdへのメトリクス送信に便利です。

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

エラー処理パターン

すべてのcosocketメソッドは、Luaの規約に従い、失敗時にnilとエラー文字列を返します。常に両方の戻り値を確認してください。

Cosocketの制限

Cosocketは、init_by_lua、set_by_lua、header_filter_by_luaでは使用できません。content、access、rewriteフェーズでのみ使用してください。

パフォーマンス比較

CosocketはNginxのI/O機構を直接使用するため、生のepollベースのCコードと同じスループットを実現します。追加のスレッドやプロセスによるオーバーヘッドもありません。

Cosocketに関する質問

Cosocketが低速なサーバーからのデータを待機している間、何が起こりますか。

振り返り: CosocketとノンブロッキングTCP

OpenRestyのcosocketは、I/O時にyieldするノンブロッキングTCP/UDPを提供し、高い並行性を実現します。接続プールにはsetkeepaliveを使用します。ハングを避けるため、タイムアウトを設定します。使用できるのはcontent、access、rewriteフェーズのみです。

よくある質問

「CosocketとノンブロッキングTCP」レッスンは無料ですか?

はい。「CosocketとノンブロッキングTCP」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Lua Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Lua Academyコースには全4レッスンが含まれています。

「CosocketとノンブロッキングTCP」で何を学びますか?

content_by_luaでコルーチンスケジューラーと連携し、ngx.socket.tcpを使って非同期にバックエンドへ接続します。 ブラウザで直接実行するハンズオンコードでLua Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Lua Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのLua Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/4です。

「CosocketとノンブロッキングTCP」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このLua Academyレッスンでコードを書いて実行できますか?

はい。すべてのLua Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. OpenRestyアーキテクチャ
  2. LuaでのHTTPリクエスト処理
  3. CosocketとノンブロッキングTCP
  4. 共有メモリ辞書
← Lua Academyに戻る