我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发加微信,交友),转载本文需作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。前言:题目其实有两层意思:为什么重构,为什么选择Go。背景如果你已经看过《我做了个《联机桌游合集: UNO+斗地主+五子棋》,无需下载,直接点击播放!打电话给你的朋友,现在就开始玩吧!不看广告,不做任务,享受“纯”游戏!》这篇文章,我知道我的在线棋牌游戏后端选择的是python,使用ASGI协议,使用Daphne实现。但是众所周知,Python效率有限。为了让我的小坏掉的服务器承受更多的并发压力,我需要让CPU运行的更高效,希望每个请求,CPU花费的时间更少,这样可以增加并发量应用瓶颈其实很多websocket应用的瓶颈在CPU性能和内存,如果请求量很大,CPU没有及时处理,源源不断的客户端请求会堆积在内存中,导致内存占用增加,进一步减慢处理时间,高负载CPU运行情况,比较显着的特点是:CPU被充分利用,内存占用持续上升。每时每刻。当然,这些只是通俗的说法。针对具体的应用瓶颈,需要做压力测试,找到“短板”。这样,当流量突然增加时,你就知道应该优先“扩容”到哪里了。为什么要重构自研的WebSocket框架,架构非常简单,没有任何外部组件依赖(不依赖Redis、MySQL、MQ等数据库或队列)。方便我们分析。整个链接是:用户浏览器->OpenResty->Daphne(Python)。其中,我将OpenResty的最大连接数配置为6w,短期内不会成为“短板”。如果以后用户量足够大,我们会想办法。瓶颈最有可能出现在Python服务上。目前存在以下问题:代码执行效率可以优化。Python是动态解释的,效率不如编译成机器码的语言(C++、Go)。一个核心逻辑是使用Python序列化和反序列化ProtocolBuffer二进制文件。目前是纯Python实现,可以优化。目前,每个连接都是基于协程来处理的。由于PIL的存在,Python无法充分利用基于多线程的多核CPU。所有的数据都保存在内存中,随着时间的增长,内存占用会越来越高。无容灾+难扩容。现在扩展只能扩展单台机器的容量,不能在多台机器上运行程序。而且单机宕机后,100%的用户都会受到影响。解决方案:针对问题1和问题2:放弃Python,选择其他语言实现功能。所选语言应该解决这两个问题。第三个和第四个问题,我们以后再说。这一段解释了我为什么要重构。其实核心就是:降本增效。没钱买昂贵的服务器,只能在不影响开发效率的情况下压榨性能。为什么选择GoGoroutine?你可以理解C10K的并发问题。Linux引入epoll来解决这个问题。然后是C10M和其他问题。如果依靠传统的多线程模型,每个线程处理1个连接。那么当连接过多的时候,线程调度就会耗费大量的时间,导致效率低下。于是就有了协程的概念。之前用的是Python,是协程处理的,每一个连接就开一个协程。整体只有一个线程,减少了操作系统调度多个线程的开销。另外学习了Go,提出了goroutines,不是协程也不是线程。线程特点:调度完全由操作系统来调度,开发者无法直接控制。他们只能通过加锁来管理多个线程的执行顺序。协程特点:调度完全由开发者控制,但在一个协程主动放弃执行权之前,其他协程必须暂停。Goroutine的特点:调度不是由操作系统直接执行的,开发者也无法控制,因为goroutine的调度是由goruntime这个比操作系统线程更轻量级的调度器来调度的。在一个goroutine主动放弃执行权之前,其他goroutine也有执行的机会(比如有多个goroutine时,每个goroutine被限制为最多连续执行10ms,必须放弃执行权)。另外,开发者可以通过通道来控制多个goroutines的执行顺序。总结一下:Goroutines比线程更高效。类似于协程。Goroutine的开发成本低于线程,使用channel可以大大减轻并发编程的精神负担。但是有时候还是需要依赖锁,不如协程。Goroutine避免了协程的这个问题:如果单个协程遇到计算密集型任务,就会阻塞其他协程。Go在开发效率和运行效率之间的权衡,既保证了开发效率,又保证了优秀的运行效率。它被称为下一代C++。这是网上压力测量数据的图表。可见,总的来说,Golang是Python、NodeJS、Java中比较全面的选手。最后,我是公众号线下派对游戏的作者HullQin(欢迎关注公众号,发送加微信,交友),转载本文需作者HullQin授权。我独立开发了《联机桌游合集》,这是一个网页,在这里你可以轻松地和朋友一起玩网络游戏,五子棋等游戏,不收费,也没有广告。还为GameJam2022开发了《Dice Crush》,喜欢的话可以关注我HullQin哦~有空我会分享制作游戏的相关技术。
