分布式架构服务设计-以棋牌游戏为例

前言

对于一般的业务服务开发,特别是棋牌游戏、小众app在大多数平台并发量都不是很大的情况下,一般都采用单点服务;基本上在单台机器上即可完成所有的服务。提高系统的并发能力,通过垂直扩展,既提升单机处理能力主要有以下2种方式:

1、增强单机硬件性能:例如升级硬盘,由机械硬盘升级到固态硬盘,或者扩充硬盘容量等。

2、提升单机架构性能:例如使用Cache来减少IO次数,使用异步来增加单服务吞吐量,使用无锁数据结构来减少响应时间。

但互联网业务发展是十分迅猛的,由小平台慢慢扩大到更大的平台,那么业务的复杂性,特别是整个系统服务遇到的并发量将大大的提高;单纯提升单机处理能力始终是会遇到瓶颈;此时提供与垂直扩展相反的一种设计方法,水平拓展,一种分布式加上服务,让理论上将服务性能拓展到极限。此时互联网服务分布式架构就应用而生,此处将以一般棋牌游戏设计为例,讲述解决高并发下互联网游戏分布式架构服务设计。

棋牌游戏简易服务架构设计

棋牌游戏站在业务需求上分析,一般来说,棋牌游戏都是不分区不分服的;可分为大厅-游戏场-游戏这几个步骤。针对此需求,站在只是满足业务开发不考虑高并发思路下,主要是下面几点思路来设计简单一款棋牌游戏服务架构:一数据共享,由于棋牌游戏不分区不分服务,那么在设计服务器即可划分为大厅服务,也就是大厅全局业务服务;同时与游戏服务共享数据。二按顺序创建房间,由大厅服务开始进入不同的金币场,刷选房间进入游戏服务。三大厅-游戏,是一整套系统来设计,这个大厅就相当于处理这款游戏需要通用的服务,比方说邮件、商城兑换、交易等。大体架构设计图:


采用网关,主要是为了保证服务之间的稳定,对外不暴露。当然次数网关不一定需要程序员来开发一套网关,市面上采用nginx即可,此处网关是可以做到多点部署,毕竟在联通、移动、电信等各种网络流畅性各不一样的情况下,要做到多点部署。通过数据库服务让大厅-游戏服务之间数据共享,建立场管理服务,解决需要按照顺序创建房间服务。在此,一款简易棋牌游戏服务架构大厅就这样。如果对于一款小公司来说,首先是为了解决生存问题,那么采用此简易的服务架设问题并大。

高并发情况下演变

我们都知道智猪博弈原理。特别是最近中国科技公司频繁受到美国打击,这表明这是一个正常社会现象,即一家公司发展越来越顺利,慢慢做大,特别是在互联网上,就演变称为业务越来越多,服务越来越复杂,访问量越来越大;那么类似我们这些简易服务架构该怎么演变?首先必须要先解决访问量的问题,那么网关就不能采用单一socket,有状态服务来部署,简单来说,必须支持无状态部署,而这个无状态的部署就必须需要业务划分各个细节。同时业务越来越复杂,把所有的业务都放在一个业务逻辑显然是不够的;类似这个简易服务架构设计,后面棋牌大厅就不仅仅是一款游戏服务,而是有几十款乃至上百款;邮件、商城兑换、交易等一系列的服务会接踵而来。肯定,我们将所有的业务都放到这个大厅服务是不够的,会有很多共同的功能需要分开来。这样子才能做到服务的简单化。所以,微服务设计理念在最近几年一直衍生出来。

我们需要对这个大厅服务做一次服务拆分。从最简单的思路出发,由于这些服务并不特别需要玩家的状态,所以我们可以建立类似微博、头条等web服务来拆分。比方说微信授权服务、商城交易服务等等,完全可以跟玩家没有任何状态联系,那么我们设计服务上,就可以对这些服务做一系列的拆分。拆分一整套无状态服务,也是采用微服务设计理念,分而治之。但服务多了,我们只是一个单点服务,那么每个服肯定会遇到性能上瓶颈。所以为了防止单点,考虑到高并发情况下,每个服务都采用集群。集群的设计很重要,一方面它让服务变得稳定,性能变得更强大,对运维的要求越来越高。同时,它对系统的设计提出了要求,尽量采用无状态服务,保证服务是能跟支持水平拓展的。

那么问题来了,如果业务下必须是有状态服务,类似游戏服务,必须是有状态的。想想如果在无状态下服务,玩家玩游戏的话,就会遇到各种我们必须要解决的基础性的问题。所以这一块必须是有状态的服务。但问题又来了,我们怎么在高性能下保证它能支持水平拓展呢?有状态的服务,不可避免采用数据库选择,因为必须与数据库存储读写才能获取玩家准确性的状态数据;问题就自然而然对数据库有要求了,为了达到高并发性能不受影响的话,所以,为了支持水平拓展,我们必须要在数据库上支持分库分表,水平拓容。想要在众多数据库或者表中能快速查下,我们可以根据用户的后缀,采用哈希表也好,来设计一个分库分表,这样的话,我们能快速进行数据库的查询。保证整个服务完整性。

综上,对待业务越来越复杂的情况,高并发情况下,我们将从网络访问、业务服务、数据管理服务,做到集群部署。这也是分布式架构服务设计核心,达到理论上性能极限。具体服务架构设计思路图:


此处只是以棋牌游戏为例,每个互联网所遇到的业务不尽相同,根据情况而定,对系统做出分析,找到系统平衡点,对平衡的地方把它单独的拉出来分出做一个集群服务。那么很多事情只是运维来处理。

你可能感兴趣的:(分布式架构服务设计-以棋牌游戏为例)