OpenResty cosocket

news2024/11/16 3:18:13

cosocket 是各种 lua-resty-* 非阻塞库的基础

cosocket = coroutine + socket

需要 Lua 协程特性的支持,也需要 Nginx 事件机制的支持,两者结合在一起实现非阻塞网络 I/O。

遇到网络 I/O 时会交出控制权,把网络事件注册到 Nginx 监听列表中,并把权限交给 Nginx;当有 Nginx 事件到达触发条件时,便唤醒对应的协程继续处理。

cosocket API

TCP 相关 API

  • 创建对象 ngx.socket.tcp
  • 设置超时 tcpsock:settimeouttcpsock:settimeouts
  • 建立连接 tcpsock:connect
  • 发送数据 tcpsock:send
  • 接收数据 tcpsock:receivetcpsock:receiveanytcpsock:receiveuntil
  • 连接池 tcpsock:setkeepalive
  • 关闭连接 tcpsock:close

由于 Nginx 内核的限制,cosocket API 在 set_by_lua, log_by_lua, header_filter_by_lua*,init_by_lua*,init_worker_by_lua* 和 body_filter_by_lua* 阶段中是无法使用的。**

与上面 API 相关的 Nginx 指令

  • lua_socket_connect_timeout 连接超时,默认 60s
  • lua_socket_send_timeout 发送超时,默认 60s
  • lua_socket_send_lowat 发送阈值,默认 0
  • lua_socket_read_timeout 读取超时,默认 60s
  • lua_socket_buffer_size 读取数据的缓存区大小,默认 4k/8k
  • lua_socket_pool_size 连接池大小,默认 30
  • lua_socket_keepalive_timeout 连接池 cosocket 对象的空闲时间,默认 60s
  • lua_socket_log_errors cosocket 发生错误时是否记录日志,默认 no

当指令和 API 冲突时,API 会覆盖指令。

$ resty -e 'local sock = ngx.socket.tcp()
        sock:settimeout(1000)  -- one second timeout
        local ok, err = sock:connect("www.baidu.com", 80)
        if not ok then
            ngx.say("failed to connect: ", err)
            return
        end

        local req_data = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"
        local bytes, err = sock:send(req_data)
        if err then
            ngx.say("failed to send: ", err)
            return
        end

        local data, err, partial = sock:receive()
        if err then
            ngx.say("failed to receive: ", err)
            return
        end

        sock:close()
        ngx.say("response is: ", data)'
  1. 通过 ngx.socket.tcp() 创建名为 sock 的 TCP cosocket 对象
  2. settimeout() 设置超时时间 1s
  3. connect() 与指定网站建立 TCP 连接
  4. 连接成功的话,用 send() 来发送数据,发送失败就退出
  5. 发送成功的话,用 receive() 来接收网站返回的数据
  6. 最后调用 close() 主动关闭 TCP 连接

连接池使用

  • 不能把错误的连接放入连接池,否则下次使用时会导致收发数据失败(需要事先判断每个 API 调用是否成功)
  • 要搞清楚连接的数据,连接池是 worker 级别的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/712156.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

OpenSSH 用户枚举漏洞(CVE-2018-15473) 漏洞修复

OpenSSH 用户枚举漏洞(CVE-2018-15473)漏洞修复 1 漏洞说明2 漏洞修复3 相关问题 1 漏洞说明 2 漏洞修复 查看当前openssh版本: [rootizr0a05u4qferpr7yfhtotz ~]# ssh -V OpenSSH_7.4p1, OpenSSL 1.0.2k-fips 26 Jan 2017 [rootizr0a05u4…

ChatGLM-6B一键安装,马上使用(windows)!!

产品特点 双语: 同时支持中文和英文。 高精度(英文): 在公开的英文自然语言榜单 LAMBADA、MMLU 和 Big-bench-lite 上优于 GPT-3 175B(API: davinci,基座模型)、OPT-175B 和 BLOOM-176B。 高…

MiniKube安装教程,简易版k8s,带你用最简单的方法体验k8s(学习环境通用)

Minikube安装教程 minikube 是本地 Kubernetes,专注于让 Kubernetes 易于学习和开发,这能很方便的在本地进行k8s学习,减轻初学者对于k8s的安装困难。(信我,新手入门k8s就用这个够用了!先别去折腾生产环境的…

[pyqt5]右键窗口弹出菜单并触发菜单点击事件

from PyQt5.Qt import * import sysclass MyWindow(QWidget):# 自定义窗体def contextMenuEvent(self, evt: QContextMenuEvent) -> None:menu QMenu(self)new_action QAction(打开, menu)new_action.triggered.connect(self.open)close_action QAction(关闭, menu)close…

Jupyter的安装与启动

一、简介 Jupyter Notebook(此前被称为 IPython notebook)是一个交互式笔记本,支持运行 40 多种编程语言。 Jupyter Notebook是一个开源的Web应用程序,允许用户创建和共享包含代码、方程式、可视化和文本的文档,支持…

【编码魔法师系列_六大原则2】里氏替换原则(Liskov Substitution Principle LSP Principle)

学会设计模式,你就可以像拥有魔法一样,在开发过程中解决一些复杂的问题。设计模式是由经验丰富的开发者们(GoF)凝聚出来的最佳实践,可以提高代码的可读性、可维护性和可重用性,从而让我们的开发效率更高。通…

BKP备份寄存器RTC实时时钟

BKP本质上是RAM寄存器,不能完全掉电不丢失,它的数据需要VBAT引脚提供的备用电源来维持。RTC复位和掉电不丢失是通过BKP来实现的。 目录 Unix时间戳 简介 计时标准​编辑 时间戳转换​编辑 示例代码 BKP 简介 BKP基本结构 RTC RTC简介 RTC框图 RT…

【100个 Unity实用技能】 | Unity中Text文本框 和 InputField文本输入框 内容换行问题【文末送书】

🎬 博客主页:https://xiaoy.blog.csdn.net 🎥 本文由 呆呆敲代码的小Y 原创,首发于 CSDN🙉 🎄 学习专栏推荐:Unity系统学习专栏 🌲 游戏制作专栏推荐:游戏制作 &…

【深度学习】神经网络初学者指南

一、说明 这是一篇对神经网络的泛泛而谈的文章,我的意见是,先知道框架,而后知道每一个细节,这是学习人工智能的基本路线。本文就神经网络而言,谈到一些基础概念,适应于初学者建立概念。 二、神经网络定义 神…

初学Spring boot (一) Hello,World!

SpringBoot简介 回顾什么是Spring? Spring是一个开源框架,2003 年兴起的一个轻量级的Java 开发框架,作者:Rod Johnson 。 Spring是为了解决企业级应用开发的复杂性而创建的,简化开发。 Spring是如何简化Java开发的 为了降低Java…

element 表格

实现效果: 需求: 1. 左侧新增分类功能添加数据到左侧分类表格中。 2. 分类表格可以编辑和删除。 3. 右侧添加标签功能,添加标签至所属分类中。 4.右侧表格显示分类与所挂在当前分类下的所有标签。 5. 右侧表格内删除按钮,删除…

C++之模板类指向子类对象(一百四十六)

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏:Audio工程师进阶系列【原创干货持续更新中……】🚀 人生格言: 人生…

diy遥控飞机模型的基本要点-4

电调 电调(Electronic Speed Controller,简称ESC)是遥控飞机中的一种关键设备,用于控制电动马达的转速和方向。下面是关于电调的一些知识: 功能 速度调节:电调通过调整电流的大小和方向来控制电动马达的…

window系统安装node,配置环境变量npm指令

首先 你要在本地创建一个文件夹 来放node window我们直接访问node下载地址 根据自己的电脑配置 选择对应的版本 这里的话 我建议还是选择 .msi 文件 处理会方便一点 下砸好之后我们直接双击运行 然后 下一步 Next 然后 勾选下面的协议 然后 继续下一步 这个都没必要看 只能说…

Oracle-记OGG迁移项目问题与优化(5-6月)

背景: 5-6月使用oggexpdp将两套Oracle 11g从AIX7.1迁移到redhat7.9,数据量接近3T,本文主要记录ogg迁移过程中遇到的问题以及优化方法,希望对读者有所帮助 问题一:OGG数据一致性校验 使用OGG数据迁移,需要面对的一个大问题就是如何进行源端和目…

Java 实现关注微信公众号动态获取验证码

大家好,我是程序猿小张 前言 个人博客今天上线一个文章私密的功能,该功能需要通过关注公众号来获取验证码,通过正确的验证码才能来查阅文章,具体效果如下图。 我感觉还蛮有意思的就决定把这个写出来,供大家去使用&…

Web3.0数字货币有哪些?

Web3.0的到来为数字货币带来了全新的发展机遇,它不仅仅是加密货币的进化版,更是一种去中心化、可编程性和自治性的数字资产。 在这个新的数字经济时代,Web3.0数字货币成为了金融革命的核心。本文将介绍一些重要的Web3.0数字货币,…

基于SpringBoot+vue的新生宿舍管理系统设计与实

博主介绍: 大家好,我是一名在Java圈混迹十余年的程序员,精通Java编程语言,同时也熟练掌握微信小程序、Python和Android等技术,能够为大家提供全方位的技术支持和交流。 我擅长在JavaWeb、SSH、SSM、SpringBoot等框架…

基于Servlet的CRM客户关系管理系统

1.需求分析 客户是公司最宝贵的资源,为了更好的发掘老客户的价值,并开发更多新客户,公司实施客户关系管理系统。系统的功能是:通过这个系统完成对员工基本信息、客户基本信息、交往信息、客户服务信息的充分共享和规范化管理;通过对销售机会、客户开发过程的追踪和…

服务器配置静态IP

服务器配置静态IP 一、前期准备二、配置静态IP 将服务器配置为使用静态IP地址。这将使服务器拥有一个永久的IP地址,而不会在每次启动时更改。为此,您需要编辑网络配置文件并将服务器的IP地址添加到其中。详细步骤如下: 一、前期准备 请在配置…