nginx Lua Web Test#

流量复制#

  • 使用如tcpcopy引流

  • 使用nginx的HttpLuaModule模块中的ngx.location.capture_multi进行并发执行来模拟复制

  • http://192.168.1.110/test?a=123

AB测试#

  • AB测试即多版本测试,有时候开发了新版本需要灰度测试,即让一部分人看到新版,一部分人看到老版,然后通过访问数据决定是否切换到新版。比如可以通过根据区域、用户等信息进行切版本

  • 判断规则可以比较多的选择,比如通过尾号;要切30%的流量到新版,可以通过选择第二个数字串尾号为1,3,5的切到新版,其余的还停留在老版

map#

Module ngx_http_map_module,通过ngx.var.ab_key获取到该数据

  • nginx_desc_page.conf: /abtestFoo

  • http://192.168.1.110/abtestFoo?a=123

  • ab -kc 100 -n 100 http://192.168.1.110/abtestFoo?a=123

使用proxy_pass到不同版本的服务器上

  • nginx_desc_page.conf: /abtestBar

  • http://192.168.1.110/abtestBar?a=123

协程#

  • 个人认为协程是在A运行中发现自己忙则把CPU使用权让出来给B使用,最后A能从中断位置继续执行,本地还是单线程,CPU独占的;因此如果写网络程序需要配合非阻塞I/O来实现

  • 通过Lua协程可以并发的调用多个接口,然后谁先执行成功谁先返回,类似于BigPipe模型

串行实现#

  • nginx_desc_page.conf: /serial

  • http://192.168.1.110/serial?a=123

ngx.location.capture_multi实现#

  • nginx_desc_page.conf: /concurrencyFoo

  • http://192.168.1.110/concurrencyFoo?a=123

协程API实现#

  • nginx_desc_page.conf: /concurrencyBar

  • http://192.168.1.110/concurrencyBar?a=123

  • 使用ngx.thread.spawn创建一个轻量级线程,然后使用ngx.thread.wait等待该线程的执行成功

References#