游戏服务器开发指南(八):合理应对异常

游戏服务器后端开发详解与实践 Netty自诞生之初,就被设计为用于快速开发可维护的高性能协议服务器和客户端。通过减少资源消耗、提供高吞吐量、减少时延和提供强大的容错能力,Netty能够应对游戏服务器端面临的各种挑战。Protocol Buffers(简称Protobuf)是Google开发的一种数据序列化协议,用于结构化数据的序列化和反序列化。它与XML和JSON类似,但更加高效、简洁、具有更好的性能。Protobuf使用一种特定的语法定义数据结构,这种结构在.proto。 阅读详情

大家好!我是长三月,一位在游戏行业工作多年的老程序员,专注于分享服务器开发相关的文章。

本文是通用程序设计主题下的第二篇。这个主题主要探讨如何编写高效、健壮、易读的游戏业务代码,每篇从一个小点切入。本次讨论的要点是:如何合理地应对异常。

异常(错误处理)是游戏服务器开发中绕不开的一个话题。合理地处理异常,能够将故障对玩家的影响降到最低水平,快速从错误中恢复,并提供充足的信息,避免以后再出现类似的问题。

有些编程语言(例如Golang)会把异常和错误分开,这里为了方便说明,用异常来统一指代这两种类型。因为这两者在处理方法上是相通的。

总的原则是根据异常的严重程度和影响范围在不同层次处理。对于服务器启动时的严重异常,应向顶层抛出,立即中止服务器运行;而对于仅影响个别玩家的异常,应及时捕获异常,避免影响其他玩家。

看下面一个Java写的例子。服务器在启动时调用start方法做一些初始化工作,其中包括对于Redis客户端的初始化:测试Redis服务器是否可连通,如果可连通初始化连接等。如果发现Redis服务器连接失败,抛出异常,这里不会对异常捕捉,而是逐级抛到顶层,让服务器进程中断运行。

public void serverStart() {	// 服务器启动时初始化
	// do some init work
	// ...
	RedisClient.init();	// 初始化Redis客户端,如果失败直接抛出异常,不要捕捉
	// do other init work
	// ...
}

这样做的好处是让程序员及时检查问题并做修正,避免后续问题的发生。试想,如果我们改成捕捉异常并恢复程序运行,那么当服务器启动完成后玩家正常进入,可是需要使用到Redis存取数据时才发现功能不可用,必然会引起玩家的不满。所以,对于这种影响全局的严重问题,不如在停服重启的时候就彻底解决好,解决了再对玩家开放服务器。

这种异常处理策略被称为快速失败(fail-fast),即检测到异常后直接抛出并中止程序运行。它适用于严重而且无法恢复的异常情形,好处是能第一时间发现和定位问题,并且避免错误对后续逻辑的影响。JDK中也有对fail-fast思想的运用,例如ArrayList是一个非线程安全的容器,如果在使用for-each遍历元素的同时又修改了它的结构,那么会第一时间抛出ConcurrentModificationException,快速而干净地失败,而不是冒着在未来不确定的时间出现不确定行为的风险。

对于全局性的严重异常,我们固然要fail-fast。但是对于仅影响部分玩家或者部分场合的异常,我们要及时捕捉并恢复,避免不恰当地扩大影响范围。

在游戏中经常会有活动排行榜结算的场景。活动结束时,按照参与活动玩家在排行榜的名次依次发奖。通常这样的操作放在定时任务中执行。如果某一个玩家发奖出现异常,我们需要及时捕捉异常并记录详细的日志,避免影响到其他玩家。

public void giveAwards() {	// 为活动结算发奖
	for (Rank rankData : rankList) {
		int playerId = rankData.getPlayer();
		int rank = rankData.getRank();
		try {
			giveAwards(playerId, rank);	// 为单人发送排名奖励
		} catch (Exception e) {
			logger.error(e, "发送奖励失败,角色id是{},排名是{}", playerId, rank);	// 错误日志中包含详细的信息
		}
	}
}

对比一下,如果我们不对单个玩家发奖捕捉异常,那么出现异常时会导致所有人的发奖失败,势必会引发更多玩家不满,而且需要做更多补偿。由于我们及时捕捉异常,因此发奖失败仅仅被限制在单个玩家范围内,事后处理也要容易得多。

另一个限制异常影响范围的例子是服务器战斗。在逐帧进行的服务器战斗中,每帧运算出现异常时,需要及时捕捉,这样只会影响当前帧,而不会导致战斗直接退出,甚至战斗线程挂掉。

public void frameLoop() {	// 开启战斗房间的循环运算
	while (isStart) {
		long starTime = System.currentTimeMillis();
		try {
			room.update();
		} catch (Exception e) {
			logger.error(e, "战斗房间异常");	// 每帧计算有异常则捕捉,不影响下一帧
		}
		long endTime = System.currentTimeMillis();
		long sleepTime = frameInterval - (endTime - startTime);
		if (sleepTime > 0) {
			Thread.sleep(sleepTime);
		}
	}
}

捕捉异常时,我们要在日志记录充足的信息,以便后续追踪修复问题和做线上处理,不要忽略异常而什么都不记录。要记录的信息应包括完整的异常堆栈、角色id以及其他重要信息。例如上面提到过的发奖失败日志,除了异常堆栈,还应包括角色id和排名,这样方便事后为对应玩家做补偿。

logger.error(e, "发送奖励失败,角色id是{},排名是{}", playerId, rank);
sentinel——SLC数据下载、DEM数据下载拼接、精密轨道数据下载方法 Sentinel——SLC数据下载、DEM数据下载、精密轨道数据下载方法 SLC数据下载 网址:https://search.asf.alaska.edu DEM数据下载 1 手动下载 http://srtm.csi.cgiar.org/srtmdata/ 3.在SARscape中使用下载好的DEM 将下载好的DEM放在软件默认下载DEM路径下(默认路径是C:\Users<用户名&g... 阅读详情

相关推荐

国产安全芯片在密码算法国密体系下的性能适配策略

国密体系即国家商用密码体系,是保障信息安全的核心技术体系。自20世纪90年代末起步,国密体系经历了从无到有、从弱到强的发展历程。1999年,国家密码管理局成立,标志着国密体系的正式建立。2000年,国密SM1算法首次发布,开启了国密算法的标准化进程。此后,SM2、SM3、SM4等算法陆续推出,形成了完整的对称与非对称密码算法体系。:2010年,国密标准正式纳入国家标准体系,国密算法在金融、政务、通信等关键领域的应用得到明确规范。

qq_40552871的博客 1356

揭秘Java游戏服务器新星:iogame框架的极速开发之道

想要在Java游戏服务器开发领域实现质的飞跃吗?iogame游戏服务器框架以其革命性的设计理念和卓越的性能表现,正在重新定义游戏后端开发的效率标准。这款专为游戏场景深度优化的框架,将为您开启全新的开发体验。 ## 🎯 从零开始的快速入门指南 ### 环境搭建一步到位 在开始iogame之旅前,请确保您的开发环境准备就绪: - Java运行环境:JDK 8及以上版本 - 构建工具:Maven

gitblog_00304的博客 769

ZYNQ出现问题及解决办法汇总(一直更新)

问题目录使用软件及开发板版本一,vitis在build project时卡住。二,Could not find FPGA device on the board for connection 'Local'三,FPGA configuration failed:DONE PIN is not high四,Could not find ARM device on the board for connection 'Local' 使用软件及开发板版本 开发板:MZ7XA-7020 软件:vitis2020.2(

qq_45057368的博客 1万+

Java游戏服务器开发流水账(1)游戏服务器的架构浅析

新项目立项停滞,近期读老项目代码看到Java,读代码的要点笔记记录一下。

wgc2k的博客 1744

别再手动连线了!用Tessent IJTAG的SIB和TDR,5分钟搞定复杂芯片的DFT网络分区

本文探讨了如何利用Tessent IJTAG的SIB(Segment Insertion Bit)和TDR(Test Data Register)技术,高效解决复杂芯片DFT网络分区问题。通过智能化的扫描链管理和声明式定义,显著降低连接复杂度,提升测试覆盖率和良率,适用于超大规模SoC设计。

weixin_29251131的博客 300

PCB工艺-SI9000使用教程

本文介绍了阻抗计算工具SI9000的使用方法,重点讲解了微带线与带状线的区别、共面阻抗概念及参考面选择。通过USB差分走线实例,详细说明了如何选择计算模型、填写参数并确定线宽线距。文章还提供了层叠设计资料和工厂常规阻抗表格作为参考,建议制板时标注需控阻抗的线路供板厂调整。最后简单提及了嘉立创阻抗计算工具作为备选方案。

weixin_50120208的博客 2026

OpenMir2传奇游戏服务器:从零开始的完整部署指南

OpenMir2是一个基于C#开发的经典《传奇2》游戏服务器开源项目,为游戏爱好者和开发者提供了完整的MMORPG服务器解决方案。该项目通过模块化架构设计,实现了高性能、易扩展的游戏服务器框架,让用户能够快速搭建属于自己的传奇世界。 ## 项目核心价值与特色优势 OpenMir2不仅仅是一个游戏服务器,更是一个完整的技术学习平台。它采用分布式架构设计,将不同的游戏功能模块拆分为独立服务,包括数

gitblog_00625的博客 995

2025东方财富笔试考什么?cata能力测评攻略|答题技巧真题分享

4月10日-4月20日 专业笔试(行测+金融知识混合双打) 4月25日-5月10日 面试车轮战(AI面+半结构化+压力面) 5月15日起 Offer发放(谈薪必杀技:对标同花顺/雪球)这里不仅是金融极客的乐园,更是**“年薪30万管培生计划”**的主战场——你将用代码重构K线,用算法预判市场,成为资本市场的“数字先知”。东方财富,中国金融信息服务领域的“隐形冠军”,以**“金融数据+互联网”双擎驱动**,打造了覆盖证券、基金、期货的全生态交易平台。:• “我总坚持自己的方案”(HR:团队毒药!

Dgntsj的博客 3262

txAdmin游戏服务器管理面板完整安装指南

txAdmin作为全球超过23,000个服务器使用的FiveM/RedM官方管理平台,为游戏服务器管理员提供了一站式的解决方案。本指南将详细介绍如何从零开始部署和使用这个强大的管理工具。 ## 为什么选择txAdmin管理面板 txAdmin彻底改变了传统游戏服务器的管理方式,它提供了完整的Web界面,让管理员能够远程监控和管理服务器状态。无论是新手还是经验丰富的管理员,都能通过直观的操作界面

gitblog_00266的博客 878

深入详细分析Skyworks 78113 PAMiD射频方案图

是一种高集成度的射频前端模块,它结合了功率放大器(PA)、双工器(Duplexer)、滤波器和开关等多个组件,主要用于4G LTE移动通信系统中的射频前端链路。是一款典型的PAMiD模块,通过将多个频段的发射(TX)和接收(RX)路径集成在一个模块中,大大减少了传统射频设计中的分立器件,同时提高了信号链路的效率和可靠性。模块化设计的优势PCB空间优化:高集成度设计大幅减小了射频电路的尺寸,适用于紧凑型移动设备。减少设计复杂度:模块化设计减少了器件间的匹配与调试工作,加速产品开发周期。性能稳定性。

weixin_43199439的博客 1480

TMS320F28377D双核开发例程 - DSP开发

首先,我们需要创建一个新的工程来进行开发。然后,选择适当的目标设备为TMS320F28377D,并设置工程的名称和存储位置。在上面的代码中,我们定义了一个128个元素的输入数组和输出数组。然后,我们使用一个简单的数字信号处理算法,将输入数组中的每个元素平方,并将结果存储到输出数组中。这个芯片的双核架构提供了更高的计算能力和灵活性,使得数字信号处理的开发更加高效和可靠。希望本文对您有所帮助!当应用程序在TMS320F28377D芯片上运行时,它将对输入数组中的每个元素进行平方运算,并将结果打印出来。

IfllUnity的博客 2517

如何快速掌握Skynet游戏服务器框架:从零开始的终极指南

你是否正在寻找一款轻量级且高效的游戏服务器框架?想要构建高性能的在线游戏服务却不知从何入手?本文将为你提供完整的Skynet框架入门教程,通过3个核心步骤带你快速掌握这个在中国游戏行业广泛应用的轻量级游戏服务器框架。 Skynet是一个基于Actor模型的多用户Lua框架,专为在线游戏开发设计。作为一款轻量级游戏服务器框架,它具有内存占用低、并发性能强、模块化设计等优势。本文将为你揭示Skyne

gitblog_00981的博客 670

【华为OD技术面试手撕真题】1、长度最小的子数组 | 手撕真题+思路参考+代码解析(C & C++ & Java & Python & JS)(三种解法)

【华为OD面试手撕真题】长度最小的子数组,本专栏更新每年华为OD机试的高频手撕代码题,每个题目都会使用五种语言进行解答(C & C++& Java & Python & JS),思路分析都非常详细, 实现最低的时间复杂度和高通过率,每个解题思路超过百字,内含各个编程语言的八股文面试题,欢迎大家订阅学习, 代码可以直接运行使用,全网限时最低价,持续更新

KJ.JK 1万+

游戏服务器-日志系统

游戏服务器-日志系统 游戏服务器的日志系统主要分为业务日志和程序日志。业务日志主要是给运营进行使用。程序日志则主要是给开发者调试日志,查找bug使用 扩展:后续可以加上性能检测日志等。 业务日志 业务日志主要是给运营进行使用。 程序日志 程序日志则主要是给开发者调试日志,查找bug使用。为了使日志更加的客观,通常按照不同的系统模块来输出对应模块的程序日志文件,方便后续线上来进行查找bug。 则程序日志可以继续细分:系统模块日志、架构代码异常日志 系统模块日志: 游戏有需要功能模块:活动、玩家、登录

awake_lqh的博客 1448

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

FreeKill多人联机开发指南:构建稳定游戏服务器的7个关键技巧

FreeKill是一款基于Qt和Lua开发的开源桌面游戏引擎,支持多人联机对战功能。本文将分享7个关键技巧,帮助开发者构建稳定高效的FreeKill游戏服务器,提升玩家联机体验。 [![FreeKill游戏场景背景](https://raw.gitcode.com/gh_mirrors/fr/FreeKill/raw/37f8c1248d491f5fbc7a07f1bc53724191e4449

gitblog_00139的博客 473

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

Leaf游戏服务器框架:为什么它成为Go语言游戏开发的首选?

Leaf游戏服务器框架是一个由Go语言编写的开源游戏服务器框架,专注于开发效率和执行效率的完美平衡。这款Go语言游戏服务器框架已经成为众多开发者构建高性能游戏服务器的首选工具,特别适合各类游戏服务器的开发,包括H5游戏服务器。 ## 🚀 Leaf框架的核心优势 **极简设计理念**:Leaf框架提供了极其简洁和易用的接口,让开发者能够快速上手并高效开发。无论是新手还是经验丰富的开发者,都能在

gitblog_00301的博客 969

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

Tabby游戏开发终极指南:高效管理游戏服务器和调试工具

Tabby作为一款现代化的终端模拟器和SSH客户端,为游戏开发人员提供了强大的服务器管理和调试工具。在前100字内,Tabby的核心功能已经展现了它作为游戏开发利器的价值——通过集成SSH客户端、串行终端和高度可配置的界面,让开发者能够轻松管理游戏服务器、实时监控日志并进行快速调试。 ## 🎮 为什么游戏开发者需要Tabby? 游戏开发过程中,服务器管理和调试是至关重要的环节。Tabby通过

gitblog_00202的博客 540

Leaf数据库集成终极指南:MongoDB在游戏服务器中的最佳实践

Leaf游戏服务器框架为开发者提供了完整的MongoDB数据库集成方案,通过[db/mongodb/mongodb.go](https://link.gitcode.com/i/cb6a6c998dda237b8b4c2e82210d4233)实现了高效、安全的数据库连接管理。作为Go语言开发的游戏服务器框架,Leaf的MongoDB模块让游戏数据存储变得简单可靠。🚀 ## 🌟 为什么选择L

gitblog_00323的博客 1080

解密Leaf游戏服务器框架:从核心工具到高性能架构的实战指南

Leaf作为一款基于Go语言的游戏服务器框架,以其简洁高效的设计理念赢得了众多开发者的青睐。本文将从底层原理到实战应用,深入剖析Leaf框架的核心工具与架构设计,为游戏服务器开发者提供一份全面的技术指南。 ## Leaf框架的核心价值定位 Leaf框架的核心理念在于平衡开发效率与执行性能,为游戏服务器开发提供了一套完整的解决方案。在当今游戏服务器开发领域,开发者常常面临并发处理、网络通信、模块

gitblog_00881的博客 887

Colyseus 终极入门指南:10分钟搭建你的第一个多人游戏服务器

Colyseus是一个强大的**权威多人游戏框架**,专为Node.js设计,让开发者能够快速构建实时多人游戏体验。无论你是想制作休闲游戏、策略游戏还是MMORPG,这个框架都能提供完美的解决方案。🚀 ## 为什么选择Colyseus? Colyseus框架专注于提供可同步的数据结构,支持实时和回合制游戏,内置匹配系统,让服务器端和客户端的开发都变得异常简单。 **主要优势**: - 🎮

gitblog_00803的博客 870

终极对比:Pomelo与传统游戏服务器性能大揭秘,为何Node.js更适合实时游戏开发

在当今实时游戏服务器开发领域,**Pomelo框架**代表了Node.js技术栈的巅峰之作。作为一个快速、可扩展的分布式游戏服务器框架,Pomelo通过其独特的架构设计,在性能方面彻底颠覆了传统游戏服务器的局限。本文将深入分析Pomelo与传统游戏服务器的性能差异,揭示Node.js在实时游戏开发中的独特优势。 ## 🚀 Pomelo架构优势:多进程单线程的完美平衡 Pomelo采用**多进

gitblog_00258的博客 935

游戏服务器开发面试必问:进程、线程、协程的实战应用与性能对比

本文深入探讨游戏服务器开发中进程、线程和协程的实战应用与性能对比,帮助开发者应对高并发挑战。通过分析三种模型的核心差异、典型应用场景和优化策略,为游戏服务器架构设计提供专业指导,特别适合准备游戏服务器开发面试的工程师提升技术深度。

weixin_28365523的博客 402

从Prompt Engineering到Harness Engineering:游戏服务器开发的AI工程范式

作为一名常年和高并发、低延迟、7×24小时在线打交道的游戏服务器开发者,我越来越深刻地感受到:只会写Prompt的AI,根本撑不起游戏服务器的生产级需求。同样使用大模型,有人仅用来完成简单代码片段编写,有人却能让AI落地完整链路研发:协议生成、代码审查、压测分析、线上异常辅助自愈。核心差距,不在于模型强弱,而在于 。游戏服务器与通用后端业务有着本质区别,研发约束极强:痛点非常明显:为大模型搭建一套标准化、可约束、可校验、可回溯的执行框架,让AI严格遵循项目规范、服务端并发模型、数据安全规则,稳定产出符合生产

代码时光 713

参与 Apache MXNet 开源贡献:从社区沟通到代码合入的完整开发指南

Apache MXNet 是一个社区驱动的开源深度学习项目,社区贡献是项目持续演进的核心动力。本文以项目官方社区文档 [docs/static_site/src/pages/community/index.md](https://link.gitcode.com/i/94b2b51eeb99743ddbea46d5c2498fea) 为主体,系统梳理 MXNet 的社区沟通渠道、贡献方式、RFC

gitblog_01054的博客 877

30分钟上手Skynet:轻量级游戏服务器框架终极指南

你是否正在寻找一款轻量级且高效的在线游戏服务器框架?是否希望快速搭建一个支持高并发的游戏后端系统?Skynet框架正是为游戏开发者量身定制的解决方案!作为一款基于Actor模型的多用户Lua框架,Skynet以其卓越的性能和简洁的设计在游戏行业广受欢迎,尤其在中国游戏开发社区中有着广泛应用。 ## 🚀 为什么选择Skynet游戏框架? Skynet不仅仅是一个游戏服务器框架,更是一个完整的分

gitblog_00481的博客 354

如何高效管理游戏服务器日志:Skynet框架的日志轮转终极指南

在游戏服务器开发中,日志管理常常被忽视,直到磁盘爆满、性能下降甚至服务崩溃时才追悔莫及。Skynet作为一个轻量级在线游戏框架,提供了一套优雅的日志轮转解决方案,帮助开发者避免"日志雪崩"问题,确保游戏服务器稳定运行。 ## 游戏服务器日志的常见痛点 想象一下你的游戏服务器正在经历玩家高峰期,每秒产生数百条日志记录。几天后,你发现磁盘空间告急,服务响应变慢,甚至因为日志文件过大导致写入失败。这

gitblog_01094的博客 369
上一篇: 近年GDC服务器分享合集(三): 《Sky光·遇》实现百万在线:一种云原生的扩容方法
下一篇: 一文弄懂游戏服务器的云原生化
长三月
博客等级 码龄9年 228粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值