使用ngx_lua构建高并发应用(2)
来源:互联网 发布:电脑wifi破解软件 编辑:程序博客网 时间:2024/06/06 19:35
在之前的文章中,已经介绍了ngx_lua的一些基本介绍,这篇文章主要着重讨论一下如何通过ngx_lua同后端的memcached、Redis进行非阻塞通信。
1. Memcached
在Nginx中访问Memcached需要模块的支持,这里选用HttpMemcModule,这个模块可以与后端的Memcached进行非阻塞的通信。我们知道官方提供了Memcached,这个模块只支持get操作,而Memc支持大部分Memcached的命令。
Memc模块采用入口变量作为参数进行传递,所有以$memc_为前缀的变量都是Memc的入口变量。memc_pass指向后端的Memcached Server。
配置:
输出:
这就实现了memcached的访问,下面看一下如何在lua中访问memcached。配置:
输出: 通过lua访问memcached,主要是通过子请求采用一种类似函数调用的方式实现。首先,定义了一个memc location用于通过后端memcached通信,就相当于memcached storage。由于整个Memc模块时非阻塞的,ngx.location.capture也是非阻塞的,所以整个操作非阻塞。2. Redis
访问redis需要HttpRedis2Module的支持,它也可以同redis进行非阻塞通行。不过,redis2的响应是redis的原生响应,所以在lua中使用时,需要解析这个响应。可以采用LuaRedisModule,这个模块可以构建redis的原生请求,并解析redis的原生响应。
配置:
输出: 和访问memcached类似,需要提供一个redis storage专门用于查询redis,然后通过子请求去调用redis。3. Redis Pipeline
在实际访问redis时,有可能需要同时查询多个key的情况。我们可以采用ngx.location.capture_multi通过发送多个子请求给redis storage,然后在解析响应内容。但是,这会有个限制,Nginx内核规定一次可以发起的子请求的个数不能超过50个,所以在key个数多于50时,这种方案不再适用。幸好redis提供pipeline机制,可以在一次连接中执行多个命令,这样可以减少多次执行命令的往返时延。客户端在通过pipeline发送多个命令后,redis顺序接收这些命令并执行,然后按照顺序把命令的结果输出出去。在lua中使用pipeline需要用到redis2模块的redis2_raw_queries进行redis的原生请求查询。
配置:
pipeline.lua 输出:4. Connection Pool
前面访问redis和memcached的例子中,在每次处理一个请求时,都会和后端的server建立连接,然后在请求处理完之后这个连接就会被释放。这个过程中,会有3次握手、timewait等一些开销,这对于高并发的应用是不可容忍的。这里引入connection pool来消除这个开销。
连接池需要HttpUpstreamKeepaliveModule模块的支持。
配置:
这个模块提供keepalive指令,它的context是upstream。我们知道upstream在使用Nginx做反向代理时使用,实际upstream是指“上游”,这个“上游”可以是redis、memcached或是mysql等一些server。upstream可以定义一个虚拟server集群,并且这些后端的server可以享受负载均衡。keepalive 1024就是定义连接池的大小,当连接数超过这个大小后,后续的连接自动退化为短连接。连接池的使用很简单,直接替换掉原来的ip和端口号即可。 有人曾经测过,在没有使用连接池的情况下,访问memcached(使用之前的Memc模块),rps为20000。在使用连接池之后,rps一路飙到140000。在实际情况下,这么大的提升可能达不到,但是基本上100-200%的提高还是可以的。
5. 小结
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用(2)
- 使用ngx_lua构建高并发应用
- 使用ngx_lua构建高并发应用
- 使用ngx_lua构建高并发应用(1)
- 使用ngx_lua构建高并发应用(1)
- 使用ngx_lua构建高并发应用(1)
- 使用ngx_lua构建高并发应用(1)
- 使用ngx_lua构建高并发应用(1)
- 使用ngx_lua构建高并发应用(1)
- ngx_lua与go高并发性能对比
- ngx_lua与go高并发性能对比
- nginx+lua+redis构建高并发应用
- nginx+lua+redis构建高并发应用
- Android 图片转二进制流及二进制转字符串
- android APK体积大小优化
- Pentaho Kettle 6.1连接CDH5.4.0集群
- HDU1257--最小拦截系统(贪心)
- 偶尔的感慨
- 使用ngx_lua构建高并发应用(2)
- hadoop中MapReduce多种join实现实例分析
- Java中==和equals方法的比较
- 机器学习入门(1)
- live555源码阅读(一)
- Kettle实现MapReduce之WordCount
- Windows下Eclipse提交MR程序到HadoopCluster
- <? extend E> 和<? super E> 深入理解
- Hadoop NameNode的ZKFC机制