nginx + lua 开发中过程中 post body 过大返回 4xx (续)
背景随着业务发展会出现较大的 post body 数据,按照nginx + lua 开发中过程中 post body 过大返回 4xx提到的方式修改后,大部分情况下 post body 正常接收并处理落日志。但会偶现空日志的情况。
问题分析经过多轮本地和沙盒压测,复现了问题。由于在出现空日志情况是 error 日志并没留下相关信息,随后做了如下处理:
把 error 日志级别调到 debug,当问题复现时,error.log 中会有客户端过早断开连接类似的日子打出。
在 access 日志中添加 request_time, status,等信息,发现出现空日志时,status=408,request_time 都比较长。
因此,可以明确出现该问题是客户端链接超时造成的。
解决方案为解决该问题,做如下优化:
调整超时时间,和 buffer123client_body_timeout 10s;client_header_timeout 10s;client_body_in_single_buffer on; #这个 directive 让 Nginx 将所有的 request body ...
Lua作图教程之lua面向对象
C++
Java
Objective-C
Smalltalk
C#
Ruby
面向对象特征
1) 封装:指能够把一个实体的信息、功能、响应都装入一个单独的对象中的特性。
2) 继承:继承的方法允许在不改动原程序的基础上对其进行扩充,这样使得原功能得以保存,而新功能也得以扩展。这有利于减少重复编码,提高软件的开发效率。
3) 多态:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果。在运行时,可以通过指向基类的指针,来调用实现派生类中的方法。
4)抽象:抽象(Abstraction)是简化复杂的现实问题的途径,它可以为具体问题找到最恰当的类定义,并且可以在最恰当的继承级别解释问题。
Lua 中面向对象我们知道,对象由属性和方法组成。LUA中最基本的结构是table,所以需要用table来描述对象的属性。
lua中的function可以用来表示方法。那么LUA中的类可以通过table + function模拟出来。
至于继承,可以通过metetable模拟出来(不推荐用,只模拟最基本的对象大部分时间够用了)。
Lua中的表不仅在某种意义上是一种对象。像对象一样,表也有状态 ...
Lua学习笔记(二)
变量
赋值语句
多变量赋值
索引
循环
控制语句
流程控制
函数
可变参数
运算符
算术运算符
关系运算符
逻辑运算符
其它运算符
优先级
字符串
转义字符
字符串操作
字符串格式化
匹配模式
模式
捕获
数组
迭代器
泛型for迭代器
无状态迭代器
多状态迭代器
table
操作方法
变量使用前必须申明,即创建该变量。
包括:全局变量,局部变量,表中的域。
前文中提到过,Lua中所有的变量默认都是全局变量,有一种情况是例外的,那就是用local显示声明为局部变量的。
试尝试:
1234567891011a=1;local b = 2;function test() c=3; local d=4;endtest()print("a"..a)print("b"..b)print("c"..c)print(d)
这里经过试验可以轻易的得知,local定义的变量的使用范围就是在当前的代码块儿之内的。一旦超出的话就直接归nil!
这里使用到了Lua中的一些语法,例如function与end,这里就 ...
Lua学习笔记二
while1234while(条件)do 循环体end
代码示例及结果:
123456a = 0while(a < 10)do print(a) a = a + 1end
123456789100123456789
for123for var=值1,值2,值2 do 循环体end
从值1变化到值2,每次变化以值3为步长,执行一次循环体。表达式3不指定时默认为1.
代码示例及结果:
123for i = 0,10 do print(i)end
1234567891011012345678910
变化范围包含值2
for 遍历table:
1234table = {"a","b","c"}for i,v in ipairs(table) do print(i,v)end
1231 a2 b3 c
repeat…until123repeat 循环体until(条件语句)
执行循环体,直到条件语句成立
代码示例及结果:
12345i = 0repeat print(i) i = i+1until(i>10)
123456 ...
Lua 排序算法
选择排序(Selection Sort)是一种简单直观的排序算法。它的工作原理如下,首先在未排序序列中找到最小(大)元素,存放到排序序列的起始位置,然后,再从剩余未排序元素中继续寻找最小(大)元素,然后放到已排序序列的末尾。以此类推,直到所有元素均排序完毕。
选择排序的主要优点与数据移动有关。如果某个元素位于正确的最终位置上,则它不会被移动。选择排序每次交换一对元素,它们当中至少有一个将被移到其最终位置上,因此对n个元素的序列进行排序总共进行至多n-1次交换。在所有的完全依靠交换去移动元素的排序方法中,选择排序属于非常好的一种。
算法步骤
首先在未排序序列中找到最小元素,存放到排序序列的起始位置
再从剩余未排序元素中继续寻找最小元素,然后放到已排序序列的末尾。
重复第二步,直到所有元素均排序完毕。
动画演示
Lua 实现
local function selectionSort(arr)
for i = 1, #arr-1 do
local idx = i
-- 迭代剩下的元素,寻找最小的元素
for j = i ...
openresty通过lua增加随机traceid
在没有引入zipkin(或者阿里的鹰眼,百度的华佗)这种trace系统的时候,排查问题的一般思路都是按照请求链路来寻找问题源。因此如果能在请求链路中有一个唯一的标识就最好了,而在nginx/openresty做接入层的架构中,可以通过lua脚本生成一个随机traceid。随机数的生成原理,都是先初始化一个随机数种子,由于伪随机数的特性,种子的随机性就显得格外重要,而一般种子的生成都是通过时间的倒序来选取lua 随机数生成方法首先我们看下通常lua的随机数生成方法math.randomseed(tonumber(tostring(os.time()):reverse():sub(1,6)))
math.random(m,n)
通过时间字符串的逆序初始化随机种子,这里注意到有个sub函数做了截断,是因为math.randomseed will call the underlying C function srand which takes an unsigned integer valueLua will cast the value of the seed to this format. ...
Lua语句段 · 花生肉泥
chunk语句组chunk是一系列语句,lua执行的每一块语句,比如一个文件或者交互模式下的每一行都是一个chunk
语句块显式的语句块对于控制变量的作用范围很有用,有时候,显式的语句块被用来在另一个语句块中插入retuen或是break
赋值语句lua允许多重赋值,因此,赋值的语法定义是等号左边放一系列变量,而等号右边放一系列的表达式,两边的元素都用逗号间开1local a,b,c,d,e = 1,2,3,4,5,6
当变量个数和值的个数不一致时:if 变量个数 > 值的个数 按变量个数补足nilif 变量个数 < 值的个数 多余的值会被忽略备注:lua会先计算右边所有的值后才赋值,所以交换可以这么写,x,y = y,x123456789local a,b,c = 1print(a,b,c)local a,b,c,d,e = 1,2,3,4,5,6print(a,b,c,d,e)=====结果=====1 nil nil1 2 3 4 5
注意:如果要对多个变量赋值必须依次对每个变量赋值
控制结构语句if w ...
LuaInterface简介
LuaInterface
https://www.cnblogs.com/sifenkesi/p/3901831.html
二 使用1.C#中调用Lua下载LuaInterface。下载地址
里面有两个文件:lua51.dll,LuaInterface.dll
新建c#控制台,添加引用(引用右键-添加引用):
c#:
12345678910111213141516171819202122232425262728293031323334353637383940using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Threading.Tasks;using LuaInterface;namespace { class Program { static void Main(string[] args) { Lua lua = new Lua(); ...
Kafka cluaster partitions replicas group
Partition & Replicas
Kafka 集群默认自动分配解析
下面以一个Kafka集群中4个Broker举例,创建1个topic包含4个Partition,2 Replication;数据Producer流动如图所示:
Broker1
Broker2
Broker3
Broker4
BrokerX
BrokerX
P0
P1
P2
P3
N/A
N/A
P3
P0
P1
P2
N/A
N/A
当集群中新增2节点,Partition增加到6个时分布情况如下:
Broker1
Broker2
Broker3
Broker4
Broker5
Broker6
...
tolua++安装
<a href="/2015/11/11/lua_cpp_bind/" rel="next" title="C++与Lua本质原始交互API">
<i class="fa fa-chevron-left"></i>
<p class="post-nav-pre-next-title">
C++与Lua本质原始交互API
</p>
</a>
</div>
<span class="post-nav-divider"></span>
<div class="post-nav-prev post-nav-item"> ...