背景介绍

游戏经过一段时间的运营,发现了原来的设计缺陷太多,所以决定重新设计架构。使用到nginx作为核心并通过lua+redis设计实现自己的负载分配方案。先看看下面这张简单的架构图吧~

从图上看,结构是非常简单的。主要通过编写lua分配策略使游戏房间内的人数尽量坐满。

技术实现思路

要编写lua插件通常需求编译nginx使其支持,如果嫌麻烦可以直接上手openresty就可以了。我刚开始编译nginx插件模块也费了不少时间,现在使用openresty方便多了。

我们的游戏房间是9个人,产品需要优先坐满一个房间才分配下一个房间;玩家通过websocket连接到咱们的服务器上,为了使nginx记住我们的节点负载情况,我使用redis记录每一个节点的连接数量,并设计一套权重策略依据节点连接数量求9的余数进行排序。当然具体看代码更加容易理解~~

准备工作

假设已经安装好了openresty,可以直接在/usr/local/openresty/nginx/conf下面找到nginx.conf文件,增加下面一行(注意如果已经安装了nginx的其他版本,需要将openresty安装的nginx进行端口重新配置)

...
30 #keepalive_timeout 0;
31 keepalive_timeout 65;
32 include /usr/local/openresty/nginx/conf.d/*.conf;
33 #gzip on;
....

为了方便加载个人的配置,我在nginx下面自己建立了一个conf.d文件目录,存放自己的配置。下面查看nginx具体配置。

server {
listen 9009;
location / {
set $websocket_addr "";
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_set_header X-Real-Ip $remote_addr;
proxy_set_header X-Scheme $scheme;
rewrite_by_lua_file /usr/local/lua/dispatcher.lua;
proxy_pass http://$websocket_addr;
}
}

注意这里刚开始,我使用的是set_by_lua_file来返回一个websocket_add。那样容易理解但是不支持redis,与数据库的访问。所以这里使用了rewrite_by_lua_file方式。在开始出声明了websocket_add全局变量,主要是为了在lua插件里面进行修改。下面看lua插件简单版本为了方便管理,我建立了lua代码目录在/usr/local/lua。文件名取名为dispatcher.lua

local var = ngx.var
hosts = {
"127.0.0.1:8109",
"127.0.0.1:8108",
}
host = hosts[math.random(#hosts)]
ngx.var.websocket_addr = host

这个时候再打开一个websocket服务器,例如我跑了两个tornado的websocket服务器分别运行了8109/8108端口,(websocket服务器简单版在https://github.com/land-pack/tornado-websocket-example/blob/master/app/simple.py)

这时候你最好启动两个,分别监听这两个端口。下面就可以重新启动你的openresty版本的nginx了。

通过chrome的websocket客户端你可以访问到下面这个地址。

可以看到,我们的请求得到了回复。那么这次我只是通过lua的随机数进行的负载分配的,这就是我们的第一步,下一篇我将会介绍如何通过redis来管理分配我们的客户端连接~~

总结

好久没写blog了,最近又学了那么多新玩意,想记录一下~~

openresty使用笔记(一)的更多相关文章

  1. openresty 学习笔记小结:综合应用实例

    openresty 学习笔记小结:综合应用实例 这个综合实验实现的功能其实很简单,用户访问一个页面,显示一个默认页面.输入参数(post或者get都可以),如果参数在数据库查询得到并满足一定条件,根据 ...

  2. openresty 学习笔记六:使用session库

    openresty 学习笔记六:使用session库 lua-resty-session 是一个面向 OpenResty 的安全和灵活的 session 库,它实现了 Secure Cookie Pr ...

  3. openresty 学习笔记番外篇:python的一些扩展库

    openresty 学习笔记番外篇:python的一些扩展库 要写一个可以使用的python程序还需要比如日志输出,读取配置文件,作为守护进程运行等 读取配置文件 使用自带的ConfigParser模 ...

  4. openresty 学习笔记番外篇:python访问RabbitMQ消息队列

    openresty 学习笔记番外篇:python访问RabbitMQ消息队列 python使用pika扩展库操作RabbitMQ的流程梳理. 客户端连接到消息队列服务器,打开一个channel. 客户 ...

  5. openresty 学习笔记五:访问RabbitMQ消息队列

    openresty 学习笔记五:访问RabbitMQ消息队列 之前通过比较选择,决定采用RabbitMQ这种消息队列来做中间件,目的舒缓是为了让整个架构的瓶颈环节.这里是做具体实施,用lua访问Rab ...

  6. openresty 学习笔记四:连接mysql和进行相关操作

    openresty 学习笔记四:连接mysql和进行相关操作 毕竟redis是作为缓存,供程序的快速读写,虽然reidis也可以做持久化保存,但还是需要一个做数据存储的数据库.比如首次查询数据在red ...

  7. openresty 学习笔记三:连接redis和进行相关操作

    openresty 学习笔记三:连接redis和进行相关操作 openresty 因其非阻塞的调用,令服务器拥有高性能高并发,当涉及到数据库操作时,更应该选择有高速读写速度的redis进行数据处理.避 ...

  8. openresty 学习笔记二:获取请求数据

    openresty 学习笔记二:获取请求数据 openresty 获取POST或者GET的请求参数.这个是要用openresty 做接口必须要做的事情.这里分几种类型:GET,POST(urlenco ...

  9. openresty 学习笔记一:环境安装

    openresty 学习笔记一:环境安装 openresty 是一个基于 Nginx 与 Lua 的高性能 Web 平台,其内部集成了大量精良的 Lua 库.第三方模块以及大多数的依赖项.用于方便地搭 ...

随机推荐

  1. const常量类型

    1.定义:const常量类型表示一个”常值变量“,其值是不能被修改的变量.即一旦变量被声明为const类型,编译器将禁止任何试图修改该变量的操作. 2.声明:const <声明数据类型> ...

  2. 【stm32中断优先级--珍藏版】

    看了这么久,一直不理解中断优先级,还有中断嵌套.stm32提供了多种嵌套方式,搞的我真是头昏脑涨. 今天终于看到了一个通俗解释中断优先级的博客.算是理解了一点吧. 原文地址:http://blog.s ...

  3. ubuntu 下安装Angular2-cli脚手架

    一.首先需要安装node,npm. 请到nodejs官网进行下载并跟据提示进行安装 版本号中间偶数为稳定版本建议下载 https://nodejs.org/en/ node相关操作 https://n ...

  4. H5前端框架推荐合集

    Ionic ionic 吧开发流程都帮你做好了,已经不再是单纯的UI框架,而是开发框架了,非常适合快速开发.基于angular2,丰富的UI组件,大大改进的编程模型, Semantic UI 中文官网 ...

  5. 为RecyclerView的item之间设置相同的间距

    项目中经常碰到列表当中的每一项之间需要设置间距的问题,我们可以通过给列表中的每一项设置margin值来实现,例如纵向的间距可以给每一项设置right_margin,这种方法下,整个列表的最左边会紧贴屏 ...

  6. hdu1083二分图匹配模板题

    onsider a group of N students and P courses. Each student visits zero, one or more than one courses. ...

  7. 分布式开放消息系统(RocketMQ)的原理与实践(转)

    转自:http://www.jianshu.com/p/453c6e7ff81c 分布式消息系统作为实现分布式系统可扩展.可伸缩性的关键组件,需要具有高吞吐量.高可用等特点.而谈到消息系统的设计,就回 ...

  8. .Net程序员学用Oracle系列(24):数据字典、死锁

    1.静态数据字典 1.1.实用静态数据字典 1.2.运用静态数据字典 2.动态数据字典 2.1.实用动态性能视图 2.2.运用动态性能视图 3.死锁 3.1.定位死锁 3.2.解锁方法 3.3.强制删 ...

  9. 如何设置自适应当前浏览器高度的div块

    嗯 就是下面这样 <!DOCTYPE html> <head> <title>adaptive this page size</title> <s ...

  10. m个苹果放入n个盘子问题

    这个问题,看似是一个简单的排列组合问题,但是加上不同的限制条件,会演变成不同的问题,感觉很奇妙,就总结一下列举下来 问题一 问题描述:把m个同样的苹果放在n个同样的盘子里,允许有的盘子空着不放,问有多 ...