1. 交易
1.1 需求
采用拍卖场模式,支持一口价和出价(最低加价5元宝,不设置上限)
1.2 实现
1.2.1 接口
mina监听指定socket端口(数据库设置一个t_server_config表,相关各种配置一并存入)
1.2.2 实现
pixel_character.auction 表
1.2.2.1 添加物品
消息到达后,insert table,并返回insert结果,消息中包含底价和一口价
1.2.2.2 出价
消息到达后,update table,where字句中应当指定status和price范围(小于一口价)(where字句中限制新值必须大于旧值)
1.2.2.3 一口价
消息到达后,update table,where字句中应当指定status
1.2.2.4 拍卖到期物品发送
启动一个离线线程,每5分钟(?是否合适,其实可以将完成的交易放入队列让异步线程立即处理)扫描一次数据库,并将到期的拍卖物,调用逻辑服务器接口,mail给指定userid
1.2.2.5 查询
t_equipment 装备
t_goods_model 普通物品
2. 聊天
2.1 需求
广播:message推送所有逻辑服务器
团队消息:message推送所有团队成员所在的服务器
p2p消息:message推送指定id
2.2 实现
2.2.1 接口
mina监听指定socket端口(与逻辑服的连接可以共用)
2.2.2 实现
2.2.2.1 广播
接到请求后,message转发所有逻辑服务器
2.2.2.2 团队消息
接收到请求后,查询redis中团队成员(最大允许多少人?)所在的逻辑服务器,message转发至团队成员所在的逻辑服务器
2.2.2.3p2p消息
接收到请求后,查询redis中目标所在的逻辑服务器,message转发至于目标所在的逻辑服务器
3. 战斗
N/A
4. 登录
4.1 需求
login:将user从上一个逻辑服务器下线,并在指定的逻辑服务器上线
logout:将user从指定的逻辑服务器下线
(保证登陆session的唯一性)
4.2 实现
4.2.1 接口
提供两个HTTPServlet,LoginServlet,LogoutServlet
还要给逻辑服提供
4.2.2login
查询redis中userid上一个逻辑服务器,调用接口将其从此逻辑服务器下线。
并选择合适的的逻辑服务器(负载最少的?or轮询?策略可动态调整,方便运营倒量+平衡负载)上线,redis中指定逻辑服务器在线人数加1
4.2.3logout
查询redis中userid当前逻辑服务器,调用接口将其从此逻辑服务器下线,,redis中指定逻辑服务器在线人数减1
5. 服务器状态Servlet
5.1 需求
可以通过此Servlet获取当前服务器状态信息
包括:
服务器连接信息
线程信息
物品发送队列信息
登录统计信息(登录和注销的用户数量,分逻辑服务器在线人数)
上一分钟的请求数量
6. 其他设计
6.1 缓存
reids中key的ttl设置为86400秒
6.2 线程控制
在ServletContextListener中启动所有线程,包括:
逻辑服务器连接守护线程,每个逻辑服务器一个
拍卖到期物品扫描线程
物品发送线程(与拍卖到期物品扫描线程,通过阻塞队列交互)