淘天集团Java开发工程师面经
面试过程
- 自我介绍面试一开始,面试官让我做了一个简短的自我介绍。
- 项目介绍接下来,面试官让我详细介绍了一个项目,特别是项目的亮点、难点和架构设计。这部分我们聊了大约半个小时。
- 系统设计:商品打标签系统面试官要求我设计一个给商品打标签的系统。系统需要对外提供打标签接口,传入商品ID和标签ID,数据存储在数据库中。考虑到数据量级很大,需要采用分表分库的方式进行存储。具体规则如下:
- 10个数据库实例,每个实例上有100张表。
- 库号计算:
hash(商品ID + "库盐") % 10
- 表号计算:
hash(商品ID + "表盐") % 100
- 为了提高访问速度,加一层缓存,数据存储在Redis中,采用hash结构,key为
"prefix_{商品ID}"
,field为标签ID,value为version。
- 数据流设计面试官问我打标操作的数据流是怎样的。我回答说,首先判断标签是否有效,有效则存入数据库,数据库产生binlog,另一端消费binlog事件,将标签hset到Redis并更新version。
- 应对瞬时流量面试官问如果打标的瞬时流量很大怎么办。我建议将打标接口异步化,外部调用打标接口后,将请求发送到Kafka,按照商品ID hash到对应的partition,Kafka消费端控制消费速度,对数据库进行限流,确保匀速打标,避免数据库崩溃。
- 不同意异步操作的解决方案面试官进一步问如果不接受异步操作怎么办。我提出了两个方案:
- 扩容数据库以抗更高的并发量。
- 先将打标操作写入Redis(因为Redis能承受更高的并发),然后异步存储到数据库中,确保消息不丢失,可以将消息放入Kafka,另一端尽快消费。但需要注意极端情况下,数据在Redis中过期而Kafka未消费到消息时,可能会查不到数据。
#牛客创作赏金赛#