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 100HTTPリクエストの実行
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
endUDP 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フィードバックを取得できます。ローカル設定は不要です。
このコースのすべてのレッスン
- OpenRestyアーキテクチャ
- LuaでのHTTPリクエスト処理
- CosocketとノンブロッキングTCP
- 共有メモリ辞書