OpenResty shared dict

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 timeoutlocal ok, err = sock:connect("www.baidu.com", 80)if not ok thenngx.say("failed to connect: ", err)returnendlocal req_data = "GET / HTTP/1.1\r\nHost: www.baidu.com\r\n\r\n"local bytes, err = sock:send(req_data)if err thenngx.say("failed to send: ", err)returnendlocal data, err, partial = sock:receive()if err thenngx.say("failed to receive: ", err)returnendsock: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.hqwc.cn/news/5500.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

王道《计算机网络》思维导图汇总

第一章 1.1.1 概念与功能 1.1.2 组成与分类 1.1.3 标准化工作及相关组织 1.1.4 性能指标 速率 带宽 吞吐量 时延 时延带宽积 往返时延RTT 利用率 1.2.1 分层结构、协议、接口、服务 1.2.2 OSI参考模型 应用层 表示层 会话层 传输层 网络层 数据链路层 物理层 1.2.4 TCP/IP 参…

vue中实现div可编辑,并插入指定元素,样式

前言: vue中实现一个既可以编辑内容,有可以动态编辑内容插入一个带有样式的内容,改变默认内容后,这个样式消失的效果,这里来整理下调研与解决实现问题之路。 实现最终效果:图2为默认内容 1、可以光标点击任…

idea里发送简单邮件的模板

这是一个idea里发送简单邮件的模板,后续会更新在项目里如何进行运用。 带附件的暂时不演示。 这属于个小demo,后续还会抽出专门的properties进行存储对应的授权码邮箱等信息,也会封装一个发送邮件的方法,供其他的发送邮件业务调用…

asp.net MVC

文件目录 页面 HTML与Script的联系 HTML元素通过调用脚本中的function来触发前端的动作要进行的后端逻辑操作 Script中通过选择器$(“#str”)来改变前端HTML的显示数据 Script中有两种类型的函数模式 $(function(){ … }) :window.onload时调用。function btnRese…

火山引擎DataLeap数据质量解决方案和最佳实践(二):解决方案

更多技术交流、求职机会,欢迎关注字节跳动数据平台微信公众号,回复【1】进入官方交流群 DataLeap流批数据质量解决方案 产品功能架构 火山引擎DataLeap流批数据质量解决方案有 4 个大的功能: 离线数据质量监控:解决批和微批监控…

el-tree 展开指定层级 节点

示例&#xff1a;只展开一级节点 代码实现&#xff1a; element UI 文档 html代码 defaultExpandedArr 是重点 需要加node-key <el-tree:props"defaultProps":data"treeData":default-expanded-keys"defaultExpandedArr"node-key"id&q…

【Hadoop】 | 搭建HA之报错锦集

知识目录 一、写在前面✨二、Hadoop的active结点无法主备切换&#x1f525;三、Hadoop Web端无法上传文件&#x1f349;四、hdfs创建文件夹报错&#x1f36d;五、IDEA操作Hdfs无法初始化集群&#x1f525;六、Java无法连接Hdfs&#x1f36d;七、找不到Hadoop家目录&#x1f525…

Python基础 —— 循环语句

如约来更新循环语句了.说到循环&#xff0c;有一定编程基础的小伙伴们都知道&#xff0c;我们最常用的循环莫过于 while循环&#xff0c;for循环和goto循环&#xff08;不过goto也不怎么常用&#xff09;&#xff0c;所以今天就来说一说 while循环和 for循环 来看一下本文大致…

C++ - 20230628

一. 思维导图 二. 练习 1) 总结类和结构体的区别 本身的访问级别不同struct是值类型&#xff0c;class是引用类型struct在栈&#xff0c;适合处理小型数据。class在堆区&#xff0c;适合处理大型逻辑和数据。 2) 定义一个矩形类&#xff08;Rectangle&#xff09;&#xff…

游戏革命2023:AIGC拯救游戏厂商

文明史即工具史&#xff0c;纵观人类社会的演化&#xff0c;每一次的加速迭代&#xff0c;都有赖于关键性的技术突破。 前有蒸汽机到电力普及的生产力大爆发&#xff0c;以及计算机、互联网的诞生打开新世界&#xff0c;如今AIGC将再次推动先进技术工具的变革。 随着ChatGPT的…

Web安全——PHP基础

PHP基础 一、PHP简述二、基本语法格式三、数据类型、常量以及字符串四、运算符五、控制语句1、条件控制语句2、循环控制语句3、控制语句使用 六、php数组1、数组的声明2、数组的操作2.1 数组的合拼2.2 填加数组元素2.3 添加到指定位置2.4 删除某一个元素2.5 unset 销毁指定的元…

自然语言处理从入门到应用——预训练模型总览:两大任务类型

分类目录&#xff1a;《自然语言处理从入门到应用》总目录 相关文章&#xff1a; 预训练模型总览&#xff1a;从宏观视角了解预训练模型 预训练模型总览&#xff1a;词嵌入的两大范式 预训练模型总览&#xff1a;两大任务类型 预训练模型总览&#xff1a;预训练模型的拓展 …