一文读懂全球化系统中的日期时间处理问题

动手点关注 干货不迷路 👆

Too long; didn't read:

  1. 大多数应用中,只需要用“绝对时间 DateTime”一种技术实现即可

  2. 后端应统一用 UTC 时间(包括 DB 落盘、接口定义),不应当受用户时区或服务器时区的影响

  3. 前端输入、展示的时间,根据具体业务场景进行时区调整,以及精度调整

  4. 面对不带时间的日期,要明确区分「纪念日」与「精度不高的绝对时间」两种用途,大部分时候你看到的日期是后者,它也应当用“确定时区的 DateTime”来实现

1. 重要性

日期时间的处理,一直是计算机系统中看似简单,实则经常爆雷的问题。

例如,每隔几年,都会爆出的「千年虫问题」的各种变种,通常因为系统在设计之初,没有设计好日期时间的数据存储方式,或者低估了产品设计的生命周期,导致最初选型的数据结构不够用了。

千年虫问题:

年纪大的程序员,都知道千年虫问题。在 2000 年之前,很多系统用 2 位数字表示年份,这样 99 年是它能表达的最大数值。因此 1999 年之后的一年,在这些系统中是没有定义的,甚至可能出现多种奇怪的情况,例如“1900”、“1:00”、“19:0”(为什么?感兴趣的读者可以自己推测)。

如果说,「千年虫」是在时间维度上缺乏前瞻性的设计导致的,那么另一种缺乏前瞻性的问题,是空间维度的,即产品全球化、跨时区带来的问题。

全球化的产品中,如果时间的处理没有遵循统一的标准,会让整个系统充斥着难以理解和维护的时间转换。各种接口的对接文档,都不得不明确说明「这个接口的时间是什么时区的?需要如何处理?」后端服务如果需要跨国部署在多个大洲的机房时,因为服务器的时区不同,需要做大量的改造。

遗憾的是,大多情况下,产品不会一开始就有「全球化」属性。所以在一开始,产研团队都不会重视全球化的设计问题,很容易留下缺乏前瞻性的设计问题。

通常情况下,我们都不鼓励「过度设计」。然而,日期时间的设计,是最不怕「过度」的。这时因为,在技术上实现一个前瞻的时间日期方案,成本并不高;但如果一开始的设计不够,后期的升级和数据迁移工作,却是伤筋动骨的。

2. 如何表达时间和日期?

2.1 时间日期的传递:用字符串

在微服务之间,以及在前后端之间,建议用字符串传递日期时间。字符串清晰易读,易于人工调试,带来的开销通常也完全可以接受。(带大量时间数据的接口,建议考虑用 Unix Timestamp。)

如果用字符串,格式就不要自己发明了。有个非常明确的国际标准:ISO 8601(wikipedia: https://en.wikipedia.org/wiki/ISO_8601)

下面举例是符合规范的常用格式:

  • 仅日期:2022-02-09

  • UTC 日期时间:2022-02-09T12:36:42Z

  • 特定时区的日期时间:2022-02-09T20:36:42+08:00

  • 精度更高的时间:2022-02-09T12:36:42.123456789Z

注意,MySQL 中使用的字符串格式(如 2022-02-09 12:36:42)并不符合规范,不建议使用。

2.2 时间日期的存储:关注 MySQL 中的 DateTime

不同数据库在时间日期相关对象的处理差异很大。这里单说 MySQL,因为坑不小。

MySQL 的 DateTime 数据在存储时并不包含时区信息,因此,在读取时也不会做任何时区的转换。

同时,每个 MySQL 连接会话,都有「会话时区」的概念,但这个概念只影响 MySQL 的 NOW() 等有关当前时间的函数的行为,对数据中已经保存的 DateTime 没有任何影响。

例如:

SET time_zone =  '+00:00' ;
UPDATE tab SET datetime_colume = '2020-01-01 00:00:00';
SET time_zone =  '+08:00' ;  -- 换一个会话时区
SELECT datetime_colume FROM tab;
-- 返回值仍然是 '2020-01-01 00:00:00',和写入的数据一致,和会话时间无关

---------
SET time_zone =  '+00:00' ;
SELECT NOW();   -- 假设返回 '2022-01-01 00:00:00'
UPDATE tab SET datetime_colume = NOW();   -- 存入的是 '2022-01-01 00:00:00'
SET time_zone =  '+08:00' ;  -- 换一个会话时区
SELECT NOW();   -- '2022-01-01 08:00:00' 根据时区变化了
SELECT datetime_colume FROM tab;   -- '2022-01-01 00:00:00' 已经写入的不会变

2.3 时间日期的计算:语言原生的 DateTime 类型

各语言一般都提供了原生的 DateTime 数据类型,以表达绝对的日期时间,并且都支持上面 ISO 8601 规范的解析和格式化。

处理相对时区时,各种语言通常都是使用操作系统的时区数据库,来转化为绝对时区。时区数据库需要在联网情况下,由操作系统负责定时更新。

2.4 万能的 Unix Timestamp

Unix Timestamp 在存储、计算、传递环节都可以使用,可谓万能。它唯独不适合表达纪念日日期。

它通过一个数值表示了一个绝对时间与 Unix Epoch 时间(定义为 1970-01-01T00:00:00Z)的差值秒数。Unix Timestamp 本身已经表达了绝对时间,并不需要时区信息。

使用 Unix Timestamp 时,应特别注意选用合适的数值类型,它会影响时间表示的范围。稍不留神,你就可能种下一个新的千年虫。

  • 用有符号int32,最多表示到 2038 年。MySQL 的 TIMESTAMP 类型也是它,一个千年虫变种

  • 用有符号int64,并使用 9 位 10 进制定点小数位时,就是 Golang 的UnixNano(),可以表示 1678 年至 2262 年

  • 一般不会用浮点数表示,因为浮点数的精度不固定

3. 产品视角的日期时间设计

本着不重不漏的原则,我们可以按如下表格划分产品中的所有日期时间对象:


日期+时间仅时间仅日期
不指明时区,无需根据用户所在时区做转换① 表示本地的确定时间点③ 表示本地重复性时间⑤ 表示纪念日、节日
指明时区,需根据用户所在时区做转换② 表示全球唯一确定时间点④ 表示全球可理解的重复性时间❌ 不存在的场景

下面逐一解释这五种场景。

3.1 表示全球唯一确定时间点(表中的 ②)

信息量包含「年月日-时分秒-时区」。这样,就可以完全确定历史长河中的一个无歧义的时间点。这个时间点是完全客观的,和访问的用户地理位置无关,和服务器的地理位置无关,和什么都无关。

产品表现上,通常会根据查看者所在的时区来重新调整时间的显示。

用途举例:

  • 单个事件发生的时间。如 2022 年冬奥会开幕式的时间:2022 年 2 月 4 日,20 点整,+0800 时区。一个英国人看电视转播预告时,会看到开幕式的转播时间是:2022 年 2 月 4 日中午 12 点整。这体现了根据查看者做时间的转换。

3.2 表示本地的确定时间点(表中的 ①)

包含「年月日-时分秒」,因为没有时区信息,所以它本身并不能确定一个精确的时间点,而是只在特定的情境下才有意义。

所谓特定的情境,是因为业务场景中蕴含了时区的信息,并且是大家公认的共识。因此,本质上它仍然表示了一个绝对时间。在产品表现上,因为对时区的共识,所以不需要根据查看者的时区来调整时间的展示。

用途举例:

  • 在非国际化的产品中,明确知道用户所在的时区,那么去掉时区是最简单的处理方式,可以省去很多麻烦。

  • 对于时区有其他约定俗成的理解。例如:飞机的起飞降落时间,酒店的入住离店时间,一定是按照飞机起落地、酒店坐落地当地时区来表达的。在所有订票网站上,都会按照这个规则显示时间,不论访问的用户身处哪个时区。

3.3 表示重复性时间(表中的 ③ 和 ④)

和前两类相比,去掉了「日期」这个信息,是为了描述重复性的日程。它可以是指明了时区的,也可以不指明时区,而基于人们对时区的共识去理解。

用途举例:

  • 每周三 8:00+0800 开会,如果这可以是个跨国的会议,大家都能理解正确的时间。这时,产品表现上应该注意根据查看者来调整显示。

  • 每周三 8:00 起飞的航班,航班起飞地的时区是蕴含的共识。产品表现中不必根据查看者的时区调整显示。

3.4 纪念日日期(表中的 ⑤)

日期对象几乎只有一个有意义的用途:表示纪念日/节日。它不会包含时区信息。

认为「日期」只能用于「纪念日」,有些绝对了。但我确实查阅了很多资料,也没有看到任何非「纪念日」用途的日期。

例如:

  • 小吴的生日是 3 月 11 日,那么不管他在中国还是美国,都会在 3 月 11 日这一天过生日。

  • 每年 12 月 25 日是西方的圣诞节,各个国家都在 12 月 25 日这一天庆祝,虽然它们并不在同一个时区。

产品体现上,不需要根据时区调整日期的显示。本质上,「纪念日」的逻辑,其实是人脑的不严谨导致的一种习惯,是不严谨、不客观的习惯。不包含时区信息,就是为了满足这种不严谨的习惯。

3.5 区分「纪念日日期」与「精度不高的绝对时间」

上面说过,日期对象不能包含时区。你可能会问,我需要表示“北京时间 2022 年 3 月 22 日”呢?答案是:这不是一个日期,而是一个「精度不高的绝对时间」。

很多情况下,当你想用日期时,其实很可能需要的是个「精度不高的绝对时间」。在飞书人力套件的业务中,经常会遇到这种场景。

例如,一个在美国的同学与一个在日本的同学,都在 2022 年 3 月 22 日这天从公司离职了,由同一个在北京的 HR 办理离职事项。


美国同学(-5:00时区)日本同学(+9:00时区)
员工理解的最后工作日2022-03-22
员工理解的系统中离职生效时间2022-03-23 00:00:00(各自的本地时间)
北京的HR理解的系统中离职生效时间2022-03-23 13:00:00 +08002022-03-22 23:00:00 +0800
服务器执行离职相关系统动作的绝对时间(以UTC计)2022-03-23 05:00:00 UTC2022-03-22 15:00:00 UTC

可见,从我们用户视角理解的「一个事件发生的日期」,其实是我们忽略了时间的精度。在产品全球化之前,我们通过一些默认的简化,忽略了时间精度的问题(例如把时间都填成 00:00:00)。一旦面临产品的全球化,就需要补齐时间、提高精度。

而补齐时间、提高精度的方式,需要根据具体的产品形态具体考虑、明确定义。

例如,在上述离职场景下,就需要按照这个公司对离职的定义来补充,可以是当地时间当天的 23:59:59,也可以是当天下班时间,如 17:00:00。

又比如,对于跨团队的业务,例如一个同学的上级汇报线从一个美国 Leader 转到一个日本 Leader,那么为了避免歧义,通常会约定一个确定的生效时区,如统一按照公司的总部所在地的时间来计算。

57ba511361bfbc5ccb5c071a6a16d681.png

4. 日期时间的技术实现

4.1 确定时区的 DateTime

适用于上面的 ①②③④ 四种场景。

cf714e8ec950a228695296fc1d9d66c9.png

所有后端暴露的接口中的时间对象,全部以 UTC 时间表示。

同时,所有后端在存储、计算、传输时间时,也统一使用 UTC 时间。由于 DB 存储时间时,时区信息会被丢掉,因此应保证丢掉的时区,是大家明确约定清楚的无歧义的,即 UTC。这样一来,DB 中的所有时间字段也都没有歧义。

接口内部产生的时间,例如 CreatedAtUpdatedAt时间,都应该转换为 UTC 再落盘。如果直接使用了 MySQL 的NOW()函数,应确保 MySQL Session 的时区设置正确。

在前端或 BFF 负责处理用户输入的时间,以及展示给客户看到的时间。包括两个步骤:

  1. 处理“精度不高的时间”问题。 比如:员工异动的生效时间,用户只设置到“天”的精度。那么如果不跨国,可以补全用户会话时区的 00:00:00 为精确生效时间;如果跨国,那就看客户如何定义,以及产品给客户怎样的灵活性:例如,可以以客户公司总部所在地的时区的 00:00:00 为精确生效的时间。

  2. 时区转换。 注意,这里不一定是使用用户的会话时区来转换。如前面介绍的飞机火车宾馆的预定时间,就要以预定当地的时区来转换。

上述两点,是一定需要在产品设计中定义清晰的,切忌含糊不清。

不要较真儿抬杠的几点:

  1. 由于历史原因,DB 里已经采用北京时间保存了,那么我们可以约定+0800 时区是我们所有后端接口的时间。只要用一个确定的绝对时区,就不会有歧义,不必非要时 UTC。

  2. 也可以在后端接口的网关层处理时间转换。不要较真那算不算 BFF,我们需要的是,时区转换逻辑应严禁深入到后端的下层去。

4.2 不带时区的 Date

适用于上面的 ⑤,即纪念日场景。

1b6601640a05b88186ee7df6f132357b.png

输入或展示时,都不对日期做任何处理。日期对象直接保存在 DB 中。

只有真正的纪念日有必要用这种方式,应当非常谨慎。例如保存一个联系人的生日时。

5. 关于时区的特殊处理

5.1 时区的不确定性

使用绝对的时差来表示时区,例如:“东 8 区”表示比世界协调时间(UTC)早 8 个小时的时区。这是个客观的时区。

很多时候,我们关注的是一个城市或地区的时区。例如:Asia/Shanghai 表示中国时间;三字母的缩写 EST 表示美国东部标准时间。注意,这些根据地理位置定义的时区的时差是会发生变化的,变化因素包括:可能受到当地政策的影响,或夏令时影响。

对于历史的时间,地理时区是可以确定客观时区的,因为没有人会重新定义已经过去的时间。

对于未来的时间,地理时区并不能确定客观时区。因此,如果一个未来的事件是按照非绝对时区约定的,那么它很可能变化。并且,我们的产品需要考虑到处理这种变化。

例如,中国员工发起一个“每天早 8 点”的跨国会议,那么在美国,由于夏令时的改变,冬天开会的时间和夏天是不一样的。反之,美国员工发起的一个“每天早 8 点”的跨国会议,由于美国夏令时的变化,对中国员工的时间也是夏天和冬天不一样的。

5.2 夏令时

某些国家在夏天,会把时间调快一小时(提前一小时)。这表现为,同一个地区,在冬天和夏天用不同的绝对时区。

这样做,是因为夏天白天很长,调整后会在白天的更早的时段上班,从而下班后有更长的天亮的时间。注意,并不是把 10 点上班调整到 9 点上班,而是全社会重新定义了 10 点提前了一小时。

一个具体的例子,在美国:

在 2021 年 3 月 14 日凌晨 1:59:59 后,下一秒就是凌晨 3:00:00。因此,美国的 2021 年 3 月 14 日凌晨 2:10:00 这个时间实际上不存在。为了兼容,根据 RFC5545,如果日程约在了这个不存在的时间,会认为是 3:10:00。

在 2021 年 11 月 7 日凌晨 1:59:59 后,下一秒是凌晨 1:00:00。因此,美国的 2021 年 11 月 7 日凌晨 1:10:00 这个时间实际上会出现两次。为了避免歧义,根据 RFC5545,看到这个时间时,会认为是靠前的时间点。因此,除非用别国的时区来约日程,否则,美国老板是不可能约你在重叠的第二个小时内开会的。

6. 阅读更多及参考文献

  1. Wikipedia: ISO8601 - 用字符串表达各种时间对象的标准

https://en.wikipedia.org/wiki/ISO_8601

  1. RFC3339 - 互联网上关于时间和日期实现的通用建议

https://www.rfc-editor.org/rfc/rfc3339

  1. RFC5545 - iCalendar 互联网日历应用的规范

https://datatracker.ietf.org/doc/html/rfc5545

  1. Stackoverflow: Daylight saving time and time zone best practices [closed] - 技术实现建议

https://stackoverflow.com/questions/2532729/daylight-saving-time-and-time-zone-best-practices

  1. Stackoverflow: How to store repeating dates keeping in mind daylight saving time - 技术实现建议

https://medium.com/@vivekmadurai/how-to-deal-with-date-and-time-across-time-zones-39b1bd747f35

  1. Medium: How to Deal with Date and Time across Time Zones - 技术实现建议

https://medium.com/@vivekmadurai/how-to-deal-with-date-and-time-across-time-zones-39b1bd747f35

  1. Microsoft365: Behavior and format options of the Date and Time field - 微软的时间和日期字段的文档

https://docs.microsoft.com/en-us/dynamics365/customerengagement/on-premises/customize/behavior-format-date-time-field?view=op-9-1

  1. Time Change 2021 in the United States - 美国 2021 年夏令时的调整方式

https://www.timeanddate.com/time/change/usa?year=2021

(上下滑动查看全部)

加入我们

我们来自字节跳动飞书技术团队飞书人力套件团队,目前我们在北京、深圳、上海、武汉、杭州、成都、广州、三亚都设立了办公区域。我们关注的产品领域主要在企业经验管理软件上,包括飞书 OKR、飞书绩效、飞书招聘、飞书人事等 HCM 领域系统,也包括飞书审批、OA、法务、财务、采购、差旅与报销等系统。欢迎加入我们。

开发工程师/资深后端开发工程师

职位描述

  1. 负责企业 SaaS 产品的后端架构设计与研发,为海内外租户及用户提供优质的信息服务和极致体验;

  2. 参与产品需求的讨论和规划、功能定义等,帮助职能部门梳理业务思路,固化工作流,提高效率;

  3. 协助团队攻克各种大数据、高并发、数据隔离等方面的技术难点攻坚;

  4. 参与制定团队研发流程规范,帮助团队落地并提升整体的研发质量;

职位要求

  1. 本科及以上学历,计算机、通信等相关专业,五年以上工作经验;

  2. 熟练掌握 Linux 环境下的 Go/Python/C/C++/Java 等 1 至 2 种以上语言;

  3. 扎实的技术基础,了解微服务架构的技术挑战,并有对应的解决方案;

  4. 较好的产品意识,愿意将产品效果做为工作最重要的驱动因素;

  5. 熟悉业务架构设计理论,熟悉行业常见的架构方案;

  6. 积极乐观,认真负责,乐于协作。

内推码

2f0ee7a5be997cf6ea5a83795870dda5.png

官网投递:

https://jobs.bytedance.com/referral/pc/position/detail/?token=MTsxNjUwNjE3NDE3MjM4OzY5NDg5NzU0ODAyNjM0MTEyMzA7NzA1MDM3MjgzOTc4ODc3NTY5NA

7e234677a79a1118c393e014f01e8aa4.png  点击“阅读原文”了解更多岗位!

相关推荐

2024 抖音欢笑中国年(五):Wasm、WebGL 在互动技术中的创新应用

前言随着 Web 前端技术的不断发展,越来越多的新兴技术方案被引入到 Web 开发中,其中 Wasm 和 WebGL 作为前端领域的两大利器,为开发者带来了更多的可能性。本文将结合2024 年抖音欢笑中国年的部分项目,重点介绍如何利用 Wasm 和 WebGL 对目前流行的一些前端互动技术(比如 Lottie、渲染引擎、动画图片等)进行创新和实践,利用 Wasm 和 WebGL 等新技术方案的特性...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(四):渲染技术实践与探索

作者:陈瑞、欧阳浩铸、王武俊、倪梵云前言抖音在2024年春节期间推出了欢笑中国年系列活动,为用户带来了全新的体验和乐趣。而SAR Creator则为该项目研发工作提供了重要的技术支持。SAR Creator是一款基于 Typescript 的高性能、轻量化的互动解决方案,目前支持了浏览器和跨端框架平台,服务于字节内部的各种互动业务。这些绚烂多彩的互动场景当然也离不开实时渲染技术的支持,因此本文将专...

字节跳动技术团队官方博客 2万+

2024 抖音欢笑中国年(三):编辑器技巧与实践

前言本次春节活动中,我们大部分场景使用内部的 SAR Creator互动方案来实现。SAR Creator 是一款基于 TypeScript 的高性能、轻量化的互动解决方案,目前支持了Web和字节内部跨端框架平台,服务于字节内部的各种互动业务,包括但不限于抖音春节、抖音直播礼物、抖音UG活动等。SAR Creator 编辑器支持了图形化界面,提供了各类完善的系统(光照、动画、脚本等)供用户快速便捷...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(二):AnnieX互动容器创新玩法解析

本文基于24年抖音春节活动业务背景,介绍了字节跨端容器AnnieX在游戏互动套件上的探索,致力于提升容器在游戏互动场景的优化能力。业务背景AnnieX作为字节一方游戏统一容器,服务字节内部电商、直播、UG等跨端场景业务。在字节一方游戏互动场景,有大量的一方游戏业务对容器有特定的流量、端能力和游戏优化的诉求。因此我们不断深入互动游戏业务特点,为字节游戏提供完善游戏端能力和流量运营能力,同时提供游戏互...

字节跳动技术团队官方博客 1万+

2024 抖音欢笑中国年(一):招财神龙互动技术揭秘

字节跳动旗下的抖音等 App 在 2024 年春节期间推出了欢笑中国年系列活动,在实现增长业务目标的同时,为用户带来了全新的体验和乐趣。「招财神龙」是其中的一个重要玩法。前言本次春节活动,使用到了字节内的主要前端、跨端、互动技术产品。主要涉及:跨端框架提供了首屏直出的方案使其具有较短的首屏时间,能够大大提升业务加载成功率。跨端框架也提供了 Canvas 作为 SAR Creator 等渲染引擎的...

字节跳动技术团队官方博客 1万+

Monorepo 解决方案 — 基于 Bazel 的 Xcode 性能优化实践

背景介绍书接上回《Monorepo 解决方案 — Bazel 在头条 iOS 的实践》,在头条工程切换至 Bazel 构建系统后,为了支持用户使用 Xcode 开发的习惯,我们使用了开源项目 Tulsi 作为生成工具,用于将 Bazel 工程转换为 Xcode 工程。但是在使用的过程中,我们发现了一些问题,其中影响较大的是,Xcode 工程卡顿:对于头条这种大型项目来说,Xcode 卡顿一直是本地...

字节跳动技术团队官方博客 1万+

抖音 ANR 自动归因平台建设实践

背景介绍本文在 2024 年初最新一期『抖音客户端基础技术大揭秘』技术沙龙活动中已做过专题分享,本次将内容重新整理文章进行分享。公众号后台回复技术沙龙可查看沙龙回放及 PPT~抖音作为一个超大型的应用,我们在 ANR 问题治理上面临着很大的挑战。首先对于存量问题的优化,由于缺少有效的归因手段,一些长期的疑难问题一直难以突破解决,例如长期位于 Top 1 的 nativePollOnce 问题。同时...

字节跳动技术团队官方博客 2万+

CVPR 2024 | CAMixerSR 动态注意力分配的超分辨率加速框架

背景随着相关技术和应用的发展,比如超高清屏幕、虚拟现实(VR)等沉浸式体验的增加,用户对超高分辨率图像和视频的需求变得越来越强烈。在这些场景中,图像的质量和清晰度对于提供最佳的用户体验至关重要。超高分辨率不仅能提供更清晰、更真实的视觉效果,还能在一定程度上增强人们的互动和沉浸感,在一些VR场景中我们需要8K甚至16K的才可以满足需求。然而要生成或者处理这些超高分辨率的内容,对算力的要求也是与日增长...

字节跳动技术团队官方博客 1万+

CVPR 2024 | Modular Blind Video Quality Assessment:模块化无参视频质量评估

无参视频质量评估 (Blind Video Quality Assessment,BVQA) 在评估和改善各种视频平台并服务用户的观看体验方面发挥着关键作用。当前基于深度学习的模型主要以下采样/局部块采样的形式分析视频内容,而忽视了实际空域分辨率和时域帧率对视频质量的影响,随着高分辨率和高帧率视频投稿逐渐普及,特别是跨分辨率/帧率视频转码档位画质评估场景中,这种影响变得更加不可忽视。在本文中,我们...

字节跳动技术团队官方博客 1万+

2024 AI & 前端:回首展望,光芒未至,破晓之前!

前言回望 2023 年,ChatGPT 的突然爆火,让 AI 无疑成为最为值得注目的新兴领域之一,我们也一起见证了生成式 AI 的寒武纪大爆发。这一年来,国内外的生成式 AI 、大模型和相关产品以令人眼花缭乱的速度更新迭代,新的创业浪潮风起云涌。在这 AI 浪潮下,也让我们有了新的开发思考,探索着在各个环节中“前端 & AI”的应用场景。勇于探索的前端开发者们已经开始挥舞着 AI 的“魔法...

字节跳动技术团队官方博客 1万+

Kotlin 云端差分缓存技术

本文由字节跳动 Buildinfra 团队出品。在我们的工程上线 Monorepo 全源码后,Kotlin 编译成了整个编译中最耗时的步骤,全源码过程中大量的 BuildCache Miss 导致我们的编译数据落后原来多仓二进制时代很多,且业界没有相关的解决方案。本篇文章我们来具体阐述下 BuildInfra 团队自研的解决方案 - Kotlin 云端差分方案的原理和技术实现。一、Monorepo...

字节跳动技术团队官方博客 1万+

字节跳动基础架构SRE-Copilot获得2023 CCF国际AIOps挑战赛冠军

近日,2023 CCF国际AIOps挑战赛决赛暨“大模型时代的AIOps”研讨会在北京成功举办,活动吸引了来自互联网、运营商、科研院所、高校、软硬件厂商等领域多名专家学者参与,为智能运维的前沿学术研究、落地生产实践打开了新思路。决赛中,从初赛两百多支队伍中脱颖而出的十支入围队伍分别展示了各自的方案,并进行了现场答辩,评审专家从选题方向、创新性、实用性、完整度和实验复现结果等多角度进行了综合评定,最...

字节跳动技术团队官方博客 2万+

字节跳动百万级Metrics Agent性能优化的探索与实践

背景metricserver2 (以下简称Agent)是与字节内场时序数据库 ByteTSD 配套使用的用户指标打点 Agent,用于在物理机粒度收集用户的指标打点数据,在字节内几乎所有的服务节点上均有部署集成,装机量达到百万以上。此外Agent需要负责打点数据的解析、聚合、压缩、协议转换和发送,属于CPU和Mem密集的服务。两者结合,使得Agent在监控全链路服务成本中占比达到70%以上,对Ag...

字节跳动技术团队官方博客 1万+

西瓜视频RenderThread引起的闪退问题攻坚历程

背景影响西瓜之前存在过一类RenderThread闪退,从堆栈上看,全部都是系统so调用,给人的第一印象像是一个系统bug,无从下手。闪退集中在Android 5~6上,表现为打开直播间立即闪退。该问题在2022年占据Native Crash Top5,2023年更是上升到到Top1。因此有必要投入时间和精力再重新审视一下这个问题。在历经多周的源码分析和排查后,逐步明确了问题根因并修复,最终取得了...

字节跳动技术团队官方博客 2万+

字节电商双11 大促容量保障是如何做的?

前言Rhino 简介Rhino是字节自研全链路容量评估产品,致力于构建完整的全链路容量评估解决方案(覆盖:容量预估->资源准备->数据准备->容量验证->监控->分析->决策->处理反馈);围绕容量在稳定性、成本、效率 三方面提供业务全方位基础支撑。Rhino 目前已经成为字节各业务容量评估主流解决方案,并且历年来在业务大型活动稳定性保障中(抖音春节项目、...

字节跳动技术团队官方博客 9万+

使用火山引擎 APMPlus 解决抖音Top 1 Java 崩溃的通用优化方案

背景近3个月,抖音 Android 版面临一个多次触发线上报警的崩溃问题,全量版本和灰度版本的异常数据激增,该问题不仅容易触发报警,更成为了 Java Top 1 崩溃问题,带来巨大困扰,急需攻坚解决。本文展现了具体的分析过程、优化思路和解决方案,同时提供了已集成该方案的实用工具。初步分析多维特征我们以某发版期间数据为例进行分析:机型方面:比较分散,有聚集部分samsung sm-s9180 占比...

字节跳动技术团队官方博客 1万+

用 Addon 增强 Node.js 和 Electron 应用的原生能力

前言Node.js Addon 是 Node.js 中为 JavaScript 环境提供 C/C++ 交互能力的机制。其形态十分类似 Java 的 JNI,都是通过提供一套 C/C++ SDK,用于在 C/C++ 中创建函数方法、进行数据转换,以便 JavaScript / Java 等语言进行调用。这样编写的代码通常叫做 Bindings。此外还有基于 C ABI Calling Convent...

字节跳动技术团队官方博客 2万+

火山引擎 ByteHouse 的增强型数据导入技术实践

作为企业数字化建设的必备要素,易用的数据引擎能帮助企业提升数据使用效率,更好提升数据应用价值,夯实数字化建设基础。数据导入是衡量OLAP引擎性能及易用性的重要标准之一,高效的数据导入能力能够加速数据实时处理和分析的效率。作为一款OLAP引擎,火山引擎云原生数据仓库ByteHouse源于开源ClickHouse,在字节跳动多年打磨下,提供更丰富的能力和更强性能,能为用户带来极速分析体验,支撑实时数据...

字节跳动技术团队官方博客 1万+

打造企业级智能问答系统的秘密:如何使用云数据库 PostgreSQL 版实现向量检索

本文就如何利用火山引擎云数据库 PostgreSQL 版和大语言模型技术(Large Language Model,简称 LLM),实现企业级智能交互式问答系统进行介绍。通过本文,你将会了解交互式问答系统的原理,学习 PostgreSQL 的向量化存储和检索技术,以及大语言模型交互技术等。背景在大数据的浪潮下,众多企业建立了自己的知识库,以便于信息检索和知识查询。然而,随着知识库内容的膨胀,传统的...

字节跳动技术团队官方博客 2万+

抖音大型直播的画质优化实践

面临挑战随着抖音内容生态的不断丰富,越来越多的大型赛事在抖音平台进行直播,世界杯/春晚/亚运会等各项赛事节目引来大量用户观看。卡塔尔世界杯期间,抖音提供的稳定高质直播画面为观众带来了完美的观赛体验,决赛的 PCU 高达 3700W+。不同赛事节目涉及链路众多,且不同赛事之间存在差异,如何保障各链路的画质稳定并进一步提升画质,是一个巨大的挑战。如何应对挑战?画质优化链路大型赛事直播涉及链路较长,不同...

字节跳动技术团队官方博客 2万+

抖音直播新一代BVC编码器正式亮相

面临挑战在直播行业发展如火如荼的今天,用户对视频体验的要求也水涨船高。视频基础体验的关键要素包括清晰度、流畅度、低延迟等,而这些要素的“第一性原理”,就是视频本身的编码效率,也就是压缩率。视频编码是整个技术体系的基座,编码效率的显著提升,能够在同等码率下极大提高画质,从而改善用户体验。视频编码效率的重要性不言而喻,但进一步地提升也并非易事,尤其在直播场景中,对编码速度、延迟、码率控制等方面都有很高...

字节跳动技术团队官方博客 7323

Go Metrics SDK Tag 校验性能优化实践

背景Metrics SDK 是与字节内场时序数据库 ByteTSD 配套的用户指标打点 SDK,在字节内数十万服务中集成,应用广泛,因此 SDK 的性能优化是个重要和持续性的话题。本文主要以 Go Metrics SDK 为例,讲述对打点 API 的 hot-path 优化的实践。用户在使用 SDK API 进行打点时,需要传入指标对应的 Tag:tags:=[]m.T{{Name:"foo...

字节跳动技术团队官方博客 1万+

云上智能驾驶三维重建最佳实践

智能驾驶技术的不断发展,正在改变着我们的出行方式和交通系统。作为其中的一个关键技术,三维重建在智能驾驶系统中起着重要的作用。除去车端本身的感知、重建算法,自动驾驶技术的落地与发展需要庞大的云端重建能力支撑,火山引擎多媒体实验室通过行业领先的自研三维重建技术,结合强大的云平台资源与能力,助力相关技术在云端大规模重建、自动标注、真实感仿真等场景的落地与应用。本文重点介绍火山引擎多媒体实验室三维重建技术...

字节跳动技术团队官方博客 6289

火山引擎实时、低延时拥塞控制算法的优化实践

摘要火山引擎智能拥塞控制算法 VICC(Volcano Intelligent Congestion Control)是一种自适应的拥塞控制算法,旨在解决全球不同网络环境下,不同音视频应用对带宽利用率和延时的差异化要求。它结合了传统拥塞控制算法(如 GCC 和 BBR)的优点,并且能够根据不同的网络条件、业务偏好和码率特征进行自适应调整,包括自适应拥塞响应速度、自适应带宽探测幅度、自适应丢包检测策...

字节跳动技术团队官方博客 6709

veImageX 演进之路:Web 图片加载提速50%

背景说明火山引擎veImageX演进之路主要介绍了veImageX在字节内部从2012年随着字节成长过程中逐步演进的过程,演进中包括V1、V2、V3版本并最终面向行业输出;整个演进过程中包括服务端、客户端、网络库、业务场景与优化等多个角度介绍在图像处理压缩、省成本与体验优化的经验与方案;本篇文章重点介绍在web端演进和提供的能力,图片是 Web 站点中的重要元素,图片体积、格式、分辨率以及渲染方式...

字节跳动技术团队官方博客 6564

自研多模态追踪算法 PICO 为「手柄小型化」找到新思路

作者:张韬、林泽一 、闻超 、赵洋研发背景作为头戴的追踪配件,VR手柄可以通过HMD(头戴显示设备)的inside-out光学追踪定位原理,计算出手柄的空间运动轨迹,同时结合6轴传感器实现6DoF空间定位。与此同时,结合手柄控制器的物理按键、马达反馈、摇杆等,用户还能获得逼真、细腻的触觉反馈,进一步增强虚拟现实人机交互的能力以及沉浸感,这也是目前无手柄方案所难以实现的。目前主流VR手柄的追踪技术方...

字节跳动技术团队官方博客 7692

如何利用播放器节省20%点播成本

点播成本节省的点其实涉及诸多部分,例如:CDN、转码、存储等,而利用播放器降本却是很多客户比较陌生的部分。火山引擎基于内部支撑抖音集团相关业务的实践,播放器恰恰是成本优化中最重要和最为依赖的部分。火山引擎的视频团队做了份数据统计,在一个很经典的视频业务中,我们在2022年至2023年大约1年半的时间里,针对这个业务进行了33次成本优化点,其中13次是播放器主导的优化,其余的有12次也是需要播放器强...

字节跳动技术团队官方博客 6159

火山引擎 ByteHouse:ClickHouse 如何保证海量数据一致性

背景ClickHouse是一个开源的OLAP引擎,不仅被全球开发者广泛使用,在字节各个应用场景中也可以看到它的身影。基于高性能、分布式特点,ClickHouse可以满足大规模数据的分析和查询需求,因此字节研发团队以开源ClickHouse为基础,推出火山引擎云原生数据仓库ByteHouse。在日常工作中,研发人员经常会遇到业务链路过长,导致流程稳定性和数据一致性难保障的问题,这在分布式、跨服务的场...

字节跳动技术团队官方博客 6882

抖音集团都在用的画质评估工具,确定不试试吗?

导读本文从抖音集团内部画质评估体系的建设历程着笔,主要分享了画质评测对于业务的重要性、主要应用场景和内部产品的一些典型实践案例。通过分享业务视角遇到的一些问题和我们的解决思路,希望能抛砖引玉,为遇到类似困扰的伙伴们提供有价值的参考。画质评估体系建设历程为何评测画质如此重要?我们通过线上业务大量实验发现,图片画质优劣对点击率、 停留时长等消费类指标有正相关影响,间接影响用户收益指标。因此,建设一套行...

字节跳动技术团队官方博客 7906

VLDB 2023 | CDSBen: 字节跳动 veDB 数据库存储系统性能测试模型

背景随着业务爆炸式增长与云原生技术的日渐成熟,大量云原生分布式数据库产品如雨后春笋般涌现,其中一部分主打 OLTP 场景的分布式数据库强调的是从计算-存储分离架构获得弹性收益;对于业界各种计算-存储分离架构的数据库而言,怎么用真实的端到端数据库 workload 去 benchmark 其底层存储系统一直存在以下难题:对于数据库专用存储系统,不存在如 fio 一样的“事实标准” benchmark...

字节跳动技术团队官方博客 5882
上一篇: 音乐研发必备:理解 MIDI 协议与标准 MIDI 文件格式
下一篇: 打造 Go 语言最快的排序算法
 字节跳动技术团队
字节跳动技术团队 企业官方账号 企业官方账号
博客等级 码龄7年 8123粉丝 316原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值