2020-06-13 14:38:10
字节跳动 TikTok 后端实习二面整体以实习经历和场景设计题为主,时长约 50 分钟,其中实习拷问 20 分钟,场景题 30 分钟。 具体内容如下:
实习经历相关问题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 中,设置合理的过期时间。当缓存过期时,再从数据库中读取最新的数据并更新缓存。
高并发数据查询:
读写分离:将数据库的读操作和写操作分离到不同的服务器上,提高系统的并发处理能力。写操作可以集中在主库上,读操作可以从从库上读取,减轻主库的压力。
使用缓存:如前面所述,使用缓存可以大大提高数据查询的速度。在查询计数数据时,先从缓存中读取,如果缓存中没有再从数据库中读取,并将读取到的数据更新到缓存中。
异步处理:对于一些非实时的查询请求,可以采用异步处理的方式。例如,当用户查询文章的点赞量时,可以先返回一个大致的结果,然后通过异步任务从数据库中获取最新的数据并更新到缓存中。
限流和降级:在高并发场景下,为了防止系统被压垮,可以采用限流和降级的策略。限流可以限制系统的并发访问量,避免过多的请求同时涌入系统;降级可以在系统出现故障或压力过大时,关闭一些非核心功能,保证核心功能的正常运行。
系统健壮性:
数据一致性:保证计数数据在数据库和缓存中的一致性。可以采用双写一致性策略,即在更新数据库的同时更新缓存,或者使用消息队列来保证数据的最终一致性。
容错处理:对系统可能出现的故障进行容错处理,例如数据库连接失败、缓存雪崩等。可以采用备用数据库、缓存预热、熔断机制等方式来提高系统的容错能力。
监控和报警:建立完善的监控系统,实时监控系统的运行状态,包括数据库的性能、缓存的使用情况、接口的响应时间等。当系统出现异常时,及时发出报警信息,以便开发人员及时处理。
备份和恢复:定期对数据库和缓存中的数据进行备份,以防止数据丢失。同时,制定完善的数据恢复方案,在数据丢失时能够快速恢复数据。