(报告出品方/作者:兴业证券,石康,李博彦,董昕瑞)
1、罗尔斯·罗伊斯公司:全球航空发动机龙头,百年锤炼成就全球航空发动机龙头
1.1、公司概况:技术创新引领行业发展,挫折中涅槃重生
罗尔斯·罗伊斯公司是英国乃至全球最大的航空发动机制造商之一,业务涵盖民用 及军用航空、动力系统、核能等领域,据公司官网,公司客户遍布全球 120 个国 家,包括 380 多家航空公司及租赁客户、160 家防务客户、4000 家商用船舶客户、 70 家海军客户,以及超过 5000 家动力和核能客户。
航空发动机龙头地诞生:公司历史最早可以追溯到 1906 年由亨利·莱斯(Henry Royce)和查尔斯·劳斯(Charles Rolls)共同创立罗尔斯·罗伊斯公司(Rolls-Royce Company),主要业务为汽车生产。1914 年,随着第一次世界大战的爆发,为满足 英国对于飞机发动机的需求,罗尔斯·罗伊斯公司开始涉足航空发动机业务,并 在一战期间为协约国提供了近一半的航空动力。20 年代后期,航空发动机已成为 罗尔斯·罗伊斯公司最核心的业务,1940 年罗尔斯·罗伊斯公司具有传奇色彩的默 林发动机(Merlin)为英国飓风战斗机(Hawker Hurricane)、喷火战斗机 (Supermarine Spitfire)提供动力,第二次世界大战中对于默林发动机的大量需求 使得罗尔斯·罗伊斯公司从一家小型公司迅速成长为全球最重要的航空发动机制 造商之一。
技术创新引领行业发展,危机中重获新生:1944 年,公司制造出英国第一台喷气 式发动机韦兰(Welland)并装配格洛斯特流星战斗机(Gloster Meteor);1953 年, 公司正式进入民航领域并推出达特(Dart)涡轮螺旋桨发动机,为涡轮发动机成为 全球航空业主流动力方案奠定基础。随着 60 年代宽体客机的出现,罗尔斯·罗伊 斯公司被洛克希德公司 L-1011 三星民航客机(TriStar)选中为发动机供应商,并 着手于 RB211 涡扇发动机的研制。RB211 涡扇发动机创新性采用了大功率高涵道 比设计以及脱胎于 RB203 发动机的三转子设计,但高昂的研发费用成为拖垮公司 的诱因。
RB211 发动机的研发成本高 达 1.7 亿欧元,接近原先预算的两倍,发动机的平均制造成本则超过 23 万英镑。 1971 年 1 月,罗尔斯·罗伊斯公司面临破产危机,鉴于公司对于国家具有重大战略 意义,英国政府将公司收归国有,罗尔斯·罗伊斯有限公司(Rolls-Royce Ltd)重 组成立,从而使得 RB211 发动机的研发得以继续。1973 年,罗尔斯·罗伊斯公司 拆分汽车业务(即劳斯莱斯汽车)为独立主体。
核心产品体系成型,挤身波音主供应商名列:1972 年,Kenneth Keith 担负起拯救 公司的重任,出任公司董事会主席,并邀请曾研制出韦兰喷气式发动机的工程师 Stanley Hooker 担任公司技术主管,以解决 RB211 发动机的研发问题。1978 年美 国东方航空和英国航空开始采购搭载 RB211-535 发动机的波音 757 客机,罗尔 斯·罗伊斯公司首次进入波音的供应链体系。1987年,公司重新被私有化。1988年, 公司 RB211-535E4 发动机以高可靠性和低噪音的优势击败普惠公司,为美国航空公司订购的 50 架波音 757 客机提供动力,成为拯救公司的关键订单,至此罗尔 斯·罗伊斯公司取得了波音 757 型号的发动机主供应商地位。
兼并收购实现业务快速扩张:公司通过多次兼并收购增强竞争实力。1966 年公司 收购英国布里斯托航空发动机公司(Bristol Siddeley),布里斯托航空发动机公司 由原布里斯托尔飞机公司旗下的航空发动机子公司——布里斯托尔航空发动机有 限公司(Bristol Aero-Engines Limited)与阿姆斯特朗·西德利(Armstrong Siddeley) 合并而成。布里斯托航空发动机公司曾设计协和式客机上的奥林匹斯 593 发动机 (Olympus-593),通过收购布里斯托航空发动机公司,罗尔斯·罗伊斯公司在军用 及民用航空发动机的设计制造能力得到大幅提升。1990 年,罗尔斯·罗伊斯公司与 宝马合资成立航空发动机公司,生产 BR700 系列涡扇发动机用于支线飞机以及商 务飞机,合资公司于 2000 年被罗尔斯·罗伊斯公司全资控股并更名为“罗罗德国公 司”(Rolls-Royce Deutschland)。
1995 年,罗尔斯·罗伊斯公司成功收购主营业务为 燃气轮机、航空、工业、航海用发动机组件制造的艾利逊发动机公司(Allison Engine),罗尔斯·罗伊斯公司的民用发动机实力得到扩充。1999 年,罗尔斯·罗伊 斯公司相继收购库珀能源服务公司(Cooper Energy Services)的旋转压缩设备业 务,收购 National Airmotive 公司且将其并入发动机维修业务,以及斥资 5.76 亿欧 元收购 Vickers 公司以提升海上动力系统服务能力。2016 年,罗尔斯·罗伊斯公司 斥资 7.2 亿欧元收购西班牙飞机发动机商 de Turbo Propulsores(ITP)53.1%股权。
产品迭代升级与海外业务拓展:进入 21 世纪,海外市场拓展和产品迭代升级成为 罗尔斯·罗伊斯公司的重点发展方向。2005 年,公司在上海南汇(现归属浦东新区) 建立 6000 平米船舶设备制造厂。2006 年,遄达(Trent)1000 发动机搭载波音 787 客机首飞,同时公司着手于遄达 XWB 发动机的设计研发,2010 年搭载遄达 XWB 的空客 A350 进行首飞,该型号发动机获得近 1150 台订单,成为遄达发动机系列 中最成功的型号之一。2012 年,罗尔斯·罗伊斯公司的短距起飞和垂直降落系统 (STOVL)为 F-35B 的垂直起降提供解决方案。2021 年,公司将零碳排放作为重 点战略目标,并发布了全球航速最快的全电动飞机“Spirit of Innovation”。
1.2、股权结构:机构持股为主,股权集中度较低
公司股权结构高度机构化,股权集中度较低。根据公司 2021 年报披露,机构投 资者持股比例为 78.99%,前五大股东分别为美国考斯韦资产管理有限公司 (Causeway Capital Management LLC)、贝莱德集团(BlackRock Inc.)、麻省金融 服务公司(Massachusetts Financial Services Company)、美国先锋集团(Vanguard Group Inc.)和美国普信集团(T. Rowe Price Group Inc.),合计持股比例为 29.93%, 公司无实际控制人。
1.3、主营业务:以航空发动机核心,围绕能源系统开拓业务边界
公司主营业务分别四大板块,分别为民用航空(Civil Aerospace)、国防业务 (Defense)、能源系统(Power Systems)、新市场业务(New Markets),以及其他 非核心业务,2021 年收入占比分别为 40.44%、30.02%、24.51%、0.02%和 2.70% (受内部核销影响收入占比总和小于 100%)。2018 年和 2021 年公司对于主营业 务统计口径做了较大调整,其中 2018 年公司将主营航海动力系统的全资子公司 L’Orange 出售,同年 7 月公司出售旗下商用航海业务,导致公司航海业务无需作 为主营业务独立披露,同时公司将核能业务并入能源系统板块;2021 年,公司与 贝恩资本签订最终协议,出售全资子公司 ITP Aero 全部股权,ITP Aero 不作为可 持续经营的业务板块披露业绩;为配合公司碳中和战略目标,小型核反应堆和电 气业务合并作为新市场独立业务板块。
分区域来看,美国和欧洲是公司最大市场。2021 年美国收入占比 44.26%,欧洲收 入占比 20.14%,亚洲地区(除中国)收入占比 10.93%。公司持续加大对于中国市 场的重视程度,2021 年起将中国的营收数据独立于亚洲进行披露,2021 年中国收 入占比 9.09%,成为仅次于美国和英国的第三大市场(国家口径)。
1.3.1、民用航空
公司民用航空业务主要包括大型宽体客机、窄体(支线)客机、商务飞机、民用 直升机的发动机研发制造及维护服务。2021 年公司民营航空业务收入为 45.36 亿 英镑,同比下滑 11%,业务收入增速相较 2020 年跌幅有所收窄,但民航业务仍受 到全球新冠疫情影响持续低迷,根据行业预测,2024 年全球民航乘客有望恢复到 2019 年水平。从细分市场来看,2021 年,公司大型客机发动机和商务飞机业务收 入分别同比小幅下滑 1%和 2%,支线客机收入同比增长 7%,V2500 发动机由于 现役装备机型数量持续减少,其收入贡献同比大幅下滑 77%;从业务模式来看, 由于宽体客机订单需求仍处于低位,发动机设备销售收入为 16 亿英镑,同比下降 29%,而维护服务收入在长期订单的拉动下收入为 29 亿英镑,同比增长 5%。
公司民用宽体客机航空发动机的核心产品为遄达涡扇发动机系列,该系列沿用了 RB211 的三转子结构,主要型号包括遄达 7000/XWB/1000/900/500/700/800,下游 适配机型包括波音 747、767、777、787,以及空客 A330、A340、A350、A380A330neo 等系列。
因疫情后民航飞机市场需求持续低迷,公司遄达系列发动机交付量自 2020 年以 来大幅下滑。根据公司公告数据披露,2020 年和 2021 年公司遄达系列发动机交 付量分别为 264 台和 195 台,相较 2019 年分别下滑 48.24%和 61.76%。从发动机 型号来看,疫情带来的宽体客机需求下滑加速了遄达 700、遄达 900、遄达 1000 等老款型号的替代,公司针对空客 A350 系列和 A330neo 开发的遄达 WXB 和遄 达 7000 作为升级款型号,在油耗、静音性能等方面大幅提升,已成为公司宽体客 机发动机的主力型号,2021 年公司遄达 XWB-84、遄达 7000 交付量分别为 120 台 和 31 台,同比增长 10.09%和 40.91%。
公司支线/窄体客机主要产品包括 AE3007、BR715、RB211-535E4、Tay620/650 四 款型号,下游适配机型包括 ERJ145/140/135、波音 717、波音 757-200/300 和福克 70/100 等型号。
公司作为全球领先的商务机发动机供应商,如今为全球超过 3300 架商务机提供产 品及服务,主要产品型号包括 Pearl 系列 Pearl 15、Pearl700、Pearl 10X,以及 AE3007、 BR710、BR725、Tay 611-8C 等型号,下游适配机型包括湾流 G350、G450、G500、 G550、G700,庞巴迪 5000、5500、6000、6500,巴航莱格赛 600/650,塞斯纳 X/X+, 达索猎鹰等机型。其中 Pearl 10X 为公司 2021 年专门为达索公司“猎鹰”系列公 务机研发的升级版发动机,采用公务航空领域最高效的 Advance2 核心机,拥有超 过 8.2 吨力的推力,同时具有更高的能耗效率以及低噪音、低排放等优点。据中 国航空报,Pearl 系列发动机是罗尔斯·罗伊斯公司智能发动机愿景的一部分,主要 技术包括引进先进振动检测的新一代发动机健康监测系统,先进的发动机远程诊 断技术,允许从地面远程重新配置发动机监测功能的双向通信。
2021 年公司小型民用(商务)发动机交付量为 114 台,同比下滑 38.04%,其中 BR700、AE3007 两款型号无新增交付,Pearl 系列市场认可度较高但受疫情影响 需求处于低位,随着全球民航市场的复苏以及 Pearl 10X 的陆续放量,公司小型民 用发动机的交付量有望迎来反转。公司直升机发动机主要包括 M250 Turboshaft 涡轴发动机、RR300 涡轴/涡浆发动 机、M250 Turboprop 涡浆发动机三款型号。根据公司官网披露,M250 Turboshaft 涡轴发动机已生产超过 31000 台,飞行总时长超过 2.2 亿小时。
1.3.2、国防业务
公司国防业务主要包括战斗机、军用直升机、军用运输机、加油机、巡逻机、军 用无人机等航空器发动机,以及军用舰船燃气轮机、潜水艇核动力装置、军用移动电源等产品及服务。2021 年,公司国防业务收入为 33.68 亿英镑,同比基本持 平,储备订单金额为 65 亿英镑,同比下滑 13.33%。分业务模式来看,2021 年设 备销售收入 14.11 亿英镑,同比小幅下滑 1.19%,服务收入 19.57 亿英镑,同比增 长 1.56%。从市场结构来看,近四年运输机、战斗机、军舰、潜水艇占比保持稳 定,2021 年收入占比分别为 32%、24%、11%和 19%。
公司是全球最大的军用航空器发动机供应商之一,根据官网数据显示,公司为全 球 103 个国家的 160 多位客户提供了超过 16000 台军用飞机发动机,曾研发制造 了包括斯贝(Spey)、RB199、阿杜尔(Adour)、EJ200 等领军行业的军用发动机 型号。根据公司 2021 年 9 月公告显示,公司 F130 发动机将替换普惠公司 TF33- PW-103 发动机,为美国空军 B-52H 轰炸机提供动力,订单总额超过 26 亿美元, 罗尔斯·罗伊斯公司与美国空军就 B-52H 轰炸机的供应关系预计至少将持续到 2050 年。
公司军用直升机产品主要型号包括 AE 1107C 用于 V-22 鱼鹰直升机,CTS800 用于意大利阿古斯塔·韦斯特兰公司的“超山猫”直升机,MTR390 用于欧直 EC-665 虎式直升机,M250 Turboshaft 用于贝尔公司的轻型侦察直升机,以及 Gem、Gnome 发动机分别用于服役时间均超过 30 年的山猫和海王直升机。
军用特种机领域,公司核心发动机型号包括 AE2100 涡浆发动机、AE 1007C 涡轴 发动机、AE3007 涡扇发动机,以及研制时间较早的 BR710、T56、Tay 等型号, 适配机型涵盖军用运输机、加油机、巡逻机及其他战术机型。其中 TP400-D6 是罗 尔斯·罗伊斯公司联合法国赛峰集团、MTU、ITP 针对欧洲 A400M 军用运输机共 同研发的三转子涡桨发动机,适用于恶劣的战场环境。
公司无人机发动机类型涵盖涡扇和涡轴,其中 AE 3007 可为 RQ-4A 全球鹰、Triton 海卫一无人机提供动力系统,Adour 作为双转子反向旋转涡扇发动机,其改进型 号 Adour Mk 951 采用全权限数字式发动机控制系统(FADEC)尝试创新技术突 破。除军用航空发动机外,公司同时能够为海军船舰、潜水艇以及陆路部队提供动力 解决方案,产品包括 MT30、MT7 船舰燃气轮机、AG9160、AG9140 发电机组、 螺旋桨驱动器、舰用装卸系统、电力与自动化控制系统、陆军电力管理/转换/发电 系统等。
1.3.3、能源系统
公司能源业务主要依托旗下 MTU 品牌,为商用海事船舰、游艇提供供电系统及 能源解决方案,同时公司能够针对数据中心、机场、酒店、工厂等与应用场景, 提供包括柴油发电机组和燃气热电联供系统等发电解决方案。除此之外,公司为 工业、矿业、轨道交通、国防海事等多个下游行业提供柴油以及燃气发动机产品。 2021 年,公司能源系统收入 27.49 亿英镑,同比基本持平,营业利润 2.42 亿英镑, 同比增长 28.72%。分行业来看,2021 年海事、工业、发电、国防及其他业务的收 入占比分别为 33%、25%、33%和 9%,近年来海事业务收入占比有所提升,整体 业务结构较为稳定。
1.3.4、新市场业务
公司新市场业务主要包括小型核反应堆(SMR)和电气业务(Electrical),2021 年 公司新市场业务营业收入仅为 200 万英镑,营业利润为-7000 万英镑,业务仍处于 早期发展阶段。为满足联合国 2050 年碳中和目标,公司计划 2030 年实现新产品 的“零碳排”,核能和电能作为公司战略性方向 2021 年被单独划分为新市场业务 板块,研发投入 6800 万英镑,占总研发投入的 8.74%,其中 1600 万英镑用于使 小型核反应堆通过英国的 GDA(核能项目安全性)认证,5200 万英镑用于电力驱 动系统的研发。
1.4、财务分析:营业收入受疫情拖累,利润率大幅波动
公司整体收入规模受疫情影响较大,近两年同比增速为负。公司 1990-2019 年营 业收入从 36.70 亿英镑增长至 165.87 亿英镑,年化复合增速为 5.34%,创下近 30 年营收大幅增长的奇迹。2020 年,受到全球疫情影响,公司民用航空业务收入同 比大幅下滑 37.23%,2021 年全球民航飞机需求持续低迷,公司民用航空业务营业收入同比持续小幅下滑。
非经性损益对于公司利润影响较大。公司 1990 年营业利润、息税前净利润和净利 润分别为 2.31 亿英镑、1.76 亿英镑和 1.34 亿英镑,对比 2017 年公司利润高点时 营业利润、息税前净利润和净利润分别为 12.61 亿英镑、48.97 亿英镑和 42.07 亿 英镑,公司 1990-2017 营业利润、息税前净利润和净利润的年化复合增速分别为 6.49%、13.11%和 13.62%;2017 年公司 26.11 亿英镑的外汇合约收益对于利润影 响较大,如剔除外汇收益影响,公司 2017 年净利润为 15.96 亿英镑,1990-2017 年 化复合增速为 9.61%。
2000-2021 年,公司累计营业利润、息税前净利润和净利润分别为 120.76 亿英镑、 43.32 亿英镑和 19.95 亿英镑,累计营业利润率(区间各年度累计营业利润/累计营 业收入,下同)、息税前净利润率和净利率分别为 5.16%、1.85%和 0.85%。如剔除 疫情影响,2000-2019 年公司累计营业利润率、息税前净利润率和净利率分别为 5.73%、3.57%和 2.39%。
新型号占比大幅提升,公司利润率波动较大。2016 年,公司毛利率与营业利润率 出现明显下滑,而净利润则转为亏损,其主要原因为公司成熟型号遄达 700 发动 机新交付数量从 2015 年的 140 台下降至 88 台,占比从 45.45%下降至 24.65%, 而新型号遄达 XWB-84 的交付数量占比从 18.18%上升至 32.77%,新型号运行初 期故障率相较成熟型号更高,所需返厂维修等费用对于利润造成拖累。除此之外, 罗尔斯·罗伊斯公司因巴西行贿事件支付 6.71 亿英镑与英国、美国和巴西司法机 构达成和解,以及因为英国脱欧英镑兑美元大幅贬值而导致汇兑损失。2018 年, 公司遄达 1000 发动机多次出现叶片腐蚀断裂故障,直接导致搭载该发动机型号波 音 787 客机出现大面积停飞,公司因遄达 1000 发动机的故障问题赔付客户损失 7.9 亿英镑。2019 年公司花费 14 亿英镑费用,用于遄达 1000 发动机叶片的修复 工作。
1990-2021 年公司共出现七次净利润为负的情况,分别为 1992、1996、2008、2016、 2018-2020 年,其中 1992 年和 2008 年均由于全球性金融危机导致的民航市场需 求下降,公司民航业务造成亏损;2016、2018 和 2019 年公司净利润受非经性损 益以及发动机故障维修赔付影响较大。公司 2020 年后,受到全球疫情影响,公司 下游民用航空需求持续低迷,航空运营商对于资本开支态度谨慎,同时疫情封控 带来的飞机停运使得公司失去大量服务业务收入,公司净利润率再次创下近十年 新低。2021 年,随着全球民航业务逐步复苏,以及新型号走出磨合期,公司利润 率水平大幅回升,毛利率、营业利润率和净利率分别为 19.04%、4.15%和 1.07%, 分别同比增长 9.82pct、8.31pct 和 27.88pct。 1990-2021 年,公司毛利率、营业利润率和净利率的中位数分别为 19.19%、5.81% 和 2.31%。
发动机制造作为重资产行业,公司保持极高的资产负债率水平,尤其近十年来公 司资产负债率一路走高,截至 2021 年末公司资产负债率已经高达 116.17%,公司 通过出售资产等方式降低负债风险。2021 年,公司以 17 亿英镑的价格将 ITP Aero 出售给贝恩资本,以求缓解公司资产负债表高负债率问题。军品业务是公司最为主要的业务板块之一,英国和美国军方是公司军品业务的主 要客户,公司营业收入增速受到英美两国军费支出的影响较大。但考虑到民航业 务收入比重要远高于军品业务,2020 年在军品业务维持稳定的情况下,由于民航 业务受疫情影响极大,公司整体收入增速同比出现大幅下滑。相较 2020 年受疫情 重创收入同比大幅下滑的民航业务,公司国防业务收入 2020 年并未受到明显影 响,仍实现同比 3.57%的增长,2021 年公司国防业务收入 33.68 亿英镑,同比持 平。
据公司 2021 年报,公司主要交易货币为英镑、欧元和美元。2011-2021 年,公司 财务费用波动趋势与美元/英镑、欧元/英镑汇率波动趋势相近,汇率波动对公司财 务费用有较大影响。
2、航空发动机产业链专业化程度高,整机制造寡头垄断
2.1、航空发动机产业链专业化程度较高
航空发动机产业被誉为“工业皇冠上的明珠”,其产业链的复杂和专业化程度远远 高于一般的工业制造产业,具有高压、高转速、高温、长期循环往复工作的运行 特点,严苛的工作条件和高可靠性要求决定了航空发动机的研制需要综合工程热 力学、气体动力学、燃烧学、传热学、固体力学、强度振动、材料学、冶金、 加 工制造、试验测试等诸多前沿学科来共同实现。
研发设计:发动机的研发设计主要包括前沿学科的基础研究,发动机系统的设计 和产品开发。 原材料:航空发动机上游原材料主要包括高温合金材料、钛合金材料、复合材料 等,据《先进航空发动机关键制造技术研究》,在新一代航空发动机性能的提高中, 制造技术与材料的贡献率为 50%~70%,在发动机减重方面,制造技术和材料的贡 献率占 70%~80%。 零部件:据航亚科技招股说明书,零部件按毛坯提供方式可以分为锻件、铸件和 钣金件,按结构类型可以分为叶片、盘环件、机匣、轴、齿轮、钣金件等。据《锻 压先进制造技术及在航空工业领域的应用》数据显示,锻件在飞机机体结构和发 动机结构中重量占比分别为 20%~35%和 30%~45%。
分系统:航空发动机分系统主要包括动力控制系统、空气系统、机械系统、短舱 系统,其中动力控制系统是决定发动机能否按照系统指令运转的关键。动力控制 系统主要由传感器、电机、控制器等元器件组成。 整机制造及下游维修:发动机整机制造是产业链中最为关键的一环,难度大壁垒 高,目前仅有英国罗尔斯·罗伊斯,中国航发集团、美国普拉特·惠特尼、美国 通用电气、俄罗斯联合发动机制造公司、法国 Snecma 公司、德国 MTU 公司、意 大利 Avio 公司以及俄罗斯土星、礼炮公司等少数公司具备较完整的航空发动机生 产能力。整机制造企业同样是负责发动机下游维修的主要单位,但由于维修在航 空发动机全产业链中进入壁垒相对较低,包括航空公司以及第三方维修机构在内 均在发动机维修市场占有一定份额。
从航空发动机的机体结构来看,以较为常见的航空涡扇发动机为例,其主要由进 气道、风扇、压气机、燃烧室、涡轮、混合器、外涵道和尾喷管等八部分构成。根据工作温度的不同,发动机分为冷端(进气道、风扇、压气机、外涵道等)和 热端(燃烧室、涡轮、混合器、尾喷管等)。
2.2、航空发动机研发难度大、周期长,新品成熟期前毛利率较低
航空发动机研发难度大、研发成本高、研制周期长。据美国空军研究实验室(Air Force Research Laboratory,AFRL)2002 年发表的研究报告,综合考虑 F100,F404, F414 和 F119 发动机的研发过程,一型发动机研发项目理论上需要 10 年以上,花 费约 15 亿美金研制经费,以及 14 台整机试车用发动机,9 台飞行测试发动机, 试验时数长达 11000 多小时。
航空发动机新型号的研制周期长。根据《航空发动机研制全寿命管理研究及建议》, 航空发动机全寿命可以分为预先研究、工程研制和使用发展三大阶段,其中预先 研究又细分为应用基础研究、应用研究和先期技术开发三个阶段,应用基础研究 和应用研究分别聚焦理论基础和设计、材料、工艺的研究实验;先期技术开发通 常包括核心机、技术验证机的设计和试制,试验周期达到 100~500 个小时。工程 验证机研制阶段对于零部件、系统的性能,以及必要的系统完整性进行验证试验, 通常发动机试验所需时长为 200~1000 个小时。
原型机研制阶段,在工程试验机的 基础上,为全面实现研制要求的各项指标而开展设计、研制、试验、试飞等工作, 其中零部件试验应达到 10 万小时,系统实验应达到 4~5 万小时,整机试验应达到 8000~1 万小时,高空模拟实验应达到 500~2000 小时,设计定型前发动机试飞应达到 2000~5000 小时,发动机小批量领先使用应达到 10 万小时。
航空发动机在研制成功、定型并量产之后,仍需经历较长时间的优化磨合,在此 期间需要通过返厂维修来进行新型发动机的调试,但也给发动机整机制造企业带 来不小的财务压力。以罗尔斯·罗伊斯公司遄达 XWB-84、XWB-97 和 7000 三款 型号为例,其分别于 2015 年、2018 年和 2019 年批产服役。2015-2017 年,随着 遄达 XWB-84 的交付提升,公司毛利率从 23.98%下滑至 19.46%;紧接着 2018 和 2019 年遄达 XWB-97 和遄达 7000 分别进入批量交付期,公司毛利率进一步下滑 至 2019 年的 5.68%,为近十年来最低值。但随着三款新型发动机的成熟,2020 年 后公司毛利率重新进入上行区间,2021 年公司毛利率已经恢复至 19.04%,相较 2019 年提升 13.36pct。
2.3、全球航空发动机市场寡头垄断,公司市占率领先
目前全球仅有少数国家具有独立设计制造航空发动机的能力,代表性厂商有美国 通用电气、美国普拉特·惠特尼、英国罗尔斯·罗伊斯公司、俄罗斯联合发动机制造 公司,以及 CFMI(美国通用电气和法国赛峰各持股 50%)、国际航空发动机公司 (IAE,由美国普拉特·惠特尼、英国罗尔斯·罗伊斯、日本航空发动机、德国 MTU 航空发动机公司合资成立)等。
商用航空发动机市场呈现 CFM 国际、普拉特·惠特尼、罗尔斯·罗伊斯、通用电气四大巨头寡头垄断的竞争格局,根据《Commercial Engine 2022》数据显示,2021 年四家公司交付发动机的市占率分别为 59%、26%、8%和 7%。从 2021 年空客和波音搭载的发动机市场份额来看,CFM 同时为空客和波音的最 大供应商,罗尔斯·罗伊斯公司在空客和波音的份额分别为 13%和 9%,搭载数量 分别为 1543 台和 1174 台。
3、产品研发与商业模式创新双轮驱动公司发展
3.1、三转子发动机核心技术突破构建长期竞争壁垒
据中航工业沈阳发动机设计研究所的《航空发动机研制全寿命管理研究及建议》, 一代新型航空发动机研发周期通常长达 15-20 年,而在成熟核心机上衍生一款新 机需要 3-5 年。世界上经典的航空发动机核心机产品生命周期可以长达 30-40 年, 期间会不断衍生出多达十余种改进型,生命周期显著高于船舶、汽车等其他行业。 公司遄达系列发动机依托于 50 年前 RB211 的技术突破,通过对核心机的迭代升 级打造宽体客机领域霸主地位。以罗尔斯·罗伊斯公司遄达系列发动机为例,20 世 纪 60 年代,在与洛克希德公司的合作中公司创新性的开发三转子涡扇发动机 RB211,尽管研发投入预算失控险些导致公司破产,以至于英国政府不能不对公 司进行国有化,但 RB211 的研制成功为公司遄达系列发动机后续在宽体客机的主 导地位打下了坚实的技术基础。
公司研发费用从 1996 年的 1.99 亿英镑增长至 2021 年的 7.78 亿英镑,1996-2021 年化复合增速为 5.61%;研发费用从 1996 年的 5.10%增长至 2021 年的 6.94%。 2021 年,考虑到资本化研发费用摊销、无形资产资本化以及项目中研发投入(包 含政府资助费用),公司总体研发投入总额高达 11.79 亿英镑。2011-2021 年,公司完成了对于宽体客机以及商务机发动机的完整投入周期,十年 期间遄达 1000/XWB-84/XWB-97/7000、Pearl 15 先后实现交付服役。公司总体研 发投入在 2018 年达到高峰,投入金额达到 14 亿英镑,但 2020 年后受到疫情影 响,公司大幅缩减研发投入力度。
3.2、“发动机”即“服务”,TotalCare服务背后公司商业模式的转变
航空发动机与下游的民机整机企业都具有研发周期长、投入金额大等特点,同属 长周期、资本密集型产业,同时民机整机企业呈现波音与空客双寡头格局,对于 上游发动机供应商具有更强的议价能力,因此商用发动机整机制造商仅通过发动 机整机的销售难以产生超额利润。
为更加灵活的满足下游客户对于发动机采购以及维护需求,1997 年罗尔斯·罗伊 斯公司创新性的推出了 TotalCare 服务,与传统航空发动机定期大修和维护的“工 时+材料”业务模式不同,TotalCare 服务模式将发动机的销售和售后服务整合到全 生命周期合同中,按照客户每台发动机的飞行小时(EFH)收取管理和维修费用, 而当发动机因维修或者其他不可抗因素无法使用时,客户无需支付费用。TotalCare 的推出使得公司从原先发动机销售+付费维修的模式转化为“发动机”即“服务” 的租售结合模式,当发动机运转良好时航空公司从飞行中获得收入并以此向罗尔 斯·罗伊斯公司付费,而当发动机无法正常工作时,航空公司也无需为此而承担风 险,因此极大的优化了 MRO 流程及成本管控,为罗尔斯·罗伊斯公司和客户之间 尽提供了更好的协作机制,提高发动机的使用效率。
自 TotalCare 服务推出后,公司下游客户对于该业务模式给予了积极反馈,超过 90% 的遄达系列客户选择该服务,公司逐步丰富 TotalCare 的业务范围与服务内容。目 前公司 TotalCare 有 3 种主要模式,“全面呵护固定期限”(TotalCare Term)、“全面 呵护无固定期限”(TotalCare Life)和“全面呵护弹性”(TotalCare Flex),三种模式 全面满足客户在发动机不同生命周期时的差异化需求。
新的商业模式下,服务业务替代设备销售成为公司最重要的收入来源,服务业务 收入占比近年来持续提升,2021 年公司整体营业收入中超过 55%来自于各项业务 板块服务收入。2021 年公司民航业务来自于服务的收入占比达到 64%,受到 2020 年疫情的扰动,下游民航运营商对于设备采购的资本开支采取更加谨慎的态度, 因此 TotalCare 方案的性价比更加凸显,根据公司公告资料显示,2020-2022 年客 户中有超过 80 架的 A330 客机选择延长 TotalCare 服务期限。
TotalCare 业务模式取得成功的同时也为公司带来一定的业绩风险,2020-2022 年 在全球疫情的影响下国际航空市场低迷,2020 年 4 月至 6 月,罗尔斯·罗伊斯公司发动机的飞行小时数下降 75%,修理和售后市 场活动减少了 50%-60%,TotalCare 的业务模式在一定程度上放大了黑天鹅事件所 带来的影响。
3.3、全球化产业分工,实现降本增效
航空发动机产业链专业化程度高,包括原材料生产、零部件制造、分系统制造等 核心环节的产能建设前期需要大量的资本投入,因此全球化的协作分工能够最大 程度的提升生产效率,降低各环节成本。
罗尔斯·罗伊斯公司采用类似于“小核心,大协作”的生产模式。根据罗尔斯·罗 伊斯公司 2021 年年报数据显示,公司民航业务中近 75%的零部件来自于外部采 购,外部供应商数量接近 700 家,2021 年公司采购总金额达到 16 亿英镑。据标 准普尔 Capital IQ 数据显示,罗尔斯·罗伊斯公司采取多层级供应链协作模式,其中上游原材料、零部件、电子元器件等制造企业作为二级供应商为一级供应商供 货,再由具备集成制造能力的一级供应商生产结构件及分系统供给罗尔斯·罗伊 斯公司,部分核心系统的集成制造以及发动机的维修由罗尔斯·罗伊斯公司的子 公司直接负责。罗尔斯·罗伊斯公司作为发动机整机制造体系的核心,主要负责 最为关键设计和总装集成。全球化的产业链分工增强了公司对于上游供应商的议 价能力,提升利润率水平。
罗尔斯·罗伊斯公司供应链遍布全球,亚太及北美是其重要供应基地。公司众多核 心供应商来自于海外,例如公司近两年核心一级供应商 Intl Aerospace Mfg Privtae Ltd 位于印度,由罗尔斯·罗伊斯公司和印度斯坦航空(Hindustan Aeronautics Limited)合资成立;Frisa Aerospace 是墨西哥最大的航空工业制造之一,为公司 提供锻件、压气机等产品。罗尔斯·罗伊斯公司通过“优秀供应商(HPSG)”制度从 全球范围选取产品质量及交付稳定性表现最优异的供应商,我国航发集团下属公司航发科技和航发黎明分别荣获罗尔斯·罗伊斯公司 2012 年“年度优秀供应商”和 2017“最佳实践奖”。据中国航空新闻网报道,2020 年罗尔斯·罗伊斯公司全球供 应商大会中,亚洲最佳供应商奖项前三甲均由中国供应商包揽。
近年来,发动机零部件产业正逐步向我国以及包括印度在内的新兴市场国家转移。 在民用航空发动机领域,以航发动力、航发科技、中航重机、航宇科技、航亚科 技、应流股份为代表的国内企业,通过发动机零部件国际化转包的方式参与到全 球航空发动机的产业链中。
4、股价复盘
公司历史股价波动性较大,受疫情影响大幅下滑。复盘 2000 年至今的股价走势, 公司股价受到多种因素影响,期间出现大幅波动。 事件因素: 1)2001 年 9.11 事件后,出于对美国民航业务下滑的担忧,公司 9 月 11 日当天股 价下跌 9%,股价一路走低至10 月 2日的 121英镑,较9 月 10 日累计下跌 38.66%; 2)2005 年 5 月,公司收到中国国航 20 架空客 A330 的遄达 700 发动机订单,总 价值超过 8 亿美元,公告后公司当月股价累计上涨 14.35%;3)2006 年 3 月 24 日,公司公告收购 Optimized Systems and Solutions 公司剩余 50%股权实现全资控股,标的公司是全球领先的航空模拟软件公司,同时可生产 发动机制动器、燃油表、燃油泵等产品。公司公告收购后,30 天内最高涨幅为 10.74%;
4)2016 年 8 月,日本全日航空首次发现部分遄达 1000-C 发动机在寿命期内出现 腐蚀和裂纹,导致多架波音 787 停飞,当月公司股价下跌 7.34%。随着 2016-2018 年包括维珍航空、新西兰航空等多家航司旗下波音 787 遄达 1000 发动机出现类似 问题,2018 年 4 月 EASA 和 FAA 发布安全警报和适航指令,要求减少该型号客 机飞行时间,加大检查次数,公司股价在 2018 年 8 月到达阶段高点后进入漫长的 下跌区间。截至 2022 年 8 月 17 日,公司股价较 2018 年高点已累计下滑超过 90%。
基本面因素:对比公司年度净利润率与股价走势,2003-2007 年公司净利润率逐年 提升,对应股价处于上涨区间;2008 年后受全球金融危机影响,公司利润率大幅 下滑,股价 2008-2009 年进入下行区间。2009 年随着下游需求恢复,公司净利润 率回升,对应股价在 2014 年 1 月创下新高 1294 英镑,相较 2008 年低点累计上涨 约 280%。2018-2020 年,公司陷于遄达 1000 型号故障带来的停飞、反复检修和大 额赔偿,利润始终处于亏损。2020 年,新冠疫情重挫全球民航市场需求,公司净 亏损达到 31.7 亿英镑,股价从 2 月开始大幅跳水,2020 年全年公司股价累计跌幅 达到 83.72%。
对比道琼斯工业指数、标普航空航天和国防精选行业指数以及英国富时 100 指数, 2004-2015 年随着公司营收规模和业绩的高速增长,公司股价显著跑赢英国大盘 以及行业指数;2016-2020 年,公司收入增速放缓,业绩受遄达 1000、遄达 XWB 等新产品型号事故高发所导致的停飞和赔偿,以及支付行贿事件高额和解金等因 素影响,出现较大亏损,公司股价跑输行业指数,但表现仍优于大盘;2020 年后, 公司民航业务受到全球疫情重创,2020-2021 连续两年总收入同比下滑,其中 2020 年利润大幅亏损,公司股价一路下行,跑输同期大盘及行业指数。
公司当前市值(2022.08.22)为 69.10 亿英镑,约合人民币(1 英镑≈8.15 人民币) 563.17 亿元。公司市值自疫情以后大幅缩水,2020 年市值最低点下探至 13.43 亿英镑,当前市值 69.10 亿英镑仅为 2013 年市值高点 243.37 亿英镑的 28.4%。公司市盈率、市净率随净利润、净资产变动,波动幅度较大。截至 2022.08.22,公 司动态市盈率(TTM)为-3.72X,主要系公司 2022 年中报净利润为-15.54 亿英镑 再次转亏所致;市净率(MRQ)为-1.08X,主要系公司 2022 年中报净资产为-62.61 亿英镑,资产负债率超过 120%。 公司营业收入稳定性较高,市销率能够更好体现公司的估值水平。公司当前市销 率(2022.08.22)为 0.58X,对应分位数值为 14.1%,当前市销率水平处于近七年 历史低位。
(本文仅供参考,不代表我们的任何投资建议。如需使用相关信息,请参阅报告原文。)
精选报告来源:【未来智库】
举报/反馈
杜位宅守岁天宝十载。公集有《寄杜位》诗,题下原注:“位京中宅,近西曲江。”位,公之从弟。
守岁阿戎家,椒盘已颂花。盍簪喧枥马,列炬散林鸦。四十明朝过,飞腾暮景斜。谁能更拘束,烂醉是生涯。
上四,守岁之事。下四,岁终有感。赵汸云:椒盘颂花,位宅设宴。喧马、散鸦,言会同者骑从之盛。此诗除夕所赋。后四句,感慨豪纵,读之可想公之为人。
不归天宝十四载冬,禄山陷河北诸郡,公之从弟必死于十五载。至乾元二年,为三年,是春,公在东都作。河间尚战伐,汝骨在空城。从弟人皆有,终身恨不平。数金怜俊迈,总角爱聪明。面上三年土,春风草又生。通首俱是叙事言情,独于结尾写景收题。各两句转意。丧乱之感,死生之戚,生前之念,身后之悲,备尽一诗之中,语意凄切
得舍弟消息二首鹤注:诗云“两京三十口”,又云“烽举新酣战”,当是天宝十五年作。近有平阴信,遥怜舍弟存。侧身千里道,寄食一家村。烽举新酣战,啼垂旧血痕。不知临老日,招得几时魂。初得消息,怜弟而复自伤也。赵汸注:次句,有吾以汝为死矣之意。侧身,言避寇不敢正行。一家村,指平阴荒僻之乡。二句正述所传之信。其二汝懦归无计,吾衰往未期。浪传乌鹊喜,深负鹡鸰诗。生理何颜面,忧端且岁时。两京三十口,虽在命如丝。
叙兄弟远离,而叹资生无计也。弟不能归,空传乌鹊之喜。公不能往,深负鹡鸰之诗。见虽有消息,而彼此悬隔也。十字句。
送从弟亚赴河西判官鹤注:此至德二载夏,在凤翔作。是时京师未复,故云“宗庙尚成灰”。《旧唐书》:杜亚,字次公,自云京兆人。少涉学,善言物理及历代成败事。肃宗在灵武,上书论时政,擢校书郎。其年杜鸿渐节度河西,辟为从事,累授评事御史,终东都留守。南风作秋声,杀气薄炎炽。盛夏鹰隼击,时危异人至。起处感时托兴,时危异人至,乃一篇之主。惟南风先作秋声,故鹰隼当夏而击,此杀气之见于造物者。令弟草中来,苍然请论事。诏书引上殿,奋舌动天意。兵法五十家,尔腹为筐笥。应对如转丸,疏通略文字。经纶皆新语,足以正神器。此言亚之才辩,足动天听,所谓异人也。《杜臆》:略文字而皆新意,知其谈兵非徒读父书者比。胡夏客曰:考亚本传,知此段所言,皆其实录。宗庙尚为灰,君臣俱下泪。崆峒地无轴,清海天轩轾。西极最疮痍,连山暗烽燧。此言世乱倥偬,须人以济,所谓时危也。帝曰大布衣,借卿佐元帅。坐看清流沙,所以子奉使。归当再前席,适远非历试。须存武威郡,为画长久利。此言命亚西行,以救武威,盖时危而用异人也。神京未复,边陲多故,此正英雄见才之时。帝曰数句,述天语丁宁,如古诏诰体。朱注:武威郡,地势西北斜出,隔断羌戎,乃控扼要地。河西有事,则陇右朔方皆扰,是时有九姓商胡之叛,故曰:“须存武威郡,为画长久利。”孤峰石戴驿,快马金缠辔。黄羊饫不羶,芦酒多还醉。踊跃常人情,惨淡苦士志。安边敌何有,反正计始遂。此送别而勉其立功。上四言西土景物,下四言济时筹略。《杜臆》:踊跃惨淡数语,深致规讽之意。綖注:安边,应上佐元帅。反正,应上正神器。吾闻驾鼓车,不合用骐骥。龙吟回其头,夹辅待所致。末以归朝大用望之。《博议》:骐骥驾鼓车,比亚不当为判官。龙马长吟,回首京阙,思成夹辅之功,喻亚虽在河西,乃心不忘朝廷也。綖注:末二句,应上归再前席意。《杜臆》:起结皆用比兴,英矫不凡。起结各四句,中段十句又六句,后二段各八句。卢世曰:送三判官诗,绝有关系,别出机杼。于威弧振敝,制极收京,布嘉惠,借长计,清流沙,存武威,反复谆托,即愤激林丘,论兵远壑,穆然有无穷之思,与寻常赠送迥别。故特表而出之。要三判官,定自可人。于樊曰:“冰雪净聪明,雷霆走精锐。”于亚曰:“奋舌动天意,疏通略文字。”于韦曰:“老气横九州,张目视寇仇。”夫所冀安边反正,舍若人谁属乎?申涵光曰:“疏通略文字”,便是英雄本色,若两脚书厨,济得甚事。
得舍弟消息此当是乾元元年季春作,诗言“春庭暮”可见。风吹紫荆树,色与春庭暮。花落辞故枝,风回返无处。骨肉恩书重,漂泊难相遇。犹有泪成河,经天复东注。对景言情,上比下赋,有古诗遗意。荆花吹落,喻兄弟分张。风回不返,喻漂泊难遇。公在西京,弟在河南,故云泪东注。恩书二字,点题。
月夜忆舍弟鹤注:当是乾元二年秦州作。二弟,一在许,一在齐,皆在河南,故忆之。戍鼓断人行,边秋一雁声。露从今夜白,月是故乡明。有弟皆分散,无家问死生。寄书长不达,况乃未休兵。上四月夜之景,下四忆弟之情。故乡句,对月思家,乃上下关纽。今夜白,又逢白露节候也。故乡明,犹是故乡月色也。公携家至秦,而云无家者,弟兄离散,东都无家也。王彦辅曰:子美善用故事及常语,多颠倒用之,语峻而体健,如“露从今夜白,月是故乡明”之类是也。
忆弟二首(原注:时归在河南陆浑庄。)乾元二年春作。丧乱闻吾弟,饥寒傍济州。人稀书不到,兵在见何由。忆昨狂催走,无时病去忧。即今千种恨,惟共水东流。公至东都而忆弟也。上四,叹乱后分离。下四,伤乱初奔散,辗转相忆,故忧结而成恨。忆昨二句,乃十字句法。谓自昔奔走以来,忧弟而病,无能解去也。洛阳在西,济州在东,故愁恨与水而俱东。其二且喜河南定,不问邺城围。百战今谁在,三年望汝归。故园花自发,春日鸟还飞。断绝人烟久,东西消息稀。葛常之《韵语阳秋》:老杜寄身于干戈骚屑之中,感时对物,则悲伤系之,如“感时花溅泪”是也。故其作诗,多用“自”字。《田父泥饮》云:“步履随春风,村村自花柳。”《遣怀》云:“愁眼看霜露,寒城菊自花。”《忆弟》云:“故园花自发,春日鸟还飞。”《日暮》云:“风月自清夜,江山非故园。”《滕王亭子》云:“古墙犹竹色,虚阁自松声。”《宿白沙驿》云:“万象皆春气,孤槎自客星。”古人对景言情,各有悲喜,而自不能累无情之物也。
得舍弟消息此与前二首盖先后同时之作。乱后谁归得,他乡胜故乡。直为心厄苦,久念与存亡。汝书犹在壁,汝妾已辞房。旧犬知愁恨,垂头傍我床。《杜臆》:他乡乱而故乡尤甚,故曰“他乡胜故乡”,总是苦语。存亡乃厄苦之故,上句因下。辞房即书中之语,下句因上。汝书、汝妾并提,律中带古,此杜公纵笔。
寄杜位(原注:位京中宅近曲江,诗尾有述。)
朱注:位为李林甫婿。天宝十一载十一月,林甫卒。位之贬官,必在十二载。自十二载癸巳至上元二年辛丑,为九年。
近闻宽法离新州,想见怀归尚百忧。逐客虽皆万里去,悲君已是十年流。干戈况复尘随眼,鬓发还应雪满头。玉垒题书心绪乱,何时更得曲江游。
此为杜位移州而作也。离新州,叙事。尚百忧,推心。逐客二句,承新州,言流窜之久。干戈二句,承百忧,言离乱堪伤。末述寄诗之意,犹恐后会难必也。顾注:同是贬窜,于郑虔曰严谴,于杜位曰宽法,以见轻重失宜,此老杜《春秋》之笔。泽州陈冢宰曰:郑初贬官,故用严谴。位离贬所,故用宽法。位从新州移江陵,尚未还家,故云归怀。时有史朝义、段子璋之乱,故曰尘随眼。顾宸曰:是一纸家书,率直摅写,不待致饰。曰近闻、曰想见、曰虽皆、曰已是、曰况复、曰还应、曰何时更得,只此数虚字中,情文历乱,俱写出心乱之故。骨肉真情,溢于言表矣。
舍弟占归草堂检校聊示此诗鹤注:此广德元年冬避乱梓阆时作。陶开虞曰:有四弟,颖、观、丰各在他乡,唯占从公入蜀。久客应吾道,相随独尔来。孰知江路近,频为草堂回。鹅鸭宜长数,柴荆莫浪开。东林竹影薄,腊月更须栽。前四占归草堂,下四嘱其检校也。天下莫容,吾道应作旅人矣。《杜臆》:草堂无人,安得鹅鸭,想有代为看守者。腊月非种竹时,乘弟暂归,故嘱其栽补耳。黄生曰:杜善炼字,竹稀而曰影薄,树多而曰阴杂,皆能涉笔成趣。
送舍弟颖赴齐州三首
鹤曰:此广德二年秋成都作。
岷岭南蛮北,徐关东海西。此行何日到,送汝万行啼。绝域惟高枕,清风独杖藜。时危暂相见,衰白意都迷。
首章,叙惜别之情。上四送弟赴齐,下四自叹寥落。岷岭、徐关,言道里悠长,高枕、杖藜,言形影相吊。《杜臆》:岷岭在南蛮之北,徐关在东海之西,行非计日可到,故泪亦无时不流。又云:时则危,见则暂,身则衰白,恐再晤难期也。结语极悲。其二风尘暗不开,汝去几时来。兄弟分离苦,形容老病催。江通一柱观,日落望乡台。客意长东北,齐州安在哉。次章,兼叙别后之思。此亦四句分截。风尘二句,承上时危。兄弟二句,承上衰白。一柱观,经过之路。望乡台,遥想齐州。安在二字,写颖意中旁皇奔赴之情,从上句连读。其三诸姑今海畔,两弟亦山东。去傍干戈觅,来看道路通。短衣防战地,匹马逐秋风。莫作俱流落,长瞻碣石鸿。末章,冀其去而复来。颖赴齐州,故并想诸姑两弟。去傍干戈,冒险可虑。来看道路,后会难期。五六承去,七八承来。碣石在山东,鸿雁比兄弟。
送十五弟侍御使蜀鹤注:当是大历元年作,诗云“豺狼斗”,盖指崔旰辈相攻也。喜弟文章进,添余别兴牵。数杯巫峡酒,百丈内江船。未息豺狼斗,空催犬马年。归朝多便道,搏击望秋天。上四送别,五六慨身世,七八望侍御。顾注:公恨不能身讨豺狼,嘱弟归朝而弹击之。
第五弟丰独在江左近三四载寂无消息觅使寄此二首鹤注:诗云“十年朝夕泪”,自天宝十五载避乱与诸弟相别,至大历元年,为十年,当是其时作。乱后嗟吾在,羁栖见汝难。草黄骐骥病,沙晚鹡鸰寒。楚设关城险,吴吞水府宽。十年朝夕泪,衣袖不曾干。此章,兄弟别离,而致相思之意。草黄句,承乱后,自怜贫老。沙晚句,承羁栖,伤弟飘零。关城险,己不能往。水府宽,弟不可知。故久别悲哀而涕泪常流也。顾注:诗云十年,而题曰三四载,盖相别者十年,无消息者三四载耳。夔峡最险,如设关城。三江震泽,水府甚宽。其二闻汝依山寺,杭州定越州。风尘淹别日,江汉失清秋。影著啼猿树,魂飘结蜃楼。明年下春水,东尽白云求。次章,念弟远离,而致欲访之意。首联,弟在江左。次联,身在夔州。五六,客夔而想江左。七八,去夔而寻江左也。邵注:定越州,言不在杭州,定在越州。风尘,指兵戈。《杜臆》:失清秋,谓淹别之久,又蹉过一秋矣。赵汸注:尽字正应定字,惟传闻莫定,故须尽历云水以求之。顾注:古人望白云而思亲,公于手足之谊亦然。
奉送蜀州柏二别驾将中丞命赴江陵起居卫尚书太夫人因示从弟行军司马位黄、蔡俱以中丞为柏贞节。钱笺谓中丞是茂琳。王道俊谓两名止是一人。别驾,中丞之弟。黄生曰:柏与卫,必中表之亲,故使弟起居其母。《旧唐书·代宗纪》:大历元年五月,加荆南节度使卫伯玉检校工部尚书。时位在江陵,为行军司马。钱笺:位系公之从弟,故诗用惠连故事。中丞问俗画熊频,爱弟传书彩鹢新。迁转五州防御使,起居八座太夫人。楚宫腊送荆门水,白帝云偷碧海春。与报惠连诗不惜,知吾斑鬓总如银。上四,柏二将中丞命,往候卫太夫人。下四,公送柏赴江陵,嘱其寄诗从弟。中丞频问民俗,故须弟代行。三四,主宾流对。五六,时地兼举。送行在腊而云春者,所谓腊近已含春也。东方春气先行,故又言云碧海春。王维桢曰:末言鬓今尽白,本以苦吟之故,不能别寄一诗,非惜诗也。时解谓望弟寄诗以慰衰白,恐非。毛奇龄曰:柏二为蜀州别驾,是中丞属官。杜位为江陵司马,是卫尚书属官。中丞遣弟候卫太夫人,而少陵送之,因并寄弟位。此唐人长题,用八句完点之法。黄生曰:首联用字平钝,次联对语朴拙,经五六渲染,方见清新警拔,而一结造句,又自曲折可思。后半,得诗家回互周旋法。张南土改偷为输,与送同意。不如从偷字。胡应麟曰:嘉隆学杜,善矣,而犹未尽。“迁转五州防御使,起居八座太夫人”,本常语,而一时模尚,遂令大夫使者填塞奚囊,太尉中丞类被差遣,至不佞扶风汉大藩之类,亦后学之前车也。
别崔潩因寄薛据
孟云卿原注:内弟潩,赴湖南幕职。姑从黄鹤入大历元年。志士惜妄动,知深难固辞。如何久磨砺,但取不磷缁。夙夜听忧主,飞腾急济时。荆州遇薛孟,为报欲论诗。上六,送崔赴幕。末二,兼寄薛孟。远注:崔必好静不出,湖南幕主知而辟之,故有起二句。三四承首句,讽其硁硁独善。五六承次句,劝以汲汲有为。王嗣奭曰:此诗与九卷《送窦九归成都》同一机局,夭矫顿挫,唐律所无。窦本有才,勖之以苦节,崔能洁己,勉之以济时,意若相反,合之始为全人。此见公明体达用之学。
寄杜位(原注:顷者与位同在故严尚书幕。)
大历元年冬。
寒日经檐短,穷猿失木悲。峡中为客恨,江上忆君时。天地身何在,风尘病敢辞。封书两行泪,沾洒裛新诗。
寒日穷猿,对景有感。为客久,承穷猿。忆君时,承寒日。五六,申客久之况。七八,申忆君之情。
《杜臆》:漂流天地,既无定在,憔悴风尘,病又奚辞。凄凉之语,真堪流涕。
峡隘当是大历二年有意出峡而作。《杜臆》:公心欲出峡,故觉其隘也。闻说江陵府,云沙静眇然。白鱼如切玉,朱橘不论钱。水有远湖树,人今何处船。青山各在眼,却望峡中天。上四想江陵之胜,下叹峡隘难居也。云沙,思其风景。鱼橘,思其物产。远湖树,遥指江陵。人何处,想及弟观也。青山各在眼前,而却仍望峡天,恨出峡之不早耳。卢注:时公弟观,归蓝田迎妇,望其早至江陵,故曰:“人今何处船。”
崔评事弟许相迎不到应虑老夫见泥雨怯出必愆佳期走笔戏简顾注:当是大历二年春在夔州西阁作。邵注:崔评事,公之表弟。江阁邀宾许马迎,午时起坐自天明。浮云不负青春色,细雨何孤白帝城。身过花间沾湿好,醉于马上往来轻。虚疑皓首冲泥怯,实少银鞍傍险行。起结二联,宾主双关,中间四句,述坐时望迎之意。本是邀宾江阁许马迎,天明起坐至午时,两句皆用倒装法。
得舍弟观书自中都已达江陵今兹暮春月末行李合到夔州悲喜相兼团圆可待赋诗即事情见音现乎词
大历二年春作。题云“今兹暮春末合到夔州”,时公已定居夔州矣。尔到江陵府,何时到峡州。乱离生有别,聚集病应瘳。飒飒开啼眼,朝朝上水楼。老身须付托,白骨更何忧。
句句是喜,句句是悲,故曰相兼。
喜观即到复题短篇二首与上章,乃先后同时作。巫峡千山暗,终南万里春。病中吾见弟,书到汝为人。意答儿童问,来经战伐新。泊船悲喜后,款款话归秦。
亦兼悲喜意。首二是悲,三四是喜,五六喜中之悲,七八悲后之喜。千山迷暗,公不见弟。万里春行,弟在途中也。病中见弟书到,知其身尚无恙,乃十字为句。战伐新经,答以书中之意,此亦十字句法。“两京三十口,虽在命如丝”,上七字连说,下三字另住。
其二
待尔嗔乌鹊,拋书示鹡鸰。枝间喜不去,原上急曾经。江阁嫌津柳,风帆数驿亭。应论十年事,愁绝始惺惺。
仍不出悲喜两意。乌鹊栖枝,喜也。鹡鸰经难,悲也。五六,喜处衔悲。七八,悲极还喜。待弟不至,遂嗔乌鹊难凭矣。将拋书以示鹡鸰,欲问来时消息耳。鹊在枝间,若报喜而不去,复望之也。鹡鸰原上,乃急难曾经者,何又寂无一言乎。四句,总是自揣自语,展转盼望之情。嫌津柳,遮眼不见。数驿亭,来程可计,即前章“朝朝上水楼”也。谈及十年中,聚散流离,将愁绝而复惺惺矣。
舍弟观归蓝田迎新妇送示二首此当是大历二年夏作。《杜臆》:题云送示,选弟北归,示之以意也,前有《得舍弟观书》、《喜观即到》诸诗,盖观既到夔州,复归蓝田迎妇也。汝去迎妻子,高秋念却回。即今萤已乱,好与雁同来。东望西江永,南游北户开。卜居期静处,会有故人杯。此章拈去、回二字,为通首之主。萤乱,去时景。雁来,回时景。江永,怜其去。户开,望其回。时荆州有故人可依,故欲卜居其地。念却回,谓弟当念回也。
其二楚塞难为路,蓝田莫滞留。衣裳判白露,鞍马信清秋。满峡重江水,开帆八月舟。此时同一醉,应在仲宣楼。送别而望其早回。难为路,惜其远去。莫滞留,嘱其早回。衣裳鞍马,弟从陆路而来。江满帆开,公从水程而往。醉饮楼前,期相会于江陵也。楚塞,即夔州。峡险,则路难行。判,是拚着之意。信,是任他之意。公诗“春风自信牙樯动”,此信字正同。
舍弟观赴蓝田取妻子到江陵喜寄三首当是大历二年冬作。汝迎妻子达荆州,消息真传解我忧。鸿雁影来连峡内,鹡鸰飞急到沙头。峣关险路今虚远,禹凿寒江正稳流。朱绂即当随彩鹢,青春不假报黄牛。弟到江陵而喜,下半叙欲往之志。峣关,即蓝田关,从蓝田迎妻子,必经峣关之险。峣,音尧,故与禹作借对。鸿雁影来,承消息句。鹡鸰飞急,承荆州句。弟到沙头,则峣关不见其远矣。身在寒江,则稳流正可出峡矣。从此乘舟东下,无烦报书峡中也。衣朱绂而乘彩鹢,兄弟骨肉,须作此慰劳语,不嫌侈张也。此诗末二句,与“即从巴峡穿巫峡,便下襄阳向洛阳”语意相似,但彼诗语势轩豁,此将朱彩青黄作对,不免拙滞矣。其二马度秦山雪正深,北来肌骨苦寒侵。他乡就我生春色,故国移居见客心。欢剧提携如意舞,喜多行坐《白头吟》。巡檐索共梅花笑,冷蕊疏枝半不禁。次章,悯弟远来之情,下半写喜慰之意。卢世曰:他乡就我,故国移居,还题明净,而意更温深。欢剧喜多,尚与弟相隔许程,于是步绕檐楹,索梅花共笑。此时梅花半开,即冷蕊疏枝,亦若笑不能禁矣。说得无情有情,极迂极切。此严沧浪所谓诗有别趣,非关理也。其三庾信罗含俱有宅,春来秋去作谁家。短墙若在从残草,乔木如存可假花。卜筑应同蒋诩径,为园须似邵平瓜。比年病酒开涓滴,弟劝兄酬何怨嗟。
三章,谋卜居江陵,下半喜同室聚首也。庾、罗旧宅,久历春秋,未知今属谁家。倘故宅犹存,虽一草一木,亦不忍伤也。若须别为营构,亦当开蒋径以延客,学邵瓜而治生。兄弟劝酬,乃豫道新居乐事。卢世曰:三诗,句句是喜,句句是寄,若竟像封面浃洽语,便不是寄矣。朱瀚曰:一首云“解我忧”,二首云“欢剧”、“喜多”,三首云“何怨嗟”,顾题中“喜寄”二字,次第天然。篇中庾信、罗含、蒋诩、邵平,叠用四古人。引庾罗者,为僦旧居也。引蒋邵者,为构新居也。要之公弟间关至楚,行李萧条,亦不暇谋及营室,但从意中所筹画者,喜而笔之于诗。高士襟怀,文人韵致,至今俱可想见,不必真有实事,而诗品遂足流传矣。
元日示宗武大历三年正月元日。据次章言“十五男儿志”,时年盖十五岁矣。汝啼吾手战,吾笑汝身长。处处逢正月,迢迢滞远方。飘零还柏酒,衰病只藜床。训谕青衿子,名惭白首郎。赋诗犹落笔,献寿更称觞。不见江东弟,原注:第五弟漂泊江左,近无消息。高歌泪数行户郎切。首章叙元日情事。首言父子,末及兄弟,中皆触景而伤怀。《杜臆》:啼手战,见子孝。笑身长,见父慈。赋诗落笔,应前手战,故用犹字。献寿称觞,因上柏酒,故加更字。此诗兼悲喜并言。啼手战,是悲;笑身长,是喜。逢正月,是喜;滞远方,是悲。对柏酒,是喜;坐藜床,是悲。子可教,是喜;身去官,是悲。赋诗称觞,又是喜;忆弟泪行,又是悲。只随意序述,而各有条理。
远怀舍弟颖观等张远注:此诗亦元日所作,因前诗“不见江东弟”句,故又有此诗,观落句“旧时元日会”,可见。阳翟空知处,荆南近得书。积年仍远别,多难不安居。从颖观叙起。颖在阳翟,仍远别矣。观赴荆南,不安居矣。二句分承。江汉春风起,冰霜昨夜除。云天犹错莫,花萼尚萧疏。对酒都疑梦,吟诗正忆渠。旧时元日会,乡党羡吾庐。下乃元日感怀。风起霜除,新正气候。云天,言异地。花萼,比兄弟。对酒疑梦,忆弟难见也。错莫,谓纷错冥莫。旧时元日,伤今而思昔。
乘雨入行军六弟宅鹤注:公大历三年春抵荆南,是时卫伯玉为节度使,故位为行军司马。行军六弟,即杜位也。曙角凌云乱,春城带雨长。水花分堑弱,巢燕得泥忙。令弟雄军佐,凡才污省郎。萍漂忍流涕,衰飒近中堂。上四,春时雨景。下四,入宅有感。角声齐起,故曰乱。雨气连城,故曰带。分堑弱,荷初抽叶也。得泥忙,燕急营巢也。省郎,公自谓。中堂,位听事。
公安送李二十九弟晋肃入蜀余下沔鄂鹤注:此大历三年冬作。晋肃,李贺之父,见韩文《讳辩》。正解柴桑缆,仍看蜀道行。樯乌相背发,塞雁一行鸣。南纪连铜柱,西江接锦城。凭将百钱卜,漂泊问君平。上四送别之情,下四别后之慨。方为沔鄂之游,而送李入蜀,是两舟背发,不如雁序同行矣。南纪、西江,顶上背发。寄卜君平,问何时得免漂泊也。李称弟,故用雁行。往蜀中,故引君平。
重送刘十弟判官鹤注:当是大历四年秋在潭州作。分源豕韦派,别浦雁宾秋。年事推兄忝,人才觉弟优。首段叙事。上二叙送别,下二点兄弟。经过辨丰剑,意气逐吴钩。垂翅徒衰老,先鞭不滞留。本支凌岁晚,高义豁穷愁。他日临江待,长沙旧驿楼。次段言情。上四承才优,下四承别浦。刘之才气英利,如丰剑吴钩,故能先鞭用世,不似己之垂翅飘流也。晚逢高义,差慰旅愁,但未知此别之后,何时重食驿楼耳。本支,应分源。岁晚,应年事。
送卢十四弟侍御护韦尚书灵榇归上都二十四韵鹤注:当是大历四年冬潭州作。韦尚书,即之晋。公之祖母卢氏,十四其表弟也。素幕度江远,朱幡登陆微。悲鸣驷马顾,失涕万人挥。参佐哭辞毕,门阑谁送归。从公伏事久,之子俊才稀。长路更执绋,此心犹倒衣。感恩义不小,怀旧礼无违。墓待龙骧诏,台迎獬豸威。深衷见士则,雅论在兵机。叙侍御送韦,见死生不替之情。上四韦公灵榇,中八卢公护丧,下四结上起下。龙骧承韦,言殁后赠典。獬豸(xiè zhì)承卢,言宿望还都。深衷,指送丧。论兵,感世乱。戎狄乘妖气,尘沙落禁闱。往年朝谒断,他日扫除非。但促铜壶箭,休添玉帐旂。动询黄阁老,肯虑白登围。万姓疮痍合,群凶嗜欲肥。刺规多谏诤,端拱自光辉。俭约前王体,风流后代希。对敭期特达,衰朽再芳菲。此慨叹时事,望侍御归朝入告。戎狄乘,谓吐蕃陷京。落禁闱,谓侵犯宫阙。朝谒断,指代宗幸陕。扫除非,谓御戎无策。铜壶二句,言天子当早朝勤政,毋事添兵苑中。黄阁二句,言大臣多苟且尸位,不以主辱为忧。疮痍,谓生民困于兵赋。嗜欲,谓降将恣为骄侈。刺规以下,勉侍御面折廷诤,以图治安,而俭约爱民,尤为当今切务。故当抗章特达,不可委靡,令我衰朽之人,亦与有荣施也。对敭,duì yáng,面君对奏。(黄阁老,白登围,用典)朱注:休添玉帐旂,即公诗“由来貔虎士,不满凤凰城”意。今按:俭约前王体,即公诗“不过行俭德,威加四海深”意。空里愁书字,山中疾采薇。拨杯要忽罢,抱被宿何依?眼冷看征盖,儿扶立钓矶。清霜洞庭叶,故就别时飞。末叙送别之情。把杯同宿,不可复得,从此征盖远行,惟立矶遥望而已。霜凋木叶,对秋增悲也。
舟中夜雪有怀卢十四侍御弟鹤注:当是大历四年冬作,盖卢送韦大夫归葬,公对雪而怀之也。朔风吹桂水,大雪夜纷纷。暗度南楼月,寒深北渚云。烛斜初近见,舟重竟无闻。不识山阴道,听鸡更忆君。对雪怀人,以雪起,以人终。首纪地,次点题;三四远景,言岸上;五六近景,切舟中。山阴应雪,听鸡应夜,全诗句句入细。黄生曰:三四不摹雪之状,而写雪之神,如《初月》则曰“河汉不改色,关山空自寒”,《喜雨》则曰“野径云俱黑,江船火独明”,此皆意到笔随,诗来神助者也。咏雪则云“烛斜初近见,舟重竟无闻”,咏雨则云“随风潜入夜,润物细无声”,此画工所不能绘,直是化工之笔。叶梦得《诗话》:诗禁体物语,此学诗者类能言之。欧阳文忠公守汝阴,尝与客赋雪于聚星堂,举此令,往往皆阁笔不能下。然此亦定法,若能者则出入纵横,何可拘碍。郑谷诗“乱飘僧舍茶烟湿,密洒歌楼酒力微”,非不去体物语,而气格如此其卑。苏子瞻云“冻合玉楼寒起粟,光摇银海眩生花”,超然飞动,何害其言玉楼银海。韩退之两篇,力欲去此弊,虽冥搜奇谲,亦不免有缟带银杯之句。(随车翻缟带,逐马散银杯。)杜子美“暗度南楼月,寒生北渚云”,初不避云月字,若“随风且间叶,带雨不成花”,则退之两篇,工殆无以愈也。
冯至《杜甫传》:
①他困居长安,从秋到冬,从冬到春,除去为国家焦愁外,自然也时常怀念他的家属:远在钟离(安徽凤阳附近)的韦氏妹、滞留平阴(在山东)的弟弟、鄜州的妻子。他长久得不到家中的消息,并且听说胡人到处残杀,一直杀到鸡犬。他寄给他弟弟的诗里说:生理何颜面?忧端且岁时!两京三十口,虽在命如丝。(《得舍弟消息》之二)
②从这七首诗(《乾元中寓同谷县作歌七首》)里我们知道,他的三个弟弟杜颖、杜观、杜丰都远在东方,彼此不通消息,他的妹妹在钟离成为孀妇,十年不曾见面。
③他写成《寄题江外草堂》一诗,把经营草堂的始末与不得已离开草堂的原委,写得详尽亲切……他有时也打发他的最小的弟弟杜占——这是跟着他入蜀的惟一的一个弟弟——回去探视草堂,临行时谆谆地告诉他:鹅鸭宜长数,柴荆莫浪开!东林竹影薄,腊月更须栽!(《舍弟占归草堂检校聊示此诗》)
④杜甫无论在什么时期,都有怀念他的弟弟的诗。从他的诗里我们知道,他几个弟弟的名字是杜颖、杜观、杜丰、杜占。杜占和杜甫在一起的时间较长,他曾经随着杜甫从秦州到西蜀;杜观一向在山东;764年秋,杜颖到过成都看望杜甫,不久便往山东去了;杜丰自从安史乱后就和他们的姑母留在江东,杜甫已经许久得不到他的消息。767年,杜观到了荆州(江陵),又到夔州和杜甫会面,随后去蓝田结婚,结婚后又回到荆州。他在荆州附近的当阳,不断地写信给杜甫,劝他出峡。杜甫因为夔州气候恶劣,朋友稀少,生活虽可以维持,也不想在这里久住,如今得到杜观的来信,更增强他出峡的念头,他决定在768年正月中旬起程。……
无年号标注有:
临邑舍弟书至苦雨黄河泛溢隄防之患簿领所忧因寄此诗用宽其意二仪积风雨,百谷漏波涛。闻道洪河坼,遥连沧海高。从苦雨泛河叙起。“闻道”二字,据来书所言。排律诗须见段落分明,看此篇逐段还题之法。职司忧悄悄,郡国诉嗷嗷。舍弟卑栖邑,防川领簿曹。尺书前日至,版筑不时操。难假鼋鼍力,空瞻乌鹊毛。
言隄防之患。簿领所忧。职司,治水之官。郡国,被灾之民。领簿曹,颖为临邑主簿。操版筑,监督治河之事。鼋鼍、乌鹊,言不能借此以作桥梁。
燕南吹亩,济上没蓬蒿。螺蚌满近郭,蛟螭乘九皋。徐关深水府,碣石小秋毫。白屋留孤树,青天失万艘。
言傍河州郡皆被泛溢。徐关近济,碣石近燕,深成水府,小若秋毫,皆为水所淹也。孤树仅存,万艘失道,甚言水势之横决。
吾衰同泛梗,利涉想蟠桃。却倚天涯钓,犹能掣巨鼇。
寄诗以宽其意。临邑近海,故用蟠桃巨鼇事。益王潢南曰:五言排律,与五言律诗,其句法虽同,篇法实异。律诗描写情景,止尽于四十字耳,故贵宽闲酝籍之中,又有严密紧凑之妙。若排律,或数十韵,或百馀韵,其篇法岂五言律法可同。故作排律,其要有四:一贵铺叙得体,先后不乱。二贵队仗整肃,情景分明。三贵过度明白,不令人沉思回顾。四贵气象宽大,从容不迫,斯为得体。
编辑简介:赵慧莲,山西阳泉人,网名婉婉。高岭诗社成员、漾泉诗社理事,有个人公众号宛委閣。
原文链接https://mp.weixin.qq.com/s/RiEcCBM7nnQYsRCWxf-4VQ
往期精彩
郭子仲读诗|杨万里《晨炊白升山》
郭子仲读诗|王维《敕赐百官樱桃》
郭子仲读诗|陆游《雨晴游洞宫山天庆观坐间复雨》
当代诗社|坤社清平乐小集
当代诗社|坤社2022年第7期社课
举报/反馈
PRODUCT 01【苹果AirPods (第三代) 蓝牙耳机套】
材质:PC
工艺:UV打印
机型:One size
重量(g):66
适用场景:AirPods蓝牙耳机套
推荐素材:卡通、徽章logo、国旗、风景
PRODUCT 02【成人全幅印制T恤 (男女款)】
材质:Polyester
工艺:热转印
尺寸:S-4XL
重量(g):202+
适用场景:日常使用
推荐素材:涂鸦、动物、游戏动漫
PRODUCT 03【钻石画(圆钻&方钻)】
材质:化纤布
工艺:UV打印
尺寸:12"×16"-16"×20"
重量(g):258+
适用场景:送礼、家居
推荐素材:节日、游戏动漫、custom
PRODUCT 04【旗子】
材质:涤纶
工艺:热转印
尺寸:24x35in-47x70in
重量(g):79+
适用场景:日常、家居花园
推荐素材:国旗、世界杯、徽章logo
PRODUCT 05【浴帘】
材质:Polyester
工艺:热转印
尺寸:36×72-72×72Inch(92×183-183×183cm)
重量(g):300+
适用场景:家居、浴室
推荐素材:风景、水波纹、卡通
PRODUCT 06【工牌】
材质:ABS塑料
工艺:UV打印
尺寸:One size
重量(g):76
适用场景:活动会场、办公室、校园
推荐素材:卡通、人物、custom
PRODUCT 07【文具袋】
材质:Polyester fibe
工艺:热转印
尺寸:22*12*5cm
重量(g):89
适用场景:办公室、校园
推荐素材:卡通、游戏
PRODUCT 08【毛绒抱枕套(双面设计)】
材质:短毛绒
工艺:热转印
尺码:12"×12"-26"×26"
重量(g):85+
适用场景:家居、客厅、卧室
推荐素材:人物、卡通、日系印花
PRODUCT 09【珊瑚绒地垫】
材质:Coral velvet
工艺:热转印
尺寸:15"×25"-20"×32"
重量(g):310+
适用场景:家居、卧室
推荐素材:卡通、全印花纹、整蛊印花
PRODUCT 10【铁皮挂画横版&竖版】
材质:iron
工艺:UV打印
尺寸:20x30cm-30x40cm
重量(g):230+
适用场景:家居、送礼
推荐素材:涂鸦、游戏动漫、复古印花
SDS定制选品 | 一站式跨境电商POD选品供应
举报/反馈
干练的头彰显内心的快乐
2022火爆全网的短发头型
你是我喜欢的类型
她有一种莫名的美、就是健康达人的美
山、在画家的眼里、就是一幅画
山、在诗人的眼里、就是一首诗
山、在歌唱家的眼里、就是一首永远唱不完的一首歌
举报/反馈
快要考试了 拿去练练手
资料免费,仅用于交流学习
分享知识,力所能及 传道 授业 解惑~
初高中数理化,数学,物理,化学,语文,英语
小兴趣大梦想,沪上初高中数理化
头像查看其它科目资料答案
2020年湖南长沙市中考数学试题(完整解析版)
18位育中学高一上分班英语考(答案参考)
八大七宝中学高一分班考试物理(完整解析)
2020年福建省中考数学试题(完整解析版)
举报/反馈
老照片着色,早已不是什么新鲜技术。
但把着色后的一类老照片集纳成册,就是一个新产品。
(1935年的AI着色照)
2016年,东京大学的学生庭田杏珠,和教授渡边英德一起,开始对太平洋战争中留下来的历史老照片,进行AI着色。
几年后,他们编排出版了一本书,《用AI彩照复原的战争》。
每逢重大纪念日,他们就会挑几张出来,发网上,营销此书。
前两天,8月15日,日本投降的77周年时,出版社用60多张着色照,讲述日本战败历程,火了一把。
其中一个网站上,读者留言互动热烈,一句留言最多6000多赞。
飞春觉得,可以把这些留言和反思,翻译过来给大家看看。看他们说了些啥,与你想象的有没有差别。
因为——
首先,日本人以AI图为证,讲述日本人的战败故事,就颇有创意和吸引力;
其次,日本网民看到这些故事,忆昔抚今,五味杂陈,他们会说些什么,值得关注;
最后,你在桥上看风景,看风景的人在楼上看你,对同一历史图景的不同观瞻,令人深思。
这些复原图片,我也选了几张,穿插到本文中,我们边读图边围观。
(马绍尔群岛,美军俘虏的日军。评论多以此图展开)
其留言大致可归如下几类:
一、被着色震惊
“感觉好像发生在自己身边……”
●以前一直看的是黑白照片,现在看到彩色的,突然觉得照片里的人就在身边,是一种非常不可思议的感觉。
●他很瘦,看起来像个孩子,但他有胡子,所以他一定是个成年人。这是一部令人震惊的作品。
●黑白给人一种史实的感觉,但着色上彩后,却是近在咫尺的悲剧。
尤其是那位带着面具的和尚,似乎我们正处于战争的不幸之中。
(日本和尚参与的防毒面具训练)
●我之前看过所有的照片,令我惊讶的是,仅仅改变了色彩,这些故事便让我感到如此熟悉,甚至我的恐惧和悲伤都改变了。
●这段历史,虽然我们是在纪念馆和教科书上了解到的,但我一直以为是别人的问题,上色似乎增加了强烈的说服力。
我相信,未来绝对有必要进行避免战争的和平教育。
我希望我的孩子接受使用彩色照片的教育,而不是只张贴黑白照片的小册子或博物馆。
●我40多岁了,这是我第一次看到这张照片。
我在学校也学过历史,所以我以为我了解了广岛、战争、满洲等,但看到这张照片我很震惊,自己学得还不够。
我认为我们应该让我们的孩子了解这些情况。
当我把它给我儿子看时,他哭了。
我想成为一个能正确解释的父母。
(太平洋战争中,美国集中营中的日裔女孩在做体操)
●怎么说呢,虽然不是经常看的照片,但着色后有种错觉,似乎是与能拍彩照的现在,处在一个时代。
我想,如果走错一步的话,我们也会重蹈覆辙,成为照片里的人。
我们只是碰巧,离那个时代很远。
●几乎看不下去了,如果不让现代人多看看战时和战后的样子,日本在精神上就会垮掉,包括我们在内的现代人一定要多看看。
但现实情况是,日本人从头到尾都被娱乐节目洗脑了,变得越来越愚蠢了。
(在美国的日裔家庭)
飞春点评:
一张图片唤醒历史的记忆,震惊的不仅是色彩,更是记忆、对真实历史的唤起。
黑白变彩色,瞬间模糊了历史和现实的距离,不由让人联想自己,反观现实:它就在我们身边吗?它会再次来到我们身边吗?
从留言可以看出来,日本人对自己的历史,也有未知的黑洞。
二、被饥饿震惊
“这样的日本不可能赢……”
●光看这张照片,就知道很难战胜列强。我知道粮食等重要的东西,在当时是多么欠缺。
毕竟日本的粮食依赖进口,即使开战也赢不了,我想我如果生在当时,也不会考虑如何保护这个国家。
●即使没有这么多的营养,胡须也会生长……
●我从未见过如此瘦弱的士兵照片,日军最后的所有士兵都瘦到饿死了。
我从来没有在美军甚至纳粹中看到过这样瘦骨嶙峋的士兵的照片。
当我看到这些骨瘦如柴的年轻人的照片时,我觉得最接近的是奥斯维辛集中营犹太人的照片。
(送出征的神风队)
●应该记住,许多士兵死于饥饿和疾病,而不是死于直接战斗。
从一开始,日本就应该清楚:以国力保卫亚太诸岛似乎是不可能的。
这是留胡子的童兵吗?看这样子,我理解了麦克阿瑟来到日本后,为什么会判断日本人只有15岁的智力和体质。
●我还以为是招聘工人的照片。
●战争中最重要的是后勤。
无论你的军队多么强大,如果你没有适当的补给路线和补给,你就会失败。
日本之所以失败,是因为它过于依赖胆量这种无意义的东西。
(偷袭珍珠港)
●不要忘了,如果不能好好吃饭,就不能好好打仗。
●饥饿是当时日本士兵的头号死因——哪里还会有这样的屈辱?
●看了这个,我觉得日本不可能赢。
●几乎没有什么吃的,虽然当时人们靠吃草和老鼠生存,但他们还是被送到了前线。这是一个活生生的地狱!
●这么瘦我赢不了,我只能举起枪。
●死于疾病和饥饿的人比死于战争的人多。如果我当时这么说,我会被宪兵逮捕,被认定为“非国民”,日本人民是被自己国家而不是敌国杀死的。
(日本儿童)
●用这样的身体、这么差的武器去打仗,是不可能打赢的。这是不合理的,领导者是鲁莽的、无能的,他们试图用这来对抗美国和英国,真是井中之蛙不知大海!
●200万战争死难者中,有80%是在战争结束前的两年内丧生的。
而且,其中50%是在南方丛林中游荡、没有战斗、没有食物供应、被疟疾侵袭、饿死的人。
这张照片中的人,是非常罕见的幸存者,他们处于饿死的边缘。
幸运的是,他们受到了美军的保护。
帽子上,闪耀的军衔徽章令人悲伤。靖国神社供奉的神灵,大多是饿死者,靖国神社肯定充满了他们怨恨的声音。
(夜空中,盟军轰炸日机的炮火痕迹)
飞春点评:
关于饥饿,我想用一组数据,说明一下当时日本的经济。
二战发生时,日本这个脱亚入欧的资本主义先进大国,距离明治维新尚不足百年。
其国力,虽然问鼎亚洲,但工业实力,却远远无法与欧美老牌资本主义国家相比。
日本有9000多万人,其中一半仍然在从事农业,其工业刚起步。
作为现代工业的基础,钢铁业、石油业,日本有着天生不可改变的缺陷:资源奇缺,基本全部依赖进口。
1941年,日本与美国开战时,综合国力是美国的1/10,1944年是1/22。(山木弘文,《近代日本经济史》,东京有斐阁,1980年)
(冲绳岛,美军给当地老百姓医疗)
长期消耗战,拖垮了日本。
仅从米谷配给的标准,就可以看出日本是如何勒紧裤腰带,在苦撑战争。
1941年,厚生省规定,一个从事一般工作的青年男子,日摄入热量标准是2400大卡;
1942年,日摄2000大卡;
1945年,日摄1793大卡。(鹤见俊辅《战争时期日本精神史》,东京有斐阁,1985年)
大卡,是食品热量单位。
1981年我国营养学会成立时,曾研究得出我国人口所需营养:平均每人每日需要摄入2400大卡热量、70克蛋白质。
需要指出的是,厚生省所制定的热量标准,是可以用粗粮、野菜、树根等来充当的。
而且根据实际情况来看,应该说,这正是政府鼓励的。
日史载:战争后期,人民的口粮配给,其实是把红薯皮、大豆皮等热量都算上了。(井上清、铃木正四,《日本近代史》,北京商务印书馆,1959年)
(为日本妇女儿童进行消防灭火训练)
我们知道,决定一支部战斗力的,有三大要素:人员、武器和作战意志。
经济是战争的基础,粮草是兵马的基础。
日本从侵华战争开始,就不悬崖勒马,一步步扩大,一步步走向“困毙”。
其背后,有自身历史原因,有政治体制原因,也有国际大背景的原因。
如今,这些历史重见天日,让现代日本人痛定思痛,发出井中之蛙不知大海的感叹。
历史就是未来,日本必须牢记自己的弱点:
武士道不管用,国家小、资源少,是日本的死穴,未来如果发生大战,日本仍然面临这两大困境,不堪重压。
三、引发回忆:
“我的祖父也是个日本兵……”
●我的两个祖父都去打仗了。
其中一人在战争结束后,被扣留在西伯利亚,5年后才返回。
虽然在严格的管制下生活,但偶尔会有俄国士兵偷偷把面包带到战俘营内,分给他们。
另一位祖父,则前往激战地菲律宾。炸弹在附近落下,他虽然受伤,但生还了。
几十年后的某一天,整形外科要为他做MRI的时候,技师告诉他,“脸上有无数细小的金属粘连在一起,无法检查。”
战祸的毒害,竟然超越了时间,留存在了这里……
(中途岛海战,被俘的日军等待救援)
●与我一起住的祖父,是个通信兵。
但是,对战争,他也什么也不告诉我,对母亲也只是说“不想回忆”。
而祖母常和我说话。
她说,当时,在他们经营的老家饭店里,客人们总说“不可能赢”,但不久,谁也什么都不说了。
战后,我看电影《乱世佳人》时,不禁流泪了,我想:“当时日本敢和能制作出这样的电影的国家打仗,怎么可能赢呢?”
●我从小就和祖父母住在一起,所以可以断断续续地问他们历史。
但是,住在远处的表弟,长大后来拜访我,当说“想听战争的故事”的时候,我却不知道从什么地方开始说,表弟也不知道从什么开始问。
我感受到了把历史传承下去的困难。
(蘑菇云的颜色)
●我的祖父,直到去世为止,对孙子们都是缄口不提战争的话题。
后来我知道,祖父虽然被征兵了,但并没有来得及去战场。听说,战场上没有吃的,士兵们一个个饿死,很痛苦。
祖父是农家出身,他在自己院子里种了田,总算保住了命,没有饿死。
虽然我知道战争带给他的,只是一种不愿说的痛,但看了这些照片之后,我才深深地理解这种痛苦:战争中牺牲的,都是普通的平民。
(当街休息的日本儿童)
●35年前,我还是个小学生。
我记得当时在街上看战争电影的情景,非常恐怖。
我奶奶处于战争年代,她经常因为吃饭时剩饭而被骂。
我的童年,还有一点点了解战争的碎片机会,但现在的孩子们,从社会上了解战争的机会,几乎没有。
也许,这是随着时间的流逝而无可奈何的事,但在这个物质泛滥的时代之前,曾经发生过一切都化为焦土、夺走无数生命的战争。
我想应该告诉大家这一点,让更多的人知道。
●我已故的祖父在南方被俘,但美国士兵善良温和,他经常怀念自己当战俘的时代,当地人晚上还偷偷给他们战俘送香蕉和芒果。
●经历过战争的祖父,不丢弃东西,自己会修理各种各样的东西……和现在的我们不同,虽然我们也珍惜东西,不过,我们的仓库堆得如同垃圾屋一样……
●我的爷爷也被派往军队,但在返回日本后死于营养不良。惨烈的战争一定是会大幅缩短人的寿命。
(长崎原子弹投下20分钟后)
飞春点评:
真实的历史,只有从老百姓口里听到。
坊间传言,自然不登历史大雅之堂,研究者也不会采信。但它们即符合情感需要,又符合历史细节。
这些日本网民的留言,就是如此。
也许,这样的留言,多少年后,连碎片和影子都看不到了。
到那时,日本人将看到一个更符合当局“主流”偏好的历史叙事。偏见将代表客观,滤镜将成为真彩。
而真实的历史,用再强的AI,也不能正确着色,恢复其原有面貌了。
这就是野史的魅力所在,也是我一直重视个人私史,以私史推敲正史的原因。
四、追问真相
“日本人的敌人是日本皇军!”
●看这张照片,就可以感受到战争是多么的野蛮和徒劳。
如果是我,如果是我的孩子,我会哭。
我觉得把这一切告诉世界很重要。
我曾经在一个战争特别节目中看到它,好像当时给年轻的神风敢死队服用了下药的巧克力,好让他们振奋精神,失去恐惧……
我相信,战争只会留给人类仇恨和悲伤。
(原子弹投放1个月后的广岛)
●这是一场失败的战争的结果,当时的战争领导人应该死一百万!
●日本的战争报道,只回顾太平洋战争,特别是日本遭受的损失。
这确实很重要,但也希望能够把全面的信息传达给每一个国民,让他们回顾一下为什么会有这样的事情发生,日本到底在哪里出错了。
我想大概要追溯到明治维新。
现在只关注太平洋战争,这在国外看来是一种扭曲的、难以被理解的姿态。
●生活在现代的我们,都是仅知道二战和太平洋战争的人。
现在是一个只要稍微查一下就能得到各种信息的时代,但当时的人们,没有办法这样获取信息,更不用说国家对信息和言论的限制了。
无论是士兵还是普通国民,都必须以总体战的姿态面对战争,就连战况开始恶化的事,国民都没有被正确告知……
从彩色照片中,我们可以清楚地看到当时的绝望状况。
●我想让那些美化战争的人看到它,现实有多惨。
●现在每个人都有智能手机,这是阻止战争和屠杀等野蛮行径的利器——可以瞬间传送到全世界。
当时,如果有这么方便的东西,或许就不会有广岛、长崎、冲绳、东京等可怕的攻击了。
虽然有很多弊端,但我认为这个能够将民众的微小声音放大的东西,正是保持和平的一个要素。
●日本人的敌人是日本皇军,这张照片揭示了真相。
●对过去死去的日本士兵进行奉若英灵的赞美,我觉得越来越多的人在美化军队乃至政府,而对当时日本政府犯下的错误视而不见。
这样的战时照片,应该永远陈列在首相官邸的首相办公室里。
●这么瘦的身躯在大陆上决战!我想知道当时的政府是怎么想的。你真的认为你可以用竹矛战胜机枪吗?
●当英日同盟结束时,日本的气数就到头了。
日本应该在第一次世界大战中派出更多的军队来帮助英国。
昭和天皇作为战犯逃脱了死刑,但他应该退位。多少人为此受过!
●日本对其他国家做了什么。出于某种原因,有些人说这是一件好事,一场好战争,但这是真的吗?什么是一场好战争,一场涉及公民的战争?
这是一场战争,因为他们想像大国一样从他们的殖民地夺走很多东西(当然,有些人想知道为什么日本在殖民地时代就不能拥有殖民地,但殖民地本身是错误的),仅对受到的损害进行特写。
(战前的日本儿童)
日本做了什么?召集的士兵在中国大陆做了什么?你在其他领域做了什么?士兵为什么要白白死去?这都是值得反思的事情。
●愚蠢的执政者们引起的那场战争,拿着竹枪向拥有核武器的国家开仗。
什么“一亿玉碎”?都是傻瓜!
●如果日本不是偷袭珍珠港而是与美国和平相处,而是与中国和平相处,日本会发生什么?
飞春点评:
从这一类留言中,我们发现,现代日本人,其实对当时日本发动的那场战争,多数也是持否定的看法。
这并非飞春将留言故意过滤后,刻意得出的结论。
这些留言,出人意料地证实了两个观点:
一、多数现代的日本人,并不知道那段真实的历史。
他们所知道的,只是被修改、过滤掉的历史,呈现出的是日本所受损害的一面,而对侵略邻国等错误的过去,一律缄默不言,一直不全盘讲述。
这,就造成了现代成长起来的日本人,一旦洞见那段真实历史的只言片语、碎片记忆,就会惊愕不已。
当发现铁证凿凿时,人们就不由循此反向求证:
当时日本做了什么,为什么这样做,到底隐藏了什么,是谁,出于什么样的原因,让老百姓瘦成了这个样子,仍然不早早结束战争?决策者是一种什么心态,该负什么样的历史责任……
(日军俘虏与护士结婚)
二、日本网民知道那段真实的历史后,也多持反战态度。
我相信,生活在那个时代的一介平民,任何一个普通老百姓,在那种经济崩溃、全民饿死的情况下,都不会愿意再作战下去。
但纳粹社会只允许一种声音。这就是当时日本的恐怖环境,也是日本刹车失灵的原因之一。
时代更迭,现在的日本人,作为正常人有了发声的机会。
从他们的留言看得出来,这是一个正常人看到那段真实的历史后,应有的拷问和反思。
这与我以前头脑中想象的不同。
我们不少人可能以为,现在的日本人仍然与二战前一样,是一个疯狂好战、仇视周边、欲意东山再起的邪物。
从这些留言来看,并非如此。
事实上,每个国家的平民老百姓,都是反战的。
只有政治需要,才会鼓动动武,而当炮灰的,永远是老百姓。
这个道理,适合所有国家、所有时代。
(美军控制日本战犯)
五、反思历史
“从彼时到此时,日本并没有真正改变……”
●在战争中,只有老大在后方发号施令,真正战斗或死亡的是士兵,普通平民死于轰炸。
什么是战争?
战争就是如何杀死对方的人民,如何削弱国力。
现在俄乌战争正在继续,我希望它不会引发第三次世界大战。
●好辛苦啊……几乎没吃过饭,饥肠辘辘的状态一目了然,站在那里应该已经竭尽全力了。
在随时都可能死亡的身体状态下,还保持着拍照的精神。
不难想象,当时的环境是多么严酷。
战争这种东西,失去的远远大于得到的。
这是当时掌权者的利益和面子,以及日本至今仍在持续的“同步压力”所导致的结果。
希望我们的社会,能成为多元并蓄的社会。
(美军攻占日本后歇脚)
●我真的觉得很可怜。
现在有了丰富的资料,可以多角度地回顾当时的情况。
我认为,当时被派往亚洲各地的日本人,完全没有必要莫名其妙地饿死或战死,我认为决策者判断错误的代价太大了。
●民主主义政治并非万能,但它试错和调整失败政策的周期,比权威主义政治要短。
时代发展,政权更替,人们的视野也在改变,过去看不清楚的问题,现在能理清头绪、找到症结了。
因为,民主主义也好,共产主义也好,包括其他的一切的制度设计,都是以善意为前提的。
民主主义反映的是多数人的意见,所以容易接受,但是否在深入分析的基础上做出了好的判断,就另当别论了。
日本因为输了才这样反省,如果赢了的话,大家的意见也会不一样,很难。(这条留言,点赞数量最高)
●是啊,英国首相丘吉尔曾说:
“事实上,民主可以说是最糟糕的政治形式,除了你尝试过的非民主政治形式。”
民主主义与独裁政体不同,是一种需要在议会进行讨论并通过法案的、非常麻烦的体制,但现在看来,它是最佳的选择。
但另一方面,这也容易造成多数派的政治垄断。
须知,正是在世界上首个民主宪法——魏玛宪法的实施之下,希特勒合法地掌握了政权。这也是事实。
●我也同意民主主义,只是,在日本很难。
长期的封建社会、文明开化、战胜大国、第一次世界大战中作为亚洲国家的屈辱、作为亚洲盟主的实质参与,以及败给美国,战败后被占领,然后经济复兴、经济大国、泡沫破灭……
由于立场变化太大,实际上,国民并没有跟上变化的步伐。
(冲绳岛,白旗少女走向美军投降)
●管理这场战争的人,战后与美国勾结并被无罪释放,他们的后代,仍然统治着日本。
因此,它仍然是一个战败国,被视为战胜国的附庸国。
所以,在任何领域,让日本引领世界,都是他们不可接受的,因为他们无利可图。
这就是为什么日本工资水平永远不会达到发达国家水平的原因。
●怀着“永远不能忘记战争的悲剧”的初衷,我们每年8月都会举行这样的活动,但最重要的问题——“战争为什么开始?”——却被回避了。
我觉得,国家、政府、敌对国家、世界形势、政治意识形态等等,错综复杂地交织在一起,引发了战争,如果不回头看,很有可能重蹈覆辙。
比如“法西斯主义”,在今天的日本看来,是一个错误,但我想很少有日本人知道,墨索里尼在意大利闪亮登场时,他也是当时欧洲普遍钦佩的一个人。
历史教育很复杂,因为涉及思想,但我们必须传承过去的事。
●大东亚战争是由白人国家横行引发的,我想,日本人应该知道现在被GHQ抹去的真相。无知是一种罪,不要浪费了先辈的生命。
(战后领取美军补给的日本人)
●从彼时到此时,日本并没有真正改变。我们甚至没能力让一个议员辞职。
如果执政党走向战争,国民同样无法阻止。
这次的参议院选举中,有人根据自己的意愿选择了自己认可的政治家。
如果我们不认真选议员的话,就会再次品味这张照片中的景色。
●在国家的发展中,所有的制度只有“倾向”的不同,本质上并无高低之分。那么,国与国之间的差别是什么呢?
是教育。
不同的教育结果,注定了不同的性质。如果教育出现问题,政治、经济、军事就会陷入混乱,国家就会走向错误。
(B29掠过富士山)
●我真的为那天的人们感到难过,怜悯这个词是不够的。
时代变了,但我认为国家、政府应该道歉。
她威胁那些不想参战的人,强迫他们成为士兵,导致许多人丧生。
她对人民撒谎,说这个国家很伟大。
现在不是和其他一些国家一样吗?
彻头彻尾的愚蠢!最后,还引来了两颗原子弹。但是,如果日本没有战败,我想日本会成为一个思想非常危险的国家。
(被日机炸伤的美舰,正在缓缓下沉)
飞春点评:
满满的吐槽、冷静的反思、深入的批判、批评远远大于赞扬(当然,也有错误的言论)……
这,就是8月日本战败月,现代日本人真实的内心。
如果说这就是所谓的“键盘侠”,那么,键盘侠看起来不止在日本出没。
这个世界上,在任何一个国度里,都没有人不对自己所处的环境吐槽。
限于人类认知能力,他们总对远处的风景高山仰止,对镜中花、水中月固执地持有不求甚解的迷恋。
网民的理想,永远在远方。
反思历史,揆诸现实,日本网民找到了新时代社会新的痛点,那就是:
日本没有发达国家的工资,没有西方真正的民主制度,也没有国际社会发言权;
日本人很努力,做得东西也很优秀,但自己做得再好,永远也引领不了世界,最优秀的,也只能做个“二”。
(美军登陆日本)
历史上的日本,一路跌宕摔打,一度极为自大,一度极度悲催,一度茫然失魂。
它既无辉煌的历史,也无原创的文化,反观历史,遥望未来,它们的明天在哪里?
茫茫大海,犹如一叶行将沉没的扁舟,他们虽万般努力的挣扎,却总也找不到自己的位置,这就是日本人的精神焦虑。
结语:
1 AI着色唤醒记忆,这就是技术革命;
2 日本刻意回避客观的历史。历史可以被阉割过滤,但总会在日后迸发出来;
3 当代日本年轻人,是在历史的金鱼缸中成长起来的,但在对待真实历史上,有着正常“人”的思维,有着不同于政客的见解。
4 全世界的网民都有共同的尿性,吐槽是常态。
幸福是相对的,不满是绝对的。
只是,所有的吐槽中,若能吐出反思,则可贵;若能辩出真知,便可取;若一味无脑泄愤,实可悲矣!(完)
举报/反馈
本文引用自InfoQ社区“5亿用户如何高效沟通?钉钉首次对外揭秘即时消息服务DTIM”一文,作者陈万红等、策划褚杏娟,有修订和改动。
一、引言
本文是国内企业IM的事实王者钉钉首次对外深度解密其即时消息服务(即DingTalk IM,简称DTIM)的技术设计实践。
本篇文章内容将从模型设计原理到具体的技术架构、最底层的存储模型到跨地域的单元化等,全方位展现了 DTIM 在实际生产应用中所遇到的各种技术挑战及相应的解决方案,希望借本文内容的分享能为国内企业级IM的开发带来思考和启发。
二、系列文章
本文是系列文章的第8篇,总目录如下:
《阿里IM技术分享(一):企业级IM王者——钉钉在后端架构上的过人之处》《阿里IM技术分享(二):闲鱼IM基于Flutter的移动端跨端改造实践》《阿里IM技术分享(三):闲鱼亿级IM消息系统的架构演进之路》《阿里IM技术分享(四):闲鱼亿级IM消息系统的可靠投递优化实践》《阿里IM技术分享(五):闲鱼亿级IM消息系统的及时性优化实践》《阿里IM技术分享(六):闲鱼亿级IM消息系统的离线推送到达率优化》《阿里IM技术分享(七):闲鱼IM的在线、离线聊天数据同步机制优化实践》《阿里IM技术分享(八):深度解密钉钉即时消息服务DTIM的技术设计》(* 本文)
相关文章:
现代IM系统中聊天消息的同步和存储方案探讨钉钉——基于IM技术的新一代企业OA平台的技术挑战(视频+PPT)企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
三、钉钉的技术挑战
钉钉已经有 2100 万 + 组织、5 亿 + 注册用户在使用。DTIM 为钉钉用户提供即时消息服务,用于组织内外的沟通,这些组织包括公司、政府、学校等,规模从几人到百万人不等。
DTIM 有着丰富的功能,单聊、各种类型的群聊、消息已读、文字表情、多端同步、动态卡片、专属安全和存储等等。
同时:钉钉内部很多业务模块,比如文档、钉闪会、Teambition、音视频、考勤、审批等,每个业务都在使用 DTIM,用于实现业务流程通知、运营消息推送、业务信令下发等。每个业务模块对于 DTIM 调用的流量峰值模型各有差别,对可用性要求也不尽相同。DTIM 需要能够面对这些复杂的场景,保持良好的可用性和体验,同时兼顾性能与成本。
通用的即时消息系统对消息发送的成功率、时延、到达率有很高的要求,企业 IM 由于 ToB 的特性,在数据安全可靠、系统可用性、多终端体验、开放定制等多个方面有着极致的要求。
构建稳定高效的企业 IM 服务,DTIM 主要面临的挑战是:
1)企业 IM 极致的体验要求对于系统架构设计的挑战:比如数据长期保存可漫游、多端数据同步、动态消息等带来的数据存储效率和成本压力,多端数据同步带来的一致性问题等;2)极限场景冲击、依赖系统错误带来的可用性问题:比如超大群消息,突发疫情带来的线上办公和线上教学高并发流量,系统需要能够应对流量的冲击,保障高可用;同时在中间件普遍可用性不到 99.99% 的时候,DTIM 服务需要保障核心功能的 99.995% 的可用性;3)不断扩大的业务规模,对于系统部署架构的挑战:比如持续增长的用户规模,突发事件如席卷全球的疫情,单地域架构已经无法满足业务发展的要求。
DTIM 在系统设计上:
1)为了实现消息收发体验、性能和成本的平衡,设计了高效的读写扩散模型和同步服务,以及定制化的 NoSQL 存储;2)通过对 DTIM 服务流量的分析,对于大群消息、单账号大量的消息热点以及消息更新热点的场景进行了合并、削峰填谷等处理;3)核心链路的应用中间件的依赖做容灾处理,实现了单一中间件失败不影响核心消息收发,保障基础的用户体验。
在消息存储过程中,一旦出现存储系统写入异常,系统会回旋缓冲重做,并且在服务恢复时,数据能主动向端上同步。
随着用户数不断增长,单一地域已无法承载 DTIM 的容量和容灾需求,DTIM 实现了异地多单元的云原生的弹性架构。
在分层上遵从的原则为重云轻端:业务数据计算、存储、同步等复杂操作尽量后移到云端处理,客户端只做终态数据的接收、展示,通过降低客户端业务实现的复杂度,最大化地提升客户端迭代速度,让端上开发可以专注于提升用户的交互体验,所有的功能需求和系统架构都围绕着该原则做设计和扩展。
以下章节我们将对 DTIM 做更加详细的介绍。
四、模型设计
4.1、DTIM系统架构
低延迟、高触达、高可用一直是 DTIM 设计的第一原则,依据这个原则在架构上 DTIM 将系统拆分为三个服务做能力的承载。
三个服务分别是:
1)消息服务:负责 IM 核心消息模型和开放 API,IM 基础能力包括消息发送、单聊关系维护、群组元信息管理、历史消息拉取、已读状态通知、IM 数据存储以及跨地域的流量转发;2)同步服务:负责用户消息数据以及状态数据的端到端同步,通过客户端到服务端长连接通道做实时的数据交互,当钉钉各类设备在线时 IM 及上游各业务通过同步服务做多端的数据同步,保障各端数据和体验一致;3)通知服务:负责用户第三方通道维护以及通知功能,当钉钉的自建通道无法将数据同步到端上时,通过三方提供的通知和透传能力做消息推送,保障钉钉消息的及时性和有效性。
同步服务和通知服务除了服务于消息服务,也面向其他钉钉业务比如音视频、直播、Ding、文档等多端 (多设备) 数据同步。
图1:DTIM架构图 ▼
上图展示了 DTIM 系统架构,接下来详细介绍消息收发链路。
4.2、消息收发链路
图2:DTIM消息处理架构 ▼
1)消息发送:消息发送接口由 Receiver 提供,钉钉统一接入层将用户从客户端发送的消息请求转发到 Receiver 模块,Receiver 校验消息的合法性(文字图片等安全审核、群禁言功能是否开启或者是否触发会话消息限流规则等)以及成员关系的有效性(单聊校验二者聊天、群聊校验发送者在群聊成员列表中),校验通过后为该消息生成一个全局唯一的 MessageId 随消息体以及接收者列表打包成消息数据包投递给异步队列,由下游 Processor 处理。消息投递成功之后,Receiver 返回消息发送成功的回执给客户端。
2)消息处理 :Processor 消费到 IM 发送事件首先做按接收者的地域分布(DTIM 支持跨域部署, Geography,Geo)做消息事件分流,将本域用户的消息做本地存储入库(消息体、接收者维度、已读状态、个人会话列表红点更新),最后将消息体以及本域接收者列表打包为 IM 同步事件通过异步队列转发给同步服务。
3)消息接收 :同步服务按接收者维度写入各自的同步队列,同时查取当前用户设备在线状态,当用户在线时捞取队列中未同步的消息,通过接入层长连接推送到各端。当用户离线时,打包消息数据以及离线用户状态列表为 IM 通知事件,转发给通知服务的 PNS 模块,PNS 查询离线设备做三方厂商通道推送,至此一条消息的推送流程结束。
4.3、存储模型设计
了解 IM 服务最快的途径就是掌握它的存储模型。
业界主流 IM 服务对于消息、会话、会话与消息的组织关系虽然不尽相同,但是归纳起来主要是两种形式:写扩散读聚合、读扩散写聚合。
所谓读写扩散其实是定义消息在群组会话中的存储形式。如下图所示。
图3:读模式和写模式 ▼
如上图所示:
1)读扩散的场景:消息归属于会话,对应到存储中相当于有张 conversation_message 的表存储着该会话产生的所有消息 (cid->msgid->message,cid 会话 ID、msgid 消息 ID、message 消息),这样实现的好处是消息入库效率高,只存储会话与消息的绑定关系即可;2)写扩散的场景:会话产生的消息投递到类似于个人邮件的收件箱,即 message_inbox 表,存储个人的所有消息(uid->msgid->message, uid 用户 ID、msgid 消息 ID、message 消息),基于这种实现,会话中的每条消息面向不同的接收者可以呈现出不同状态。
DTIM 对 IM 消息的及时性、前后端存储状态一致性要求异常严格,特别对于历史消息漫游的诉求十分强烈,当前业界 IM 产品对于消息长时间存储和客户端历史消息多端漫游都做得不尽如人意,主要是存储成本过高。因此在产品体验与投入成本之间需要找到一个平衡点。
采用读扩散:在个性化的消息扩展及实现层面有很大的约束。
采用写扩散带来的问题也很明显:一个群成员为 N 的会话一旦产生消息就会扩散 N 条消息记录,如果在消息发送和扩散量较少的场景,这样的实现相比于读扩散落地更为简单,存储成本也不是问题。但是 DTIM 会话活跃度超高,一条消息的平均扩散比可以达到 1:30,超大群又是企业 IM 最核心的沟通场景,如果采用完全写扩散所带来存储成本问题势必制约钉钉业务发展。
所以,在 DTIM 的存储实现上,钉钉采取了混合的方案,将读扩散和写扩散针对不同场景做了适配,最终在用户视角系统会做统一合并,如下图所示。
图4:DTIM 读写混合模式 ▼
作为读扩散、写扩散方案的混合形式存在,用户维度的消息分别从 conversation_message 和 message_inbox 表中获取,在应用侧按消息发送时间做排序合并,conversation_message 表中记录了该会话面向所有群成员接收的普通消息 N(Normal),而 message_inbox 表在以下两种场景下被写入:
1)第一种是:定向消息 P(Private,私有消息),群会话中发送的消息指定了接收者范围,那么会直接写入到接收者的 message_inbox 表中,比如红包的领取状态消息只能被红包发送者可见,那么这种消息即被定义为定向消息。
2)第二种是:归属于会话消息的状态转换 NP(Normal to Private,普通消息转私有消息),当会话消息通过某种行为使得某些消息接收者的消息状态发生转换时,该状态会写入到 message_inbox 表中,比如用户在接收侧删除了消息,那么消息的删除状态会写入到 message_inbox 中,在用户拉取时会通过 message_inbox 的删除状态将 conversation_message 中的消息做覆盖,最终用户拉取不到自己已删除的消息。
当用户在客户端发起某个会话的历史消息漫游请求时,服务端根据用户上传的消息截止时间(message_create_time)分别从 conversation_message 表和 message_inbox 表拉取消息列表,在应用层做状态的合并,最终返回给用户合并之后的数据,N、P、NP 三种类型消息在消息个性化处理和存储成本之间取得了很好的平衡。
4.4、同步模型设计
4.4.1 推送模型
用户在会话中发出的消息和消息状态变更等事件是如何同步到端上呢?
业界关于消息的同步模型的实现方案大致有三种:
1)客户端拉取方案;2)服务端推送方案;3)服务端推送位点之后客户端拉取的推拉结合方案。
三种方案各有优劣,在此简短总结:
1)首先:客户端拉取方案的优点是该方案实施简单、研发成本低,是传统的 B/S 架构。劣势是效率低下,拉取间隔控制权在客户端,对于 IM 这种实时的场景,很难设置一个有效的拉取间隔,间隔太短对服务端压力大,间隔太长时效性差;2)其次:服务端主动推送方案的优点是低延迟、能做到实时,最重要的主动权在服务端。劣势相对拉取方案,如何协调服务端和客户端的处理能力存在问题;3)最后:推拉结合这个方案整合了拉和推的优点,但是方案更复杂,同时会比推的方案多一次 RTT,特别是在移动网络的场景下,不得不面临功耗和推送成功率的问题。
DTIM 相对传统 toC 的场景,有较明显的区别:
1)第一是对实时性的要求:在企业服务中,比如员工聊天消息、各种系统报警,又比如音视频中的共享画板,无不要求实时事件同步,因此需要一种低延时的同步方案。
2)第二是弱网接入的能力:在 DTIM 服务的对象中,上千万的企业组织涉及各行各业,从大城市 5G 的高速到偏远的山区弱网,都需要 DTIM 的消息能发送、能触达。对于复杂的网络环境,需要服务端能判断接入环境,并依据不同的环境条件调整同步数据的策略。
3)第三是功耗可控成本可控:在 DTIM 的企业场景中,消息收发频率比传统的 IM 多出一个数量级,在这么大的消息收发场景怎么保障 DTIM 的功耗可控,特别是移动端的功耗可控,是 DTIM 必须面对的问题。在这种要求下,就需要 DTIM 尽量降低 IO 次数,并基于不同的消息优先级进行合并同步,既能要保障实时性不被破坏,又要做到低功耗。
从以上三点可知,服务端主动推送的模型更适合 DTIM 场景:
1)首先可以做到极低的延时,保障推送耗时在毫秒级别;2)其次是服务端能通过用户接入信息判断用户接入环境好坏,进行对应的分包优化,保障弱网链路下的成功率;3)最后是主动推送相对于推拉结合来说,可以降低一次 IO,对 DTIM 这种每分钟过亿消息服务来说,能极大的降低设备功耗,同时配合消息优先级合并包的优化,进一步降低端的功耗。
虽说主动推送有诸多优势,但是客户端会离线,甚至客户端处理速度无法跟上服务端的速度,必然导致消息堆积。
DTIM 为了协调服务端和客户端处理能力不一致的问题,支持 Rebase 的能力,当服务端消息堆积的条数达到一定阈值时触发 Rebase,客户端会从 DTIM 拉取最新的消息,同时服务端跳过这部分消息从最新的位点开始推送消息。DTIM 称这个同步模型为推优先模型(Preferentially-Push Model,PPM)。
在基于 PPM 的推送方案下,为了保障消息的可靠达到,DTIM 还做一系列优化。
这些优化具体是:
1)支持消息可重入:服务端可能会针对某条消息做重复推送,客户端需要根据 msgId 做去重处理,避免端上消息重复展示。
2)支持消息排序:服务端推送消息特别是群比较活跃的场景,某条消息由于推送链路或者端侧网络抖动,推送失败,而新的消息正常推送到端侧,如果端上不做消息排序的话,消息列表就会发生乱序,所以服务端会为每条消息分配一个时间戳,客户端每次进入消息列表就是根据时间戳做排序再投递给 UI 层做消息展示。
3)支持缺失数据回补:在某个极端情况下客户端群消息事件比群创建事件更早到达端上,此时端上没有群的基本信息消息也就无法展现,所以需要客户端主动向服务端拉取群信息同步到本地,再做消息的透出。
4.4.2 多端数据一致性
多端数据一致性问题一直是多端同步最核心的问题,单个用户可以同时在 PC、Pad 以及 Mobile 登录,消息、会话红点等状态需要在多端保持一致,并且用户更换设备情况下消息可以做全量的回溯。
基于上面的业务诉求以及系统层面面临的诸多挑战,钉钉自研了同步服务来解决一致性问题。
钉钉的同步服务的设计理念和原则如下:
1)统一消息模型抽象,对于 DTIM 服务产生的新消息以及已读事件、会话增删改、多端红点清除等事件统一抽象为同步服务的事件;2)同步服务不感知事件的类型以及数据序列化方式。同步服务为每个用户的事件分配一个自增的 ID(注:这里非连续递增),确保消息可以根据 ID 做遍历的有序查询;3)统一同步队列,同步服务为每个用户分配了一个 FIFO 的队列存储,自增 id 和事件串行写入队列;当有事件推送时,服务端根据用户当前各端在线设备状态做增量变更,将增量事件推送到各端;4)根据设备和网络质量的不同可以做多种分包推送策略,确保消息可以有序、可靠、高效的发送给客户端。
上面介绍了 DTIM 的存储模型以及同步模型的设计与思考:
1)在存储优化中,存储会基于 DTIM 消息特点进行深度优化,并会对其中原理以及实现细节做深入分析与介绍;
2)在同步机制中,会进一步介绍多端同步机制是如何保障消息必达以及各端消息一致性。
五、消息存储设计
DTIM 底层使用了表格存储作为消息系统的核心存储系统,表格存储是一个典型 LSM 存储架构,读写放大是此类系统的典型问题。
LSM 系统通过 Major Compaction 来降低数据的 Level 高度,降低读取数据放大的影响。在 DTIM 的场景中,实时消息写入超过百万 TPS,系统需要划归非常多的计算资源用于 Compaction 处理,但是在线消息读取延迟毛刺依旧严重。
在存储的性能分析中,我们发现如下几个特点:
1)6% 的用户贡献了 50% 左右的消息量,20% 的用户贡献了 74% 的消息量。高频用户产生的消息远多于低频用户,在 Flush MemTable 时,高频用户消息占据了文件的绝大部分;2)对于高频的用户,由于其“高频”的原因,当消息进入 DTIM,系统发现用户设备在线(高概率在线),会立即推送消息,因此需要推送的消息大部分在内存的 MemTable 中;3)高频用户产生大量的消息,Compaction 耗费了系统大量的计算和 IO 资源;4)低频的用户消息通常散落在多个文件当中。
从上面的四个表现来看,我们能得出如下结论:
1)绝大部分 Compaction 是无效的计算和 IO,由于大量消息写入产生大量的文件,但是高频的用户消息其实已经下推给用户的设备,Compaction 对读加速效果大打折扣。反而会抢占计算资源,同时引起 IO 抖动;2)低频用户由于入库消息频率低,在 Flush 之后的文件中占比低;同时用户上线频率低,期间会累计较多的待接收的消息,那么当用户上线时,连续的历史消息高概率散落在多个文件当中,导致遍历读取消息毛刺,严重的有可能读取超时。
为了解决此类问题,我们采用分而治之方法,将高频用户和低频用户的消息区别对待。
我们借鉴了 WiscKey KV 分离技术的思想,就是将到达一定阈值的 Value 分离出来,降低这类消息在文件中的占比进而有效的降低写放大的问题。
附:WiscKey KV原始论文附件下载:
WiscKey:Separating Keys from Values in SSD-conscious Storage(52im.net).pdf (2.24 MB)
但是 WiscKey KV 分离仅考虑单 Key 的情况,在 DITM 的场景下,Key 之间的大小差距不大,直接采用这种 KV 分离技术并不能解决以上问题。因此我们在原有 KV 分离的基础上,改进了 KV 分离,将相同前缀的多个 Key 聚合判断,如果多个 Key 的 Value 超过阈值,那么将这些 Key 的 Value 打包了 value-block 分离出去,写入到 value 文件。
数据显示:上述方法能够在 Minor Compaction 阶段将 MemTable 中 70% 的消息放入 value 文件,大幅降低 key 文件大小,带来更低的写放大;同时,Major Compaction 可以更快降低 key 文件数,使读放大更低。高频用户发送消息更多,因此其数据行更容易被分离到 value 文件。读取时,高频用户一般把最近消息全部读出来,考虑到 DTIM 消息 ID 是递增生成,消息读取的 key 是连续的,同一个 value-block 内部的数据会被顺序读取,基于此,通过 IO 预取技术提前读取 value-block,可以进一步提高性能。对于低频用户,其发送消息较少,K-V 分离不生效,从而减少读取时候 value 文件带来的额外 IO。
图5:KV分离和预读取 ▼
六、多端同步机制设计
6.1、概述
DTIM 面向办公场景,和面向普通用户的产品在服务端到客户端的数据同步上最大的区别是消息量巨大、变更事件复杂、对多端同步有着强烈的诉求。
DTIM 基于同步服务构建了一套完整同步流程。同步服务是一个服务端到客户端的数据同步服务,是一套统一的数据下行平台,支撑钉钉多个应用服务。
图6:微服务架构 ▼
同步服务是一套多端的数据同步服务,由两部分组成:
1)部署于服务端的同步服务;2)由客户端 APP 集成的同步服务 SDK。
工作原理类似于MQ消息队列:
1)用户 ID 近似消息队列中的 Topic;2)用户设备近似消息队列中的 Consumer Group。
每个用户设备作为一个消息队列消费者能够按需获得这个用户一份数据拷贝,从而实现了多端同步诉求。
当业务需要同步一个变更数据到指定的用户或设备时:业务调用数据同步接口,服务端会将业务需要同步的数据持久化到存储系统中,然后当客户端在线的时候把数据推送给客户端。每一条数据入库时都会原子的生成一个按用户维度单调递增的位点,服务端会按照位点从小到大的顺序把每一条数据都推送至客户端。
客户端应答接收成功后:更新推送数据最大的位点到位点管理存储中,下次推送从这个新的位点开始推送。同步服务 SDK 内部负责接收同步服务数据,接收后写入本地数据库,然后再把数据异步分发到客户端业务模块,业务模块处理成功后删除本地存储对应的内容。
在上文章节中,已经初步介绍同步服务推送模型和多端一致性的考虑,本章主要是介绍 DTIM 是如何做存储设计、在多端同步如何实现数据一致性、最后再介绍服务端消息数据堆积技术方案 Rebase。
* 推荐阅读:如果您对消息同步机制没有概念,可以先行阅读《浅谈移动端IM的多点登陆和消息漫游原理》。
6.2、全量消息存储逻辑
在同步服务中,采用以用户为中心,将所有要推送给此用户的消息汇聚在一起,并为每个消息分配唯一且递增的 PTS(即位点,英文术语Point To Sequence),服务端保存每个设备推送的位点。
通过两个用户 Bob 和 Alice,来实际展示消息在存储系统中存储的逻辑形态。例如:Bob 给 Alice 发送了一个消息”Hi! Alice“,Alice 回复了 Bob 消息”Hi! Bob“。
当 Bob 发送第一条消息给 Alice 时,接收方分别是 Bob 和 Alice,系统会在 Bob 和 Alice 的存储区域末尾分别添加一条消息,存储系统在入库成功时,会分别为这两行分配一个唯一且递增的位点(Bob 的位点是 10005,Alice 的位点是 23001);入库成功之后,触发推送。比如 Bob 的 PC 端上一次下推的位点是 10000,Alice 移动端的推送位点是 23000,在推送流程发起之后,会有两个推送任务,第一是 Bob 的推送任务,推送任务从上一次位点(10000) + 1 开始查询数据,将获取到 10005 位置的”Hi“消息,将此消息推送给 Bob 的设备,推送成功之后,存储推送位点(10005)。Alice 推送流程也是同理。Alice 收到 Bob 消息之后,Alice 回复 Bob,类似上面的流程,入库成功并分配位点(Bob 的位点是 10009,Alice 的位点是 23003)。
图7:同步服务的存储设计 ▼
6.3、消息多端同步逻辑
多端同步是 DTIM 的典型特点,如何保持多端的数据及时触达和解决一致性是 DTIM 同步服务最大的挑战。
上文中已经介绍了同步服务的事件存储模型,将需要推送的消息按照用户聚合。当用户有多个设备时,将设备的位点保存在位点管理系统之中,Key 是用户 + 设备 ID,Value 是上一次推送的位点。如果是设备第一次登录,位点默认为 0。
由此可知:每个设备都有单独的位点,数据在服务端只有一份按照用户维度的数据,推送到客户端的消息是服务端对应位点下的快照,从而保障了每个端的数据都是一致的。
比如:此时 Bob 登录了手机(该设备之前登录过钉钉),同步服务会获取到设备登录的事件,事件中有此设备上次接收数据的位点(比如 10000),同步服务会从 10000 + 1(位点)开始查询数据,获取到五条消息(10005~10017),将消息推送给此台手机并更新服务端位点。此时,Bob 手机和 PC 上的消息一致,当 Alice 再次发送消息时,同步服务会给 Bob 的两台设备推送消息,始终保持 Bob 两个设备之间消息数据的一致性。
6.4、大量需同步离线消息的优化逻辑
正如上文所述:我们采用了推优先的模型下推数据以保障事件的实时性,采用位点管理实现多端同步,但是实际情况却远比上面的情况复杂。
最常见的问题:就是设备离线重新登录,期间该用户可能会累计大量未接收的消息数据,比如几万条。如果按照上面的方案,服务端在短时间会给客户端推送大量的消息,客户端 CPU 资源极有可能耗尽导致整个设备假死。
其实对于 IM 这种场景来说:几天甚至几小时之前的数据,再推送给用户已经丧失即时消息的意义,反而会消耗客户移动设备的电量,得不偿失。又或者节假日大群中各种活动,都会有大量的消息产生。
对于以上情况:同步服务提供 Rebase 的方案,当要推送的消息累计到一定阈值时,同步服务会向客户端发送 Rebase 事件,客户端收到事件之后,会从消息服务中获取到最新的消息(Lastmsg)。这样可以跳过中间大量的消息,当用户需要查看历史消息,可以基于 Lastmsg 向上回溯,即省电也能提升用户体验。
还是以 Bob 为例:Bob 登录了 Pad 设备(一台全新的设备),同步服务收到 Pad 登录的事件,发现登录的位点为 0,查询从 0 开始到当前,已经累计 1 万条消息,累计量大于同步服务的阈值,同步服务发送 Rebase 事件给客户端,客户端从消息服务中获取到最新的一条消息“Tks !!!”,同时客户端从同步服务中获取最新的位点为 10017,并告诉同步服务后续从 10017 这个位置之后开始推送。当 Bob 进入到和 Alice 的会话之后,客户端只要从 Lastmsg 向上回溯几条历史消息填满聊天框即可。
七、高可用设计
7.1、概述
DTIM 对外提供 99.995% 的可用性 SLA,有上百万的组织将钉钉作为自身数字化办公的基础设施,由于其极广的覆盖面,DTIM 些许抖动都会影响大量企业、机构、学校等组织,进而可能形成社会性事件。因此,DTIM 面临着极大的稳定性挑战。
高可用是 DTIM 的核心能力。对于高可用,需要分两个维度来看,首先是服务自我防护,在遇到流量洪峰、黑客攻击、业务异常时,要有流量管控、容错等能力,保障服务在极端流量场景下还有基本服务的能力。其次是服务扩展能力,比如常见的计算资源的扩展、存储资源的扩展等,资源伴随流量增长和缩减,提供优质的服务能力并与成本取得较好的平衡。
7.2、自我防护
7.2.1 背景
DTIM 经常会面临各种突发大流量,比如万人大群红包大战、早高峰打卡提醒、春节除夕红包等等都会在短时间内产生大量的聊天消息,给系统带来很大的冲击,基于此我们采用了多种措施。
首先是流量管控,限流是保护系统最简单有效的方式。DTIM 服务通过各种维度的限流来保护自身以及下游,最重要的是保护下游的存储。在分布式系统中存储都是分片的,最容易出现的是单个分片的热点问题,DTIM 里面有两个维度的数据:用户、会话 (消息属于会话), 分片也是这两个维度,所以限流采用了会话、用户维度的限流,这样既可以保护下游存储单个分区,又可以一定程度上限制整体的流量。要控制系统的整体流量, 前面两个维度还不够,DTIM 还采用了客户端类型、应用 (服务端 IM 上游业务) 两个维度的限流,来避免整体的流量上涨对系统带来的冲击。
其次是削峰平谷。限流简单有效,但是对用户的影响比较大。在 DTIM 服务中有很多消息对于实时性要求不高,比如运营推送等。对于这些场景中的消息可以充分利用消息系统异步性的特点,使用异步消息队列进行削峰平谷,这样一方面减少了对用户的影响,另一方面也减轻对下游系统的瞬时压力。DTIM 可以根据业务类型 (比如运营推送)、消息类型 (比如点赞消息) 等多种维度对消息进行分级,对于低优先级的消息保证在一定时间 (比如 1 个小时) 内处理完成。
最后是热点优化。DTIM 服务中面临着各种热点问题,对于这些热点问题仅仅靠限流是不够的。比如通过钉钉小秘书给大量用户推送升级提醒,由于是一个账号与大量账号建立会话,因此会存在 conversation_inbox 的热点问题,如果通过限速来解决,会导致推送速度过慢、影响业务。对于这类问题需要从架构上来解决。
总的来说,主要是两类问题:大账号和大群导致的热点问题。对于大账户问题,由于 conversation_inbox 采用用户维度做分区,会导致系统账号的请求都落到某个分区,从而导致热点。解决方案为做热点拆分,既将 conversation_inbox 数据合并到 conversation_member 中 (按照会话做分区),将用户维度的操作转换为会话维度的操作,这样就可以将系统账号的请求打散到所有分区上, 从而实现消除热点。对于大群问题,压力来自大量发消息、消息已读和贴表情互动,大量的接收者带来极大的扩散量。所以我们针对以上三个场景,分而治之。
7.2.2 计算延迟与按需拉取
对于消息发送,一般的消息对于群里面所有人都是一样的,所以可以采用读扩散的方式,即不管多大的群,发一条消息就存储一份。另一方面,由于每个人在每个会话上都有红点数和 Lastmsg, 一般情况下每次发消息都需要更新红点和 Lastmsg,但是在大群场景下会存在大量扩散,对系统带来巨大的压力。我们的解决方案为,对于大群的红点和 Lastmsg,在发消息时不更新,在拉首屏时实时算,由于拉首屏是低频操作且每个人只有一到两个大群,实时计算压力很小,这样高峰期可以减少 99.99 % 的存储操作, 从而解决了大群发消息对 DTIM 带来的冲击。
7.2.3 请求合并
在大群发消息的场景中,如果用户都在线,瞬时就会有大量已读请求,如果每个已读请求都处理,则会产生 M*N(M 消息条数,N 群成员数) 的扩散,这个扩散是十分恐怖的。
DTIM 的解决方案是客户端将一个会话中的多次已读进行合并,一次性发送给服务端,服务端对于每条消息的已读请求进行合并处理,比如 1 分钟的所有请求合并为 1 次请求。在大群中,进行消息点赞时,短时间会对消息产生大量更新,再加上需要扩散到群里面的所有人,系统整体的扩散量十分巨大。我们发现,对于消息多次更新的场景,可以将一段时间里面多次更新合并,可以大大减少扩散量,从实际优化之后的数据来看,高峰期系统的扩散量同比减少 96%。
即使完全做到以上几点,也很难提供当前承诺的 SLA,除了防止自身服务出现问题以外,还必须实现对依赖组件的容灾。我们整体采用了冗余异构存储和异步队列与 RPC 相结合的方案,当任意一类 DTIM 依赖的产品出现问题时, DTIM 都能正常工作,由于篇幅问题,此处不再展开。
7.3、水平扩展能力
对于服务的弹性扩展能力,也需要分两个维度来看:
1)首先:服务内部的弹性扩展,比如计算资源的扩展、存储资源的扩展等,是我们通常构建弹性扩展能力关注的重点方向;2)其次:跨地域维度的扩展,服务能根据自身需要,在其他区域扩展一个服务集群,新的服务集群承接部分流量,在跨地域层面形成一个逻辑统一的分布式服务,这种分布式服务我们称之为单元化。
7.3.1 弹性应用架构
对于 DTIM 的扩展性,因为构建和生长于云上,在弹性扩展能力建设拥有了更多云的特点和选择。
对于计算节点:应用具备横向扩展的能力,系统能在短时间之内感知流量突增进而进行快速扩容,对于上文提到的各种活动引起的流量上涨,能做到轻松应对。同时,系统支持定时扩容和缩容,在系统弹性能力和成本之间取得较好的平衡。
对于存储:DTIM 底层选择了可以水平扩展的 Serverless 存储服务,存储服务内部基于读写流量的大小进行动态调度,应用上层完全无感知。对于服务自身的扩展性,我们还实施了不可变基础设施、应用无状态、去单点、松耦合、负载均衡等设计,使 DTIM 构建出了一套高效的弹性应用架构。
7.3.2 弹性地域级扩展(单元化)
在应用内部实现了高效弹性之后,伴随着业务流量的增长,单个地域已经无法满足 DTIM 亿级别 DUA 的弹性扩展的需求。由于 DTIM 特点,所有用户都可以在添加好友之后进行聊天,这就意味着不能简单换个地域搭建一套孤岛式的 DTIM。
为了解决这种规模下的弹性能力,我们基于云上的地域架构,在一个 Geo 地域内,构建了一套异地多活、逻辑上是一体的弹性架构,我们称之为单元化。下图是 DTIM 的单元化架构。
图8:DTIM单元化架构 ▼:
对于单元化的弹性扩展架构,其中最核心的内容是流量动态调度、数据单地域的自封闭性和单元整体降级。
7.3.3 弹性动态调度
流量路由决定了数据流向,我们可以依托这个能力,将大群流量调度到新的单元来承接急速增长的业务流量,同时实现流量按照企业维度汇聚,提供就近部署能力,进而提供优质的 RT 服务。
业界现在主流的单元化调度方案主要是基于用户维度的静态路由分段,这种方案算法简单可靠,但是很难实现动态路由调度,一旦用户路由固定,无法调整服务单元。
比如:在 DTIM 的场景中,企业(用户)规模是随着时间增长、用户业务规模增长之后,单地域无法有效支撑多个大型企业用户时,传统静态方案很难将企业弹性扩展到其他单元,强行迁移会付出极高的运维代价。因此传统的路由方案不具备弹性调度能力。
DTIM 提供一套全局一致性的高可用路由服务系统 (RoutingService)。服务中存储了用户会话所在单元,消息服务基于路由服务,将流量路由到不同的单元。应用更新路由数据之后,随之路由信息也发生变化。与此同时,路由服务发起数据订正事件,将会话的历史消息数据进行迁移,迁移完成之后正式切换路由。路由服务底层依赖存储的 GlobalTable 能力,路由信息更新完成之后,保障跨地域的一致性。
7.3.4 弹性单元自封闭
数据的单元自封闭是将 DTIM 最重要且规模最大的数据:“消息数据”的接收、处理、持久化、推送等过程封闭在当前单元中,解除了对其他单元依赖,进而能高效地扩充单元,实现跨地域级别高效弹性能力。
要做到业务数据在单元内自封闭,最关键是要识别清楚要解决哪种数据的弹性扩展能力。在 DTIM 的场景下,用户 Profile、会话数据、消息数据都是 DTIM 最核心的资产,其中消息数据的规模远超其他数据,弹性扩展能力也是围绕消息数据的处理在建设。怎么将消息按照单元数据合理的划分成为单元自封闭的关键维度。
在 IM 的场景中,消息数据来自于人与人之间的聊天,可以按照人去划分数据,但是如果聊天的两个人在不同的单元之间,消息数据必然要在两个单元拷贝或者冗余,因此按照人划分数据并不是很好的维度。
DTIM 采用了会话维度划分:因为人和会话都是元数据,数据规模有限,消息数据近乎无限,消息归属于会话,会话与会话之间并无交集,消息处理时并没有跨单元的调用。因此,将不同的会话拆分到不同的单元,保障了消息数据仅在一个单元处理和持久化,不会产生跨单元的请求调用,进而实现了单元自封闭。
7.3.5 弹性单元降级
在单元化的架构中,为了支持服务级别的横向扩展能力,多单元是基本形态。
单元的异常流量亦或者是服务版本维护的影响都会放大影响面,进而影响 DTIM 整体服务。
因此:DTIM 重点打造了单元降级的能力,单一单元失去服务能力之后,DTIM 会将业务流量切换到新的单元,新消息会从正常的单元下推,钉钉客户端在数据渲染时也不会受到故障单元的影响,做到了单元故障切换用户无感知。
八、本文小结
本文通过模型设计、存储优化、同步机制以及高可用等维度,本文全方位地展示了当代企业级 IM 设计的核心。
本文也是对 DTIM 过去一段时间的技术总结,随着用户数的持续增长,DTIM 也在与时俱进、持续迭代和优化,比如支持条件索引进而实现索引加速和成本可控、实现消息位点的连续累加、实现消息按需拉取和高效的完整性校验、提供多种上下行通道,进一步提升弱网下的成功率和体验等。
九、相关文章
[1] 企业级IM王者——钉钉在后端架构上的过人之处
[2] 现代IM系统中聊天消息的同步和存储方案探讨
[3] 钉钉——基于IM技术的新一代企业OA平台的技术挑战(视频+PPT)》
[5] 一套亿级用户的IM架构技术干货(上篇):整体架构、服务拆分等
[6] 一套亿级用户的IM架构技术干货(下篇):可靠性、有序性、弱网优化等
[7] 从新手到专家:如何设计一套亿级消息量的分布式IM系统
[8] 企业微信的IM架构设计揭秘:消息模型、万人群、已读回执、消息撤回等
[9] 全面揭秘亿级IM消息的可靠投递机制
[10] 一套高可用、易伸缩、高并发的IM群聊、单聊架构方案设计实践
[11] 一套海量在线用户的移动端IM架构设计实践分享(含详细图文)
[12] 一套原创分布式即时通讯(IM)系统理论架构方案
学习交流:
- 移动端IM开发入门文章:《新手入门一篇就够:从零开发移动端IM》- 开源IM框架源码:https://github.com/JackJiang2011/MobileIMSDK(备用地址点此)
(本文已同步发布于:http://www.52im.net/thread-4012-1-1.html)
举报/反馈