当前位置:首页 > 科技  > 软件

转转游戏MQ重构:思考与心得之旅

来源: 责编: 时间:2024-06-27 07:54:40 73观看
导读1 背景游戏业务自 2017 年启航,至今已近乎走过七个春秋,历经漫长岁月的发展,不知不觉间背负起沉重的历史包袱。犹如一棵大树,既有繁茂精壮的枝桠,亦有诸多枯败凋零的枝叶。此文主要聚焦于商品更新 MQ 消费这一细微模块,详述

1 背景

游戏业务自 2017 年启航,至今已近乎走过七个春秋,历经漫长岁月的发展,不知不觉间背负起沉重的历史包袱。犹如一棵大树,既有繁茂精壮的枝桠,亦有诸多枯败凋零的枝叶。此文主要聚焦于商品更新 MQ 消费这一细微模块,详述游戏业务如何对原有代码予以重构,令游戏这棵大树重焕蓬勃生机。Iin28资讯网——每日最新资讯28at.com

1.1 起始之由

一日,骤然收到线上对下游接口 RPC 调用限流之警报,限流警报阈值为600k/min。遂着手排查触发限流警报之因由。追根溯源,发觉乃外部存有更新操作,而更新接口调用阈值大约3K/min。明明更新流量不高,缘何触发限流?于是开启了对系统的调研与排查。Iin28资讯网——每日最新资讯28at.com

1.2 重构前现状

经过对限流原因的初步探索,我们进一步对商品消费 MQ 进行了全面梳理,发现游戏已有19个订阅商品更新 MQ 的 Consumer,分布在不同集群。这些 Consumer 各自存有内部的查询与更新相关操作,因其部分更新操作会催生新的 Message,致使接口调用进一步扩增。Iin28资讯网——每日最新资讯28at.com

调研还发现有的废弃 Consumer 还在线上持续消费,有的相同的消费逻辑被多个 Consumer 在消费。Iin28资讯网——每日最新资讯28at.com

针对上面问题简单梳理总结,问题如下:Iin28资讯网——每日最新资讯28at.com

图片图片Iin28资讯网——每日最新资讯28at.com

a. 逻辑分散,可维护性差Iin28资讯网——每日最新资讯28at.com

b. 服务调用量成倍放大Iin28资讯网——每日最新资讯28at.com

c. 存在并发更新和覆盖的情况Iin28资讯网——每日最新资讯28at.com

d. 存在废弃或者重复消费情况Iin28资讯网——每日最新资讯28at.com

1.3 问题分析

为什么会形成这样的现状?Iin28资讯网——每日最新资讯28at.com

作者认为:前期需求快速迭代,新增新的 Consumer 可迅速响应需求,且开发便捷。然而,伴随需求的演变与迭代,新增的 Consumer 渐多,需求与人员的变更,使得系统全貌愈发难以全面掌控。不断变更的逻辑,致使整个系统的维护愈发艰难,从而衍生出形形色色的问题。Iin28资讯网——每日最新资讯28at.com

若要降低 MQ 相关接口调用量,有两个核心要点:其一,减少查询,实现数据复用;其二,减少更新接口调用,抑制新的 Message 产生。但当下系统已然如此分散,于现有结构上极难获取出色的解决方案。欲改变当前此种状况,需要全新的结构,对原有 MQ 消费逻辑进行重构。借由新的结构,不但能够化解当下的问题,还能够构建新的约束,引导未来新的功能撰写方式,使整个系统更为健康稳定。Iin28资讯网——每日最新资讯28at.com

2 重构

2.1 目标

在着手重构之前,最为关键的是明晰目标。目标能够辅助我们拟定方案,明确范围,指引项目落地而不偏离正轨。Iin28资讯网——每日最新资讯28at.com

a. 合理的结构Iin28资讯网——每日最新资讯28at.com

b. 优化重复无效消费逻辑Iin28资讯网——每日最新资讯28at.com

c. 提高消费能力Iin28资讯网——每日最新资讯28at.com

d. 逻辑优化Iin28资讯网——每日最新资讯28at.com

e. 构建新体系Iin28资讯网——每日最新资讯28at.com

期望通过合理的代码架构,令消费商品 MQ 消息的逻辑高度内聚且低耦合、各个类及方法的职责清晰明确。重构并非对老系统的简单复制,更肩负着为系统未来扩展定义新的约束规范。恰似于这棵游戏大树中萌生出新的枝干与分支,决定着后续细枝的生长方向。Iin28资讯网——每日最新资讯28at.com

除了架构合理,还需优化解决此前的重复和无效消费的情况,提升整体消费能力,解决原先接口调用放大的问题。此外,在调研中发现系统存在一些已下线的废弃逻辑和部分有问题的代码,趁此次重构之机予以优化。(注:通常不建议在重构中修改逻辑,对于修改逻辑务必要进行充分测试,否则可能引入新的系统 Bug)Iin28资讯网——每日最新资讯28at.com

2.2 制定方案

重构的总体方案主要由三部分构成:架构设计、实施计划、测试计划。Iin28资讯网——每日最新资讯28at.com

2.2.1 架构设计

图片图片Iin28资讯网——每日最新资讯28at.com

总体架构主要运用享元设计模式和策略设计模式,整个架构自上而下由三部分组成。Iin28资讯网——每日最新资讯28at.com

a. 数据预处理Iin28资讯网——每日最新资讯28at.com

b. 按分类调用Handler进行消费Iin28资讯网——每日最新资讯28at.com

c. 收拢调用更新接口Iin28资讯网——每日最新资讯28at.com

a:数据预处理主要负责过滤和预查询数据。包含批量消费 MQ 消息,滤除非游戏的消息,调用批查询接口,预处理后续可能重复处理的逻辑,减少重复查询,提升接口效率。Iin28资讯网——每日最新资讯28at.com

b:主要是按分类抽取 Handler 和公共 Handler,以使职责清晰分明。抽取公共 Handler 以处理一些公共逻辑,例如记录埋点日志等。各个分类的 Handler 仅处理本分类的业务逻辑,实现逻辑解耦,提升可维护性。为方便切面的使用以及增强相关功能的内聚性,在 Handler 之下额外抽取了一层 Manage 层。Manage 层主要负责实现具体的消费逻辑,并提供可复用组件,令逻辑更具内聚性。Iin28资讯网——每日最新资讯28at.com

c:对中台商品相关的更新逻辑予以收拢,其主要目的在于减少更新接口的调用。(由于这些更新会产生新的 Message,故而通过调用批量接口的方式,来降低更新接口的调用次数,进而有效解决接口调用频率放大的问题)Iin28资讯网——每日最新资讯28at.com

2.2.2 实施计划

我们将整个重构划分为以下三期来实现。Iin28资讯网——每日最新资讯28at.com

图片图片Iin28资讯网——每日最新资讯28at.com

第一期和第二期Iin28资讯网——每日最新资讯28at.com

第一期:主要针对非核心业务 MQ 逻辑进行迁移重构。非核心业务灰度上线,控制影响范围,迅速验证架构的可行性与稳定性。Iin28资讯网——每日最新资讯28at.com

第二期:核心业务相关 MQ 迁移重构。灰度上线,关注对核心业务的影响。完成此步基本完成全部业务逻辑迁移。Iin28资讯网——每日最新资讯28at.com

第三期第三期Iin28资讯网——每日最新资讯28at.com

第三期:对结构进行微调,主要是对相关功能进一步拆解、重构,使功能内部更为内聚,降低耦合,令整个系统最终达成设计之初的预期效果。Iin28资讯网——每日最新资讯28at.com

分多步进行重构的益处主要在于控制影响范围,能够迅速见到成效。每次改动范围有限,更易于定位问题,也能够极为便利地支持产品需求。Iin28资讯网——每日最新资讯28at.com

2.2.3 测试计划

每次上线之前,核心主要通过三种测试,即白盒测试、黑盒测试、日志对比。Iin28资讯网——每日最新资讯28at.com

a:黑盒测试,校验新老流程处理后的数据是否一致。Iin28资讯网——每日最新资讯28at.com

b:白盒测试。测试每一行代码的覆盖率,并观察新老流程数据是否一致。Iin28资讯网——每日最新资讯28at.com

c:调用接口前数据对比。在调用更新接口之处打印日志,对比新老流程调用更新接口的传参是否一致。Iin28资讯网——每日最新资讯28at.com

测试仅是一方面,上线后皆需关注整个系统的运行状况,并做好关键方面的报警。此外,会同步一线客服人员,收集是否存在用户反馈的问题,依照原来Consumer的颗粒度进行灰度。Iin28资讯网——每日最新资讯28at.com

2.3 部分细节设计

统一幂等灰度切面处理

此系统乃是一个与 MQ 消费相关的重构项目,在每个消费模块皆需确保消费的幂等性,然而迁移而来的 Consumer 众多,若在每个地方皆书写一遍幂等相关处理,极为不便。我主要借助了 Spring 的 AOP 能力来达成。Iin28资讯网——每日最新资讯28at.com

图片图片Iin28资讯网——每日最新资讯28at.com

主要是定义规范,定义幂等注解、统一返回值(泛型)以及撰写注解处理类。通过环绕注解来实现,处理类在处理之前会进行规范检测,不规范则直接放过(相当于使用注解失效),消费成功后我们会将返回结果通过缓存存储起来,下次再来时,直接消费成功,无需重复处理,达成处理幂等性和减少重复消费的情况。幂等缓存的颗粒度为msgId。(灰度控制方案原理相同,此处不再赘述)Iin28资讯网——每日最新资讯28at.com

异常失败应对

图片图片Iin28资讯网——每日最新资讯28at.com

我们在设计下游商品更新时进行了收拢处理,以方便操作,但也带来一个问题,即可能我们的业务信息已更新,而下游可能处理失败,对此我们使用转转封装的基于 RocketMQ 的消费重试组件来实现。(简单来讲,同步消费失败,就会利用 RocketMQ,创建一个MQ消费信息来异步处理)。未更新成功的数据,通过 MQ 重试来保障消费成功。Iin28资讯网——每日最新资讯28at.com

更新失败报警更新失败报警Iin28资讯网——每日最新资讯28at.com

我们还设有报警机制,未更新商品的信息,通过企业微信发送报警,以提示技术人员,并提供商品数据信息,方便在出现特殊异常情况时,人工兜底补足来处理此类情形。Iin28资讯网——每日最新资讯28at.com

数据隔离

新的Consumer在消费时提供了单独的线程池处理,便于监控逻辑处理消费情况,提升整体逻辑处理能力的并发度。Iin28资讯网——每日最新资讯28at.com

线程池监控线程池监控Iin28资讯网——每日最新资讯28at.com

数据监控

建立丰富的监控指标和报警通知机制。通过日志查询平台、数据看板、异常企业微信报警通知,辅助我们在上线后实时观察新流程的具体状况,迅速定位问题。Iin28资讯网——每日最新资讯28at.com

MQ生成消费监控MQ生成消费监控Iin28资讯网——每日最新资讯28at.com

上游查询失败报警上游查询失败报警Iin28资讯网——每日最新资讯28at.com

3 总结

数据效果

项目上线后,下游核心接口的调用量显著降低,降幅 50%至80% 之间。其中,更新类接口的调用量降低了 80%,查询类接口的调用量减少了 50%。Iin28资讯网——每日最新资讯28at.com

思考与总结

  1. 明确系统重构的缘由,主要涵盖两方面。(现有系统存在问题需解决,或者现有系统限制了新的业务发展)
  2. 务必要充分了解自身的系统。在重构之前,对于具体的业务逻辑和影响范围等信息需进行直接评估与确定。唯有明晰系统的原貌,方能依据系统的现状设计全新的技术方案。
  3. 考虑未来发展,定义好的规范。好的规范和结构,在未来系统迭代发展起一个引导作用。引导大家按相同的思路开发,更好的协作和支持业务需求。

关于作者Iin28资讯网——每日最新资讯28at.com

许志芳,转转订单业务后端研发工程师Iin28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-96749-0.html转转游戏MQ重构:思考与心得之旅

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 如何解决“Future不能安全地在线程之间发送”的问题?

下一篇: OpenAI宣布断服,警惕血本无归

标签:
  • 热门焦点
  • 一加Ace2 Pro官宣:普及16G内存 引领24G

    一加Ace2 Pro官宣:普及16G内存 引领24G

    一加官方今天继续为本月发布的新机一加Ace2 Pro带来预热,公布了内存方面的信息。“淘汰 8GB ,12GB 起步,16GB 普及,24GB 引领,还有呢?#一加Ace2Pro#,2023 年 8 月,敬请期待。”同时
  • Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    Redmi Buds 4开箱简评:才199还有降噪 可以无脑入

    在上个月举办的Redmi Note11T Pro系列新机发布会上,除了两款手机新品之外,Redmi还带来了两款TWS真无线蓝牙耳机产品,Redmi Buds 4和Redmi Buds 4 Pro,此前我们在Redmi Note11T
  • 5月iOS设备好评榜:iPhone 14仅排第43?

    5月iOS设备好评榜:iPhone 14仅排第43?

    来到新的一月,安兔兔的各个榜单又重新汇总了数据,像安卓阵营的榜单都有着比较大的变动,不过iOS由于设备的更新换代并没有那么快,所以相对来说变化并不大,特别是iOS好评榜,老款设
  • 多线程开发带来的问题与解决方法

    多线程开发带来的问题与解决方法

    使用多线程主要会带来以下几个问题:(一)线程安全问题  线程安全问题指的是在某一线程从开始访问到结束访问某一数据期间,该数据被其他的线程所修改,那么对于当前线程而言,该线程
  • 从零到英雄:高并发与性能优化的神奇之旅

    从零到英雄:高并发与性能优化的神奇之旅

    作者 | 波哥审校 | 重楼作为公司的架构师或者程序员,你是否曾经为公司的系统在面对高并发和性能瓶颈时感到手足无措或者焦头烂额呢?笔者在出道那会为此是吃尽了苦头的,不过也得
  • Python异步IO编程的进程/线程通信实现

    Python异步IO编程的进程/线程通信实现

    这篇文章再讲3种方式,同时讲4中进程间通信的方式一、 Python 中线程间通信的实现方式共享变量共享变量是多个线程可以共同访问的变量。在Python中,可以使用threading模块中的L
  • 大厂卷向扁平化

    大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 阿里瓴羊One推出背后,零售企业迎数字化新解

    阿里瓴羊One推出背后,零售企业迎数字化新解

    作者:刘旷近年来随着数字经济的高速发展,各式各样的SaaS应用服务更是层出不穷,但本质上SaaS大多局限于单一业务流层面,对用户核心关切的增长问题等则没有提供更好的解法。在Saa
  • 三翼鸟智能家居亮相电博会,让用户体验更真实

    三翼鸟智能家居亮相电博会,让用户体验更真实

    2021电博会在青岛国际会展中心开幕中,三翼鸟直接把“家”搬到了现场,成为了展会的一大看点。这也是三翼鸟继9月9日发布了行业首个一站式定制智慧家平台后的
Top