字节跳动 Tiktok后端实习二面面经

字节跳动 Tiktok后端实习二面面经
最新回答
纵山崖

2020-06-13 14:38:10

字节跳动 TikTok 后端实习二面整体以实习经历和场景设计题为主,时长约 50 分钟,其中实习拷问 20 分钟,场景题 30 分钟。 具体内容如下:

实习经历相关问题
  • 自我介绍:这是面试开场环节,主要目的是让面试官快速了解面试者的基本背景信息,包括教育背景、过往实习经历、技能掌握情况等,为后续深入提问做铺垫。
  • 实习介绍:面试官会让面试者介绍自己所有的实习经历,然后从中挑选一段让面试者仔细讲述。这有助于面试官了解面试者在不同实习中的工作内容、职责和收获,判断其是否具备与岗位相关的经验和能力。
  • 实习业务挑一个最有挑战的介绍:此问题旨在考察面试者面对复杂业务场景时的解决问题能力、思维逻辑以及应对挑战的态度。通过讲述最有挑战的业务,面试官可以了解面试者在遇到困难时是如何分析问题、制定解决方案并最终解决问题的。
  • 实习中用的 TCC 事务介绍下

    TCC 事务概念:TCC(Try-Confirm-Cancel)是一种分布式事务解决方案,它将一个分布式事务拆分为多个本地事务,每个本地事务对应一个 TCC 接口,包括 Try、Confirm 和 Cancel 三个阶段。

    Try 阶段:尝试执行,完成所有业务检查,预留必须的业务资源。例如,在转账业务中,Try 阶段会检查账户余额是否充足,如果充足则冻结转账金额。

    Confirm 阶段:确认执行,真正执行业务,不做任何业务检查,只使用 Try 阶段预留的业务资源。在转账业务中,Confirm 阶段会将冻结的金额从转出账户扣除并转入转入账户。

    Cancel 阶段:取消执行,释放 Try 阶段预留的业务资源。如果 Confirm 阶段执行失败,则需要调用 Cancel 阶段释放冻结的金额。

    适用场景:TCC 事务适用于对一致性要求较高、需要强一致性的分布式系统,如金融交易、订单处理等场景。

    优缺点

    优点

    灵活性高,可以根据业务特点自定义 Try、Confirm 和 Cancel 操作。

    性能较好,因为 Try 阶段只是预留资源,不真正执行业务,减少了锁的持有时间。

    缺点

    实现复杂,需要开发者自己实现三个阶段的逻辑,增加了开发成本。

    对业务侵入性强,需要修改业务代码来支持 TCC 事务。

场景设计题

设计一个计数系统,比如统计一个文章的点赞量、转发量、收藏数。需要考虑怎么设计这个系统,怎么能保证高并发的数据查询,怎么能保证系统的健壮性,不需要写出代码,说思路设计即可。

  • 系统设计思路

    数据存储

    使用数据库:可以选择关系型数据库(如 MySQL)或非关系型数据库(如 Redis)。关系型数据库适合存储结构化数据,保证数据的持久化和一致性;非关系型数据库具有高性能、高并发的特点,适合存储计数数据。

    分库分表:如果数据量很大,可以考虑对数据库进行分库分表,将数据分散到多个数据库或表中,提高系统的扩展性和性能。

    缓存策略:使用缓存来存储计数数据,减少对数据库的查询压力。可以将计数数据缓存在 Redis 中,设置合理的过期时间。当缓存过期时,再从数据库中读取最新的数据并更新缓存。

    高并发数据查询

    读写分离:将数据库的读操作和写操作分离到不同的服务器上,提高系统的并发处理能力。写操作可以集中在主库上,读操作可以从从库上读取,减轻主库的压力。

    使用缓存:如前面所述,使用缓存可以大大提高数据查询的速度。在查询计数数据时,先从缓存中读取,如果缓存中没有再从数据库中读取,并将读取到的数据更新到缓存中。

    异步处理:对于一些非实时的查询请求,可以采用异步处理的方式。例如,当用户查询文章的点赞量时,可以先返回一个大致的结果,然后通过异步任务从数据库中获取最新的数据并更新到缓存中。

    限流和降级:在高并发场景下,为了防止系统被压垮,可以采用限流和降级的策略。限流可以限制系统的并发访问量,避免过多的请求同时涌入系统;降级可以在系统出现故障或压力过大时,关闭一些非核心功能,保证核心功能的正常运行。

    系统健壮性

    数据一致性:保证计数数据在数据库和缓存中的一致性。可以采用双写一致性策略,即在更新数据库的同时更新缓存,或者使用消息队列来保证数据的最终一致性。

    容错处理:对系统可能出现的故障进行容错处理,例如数据库连接失败、缓存雪崩等。可以采用备用数据库、缓存预热、熔断机制等方式来提高系统的容错能力。

    监控和报警:建立完善的监控系统,实时监控系统的运行状态,包括数据库的性能、缓存的使用情况、接口的响应时间等。当系统出现异常时,及时发出报警信息,以便开发人员及时处理。

    备份和恢复:定期对数据库和缓存中的数据进行备份,以防止数据丢失。同时,制定完善的数据恢复方案,在数据丢失时能够快速恢复数据。