淘天集团Java开发工程师面经

面试过程

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

#牛客创作赏金赛#
全部评论
为啥你的项目这么复杂
点赞 回复 分享
发布于 08-16 19:08 上海

相关推荐

自我介绍1:你介绍一下你的实习项目2:这个项目你主要做什么事?3:有哪些功能?你怎么进行测试的?4:接口测试主要做什么?5:你用jmter和postman做接口测试走的什么协议?6:http和https的区别是什么?7:https和http相比怎么保证安全性的?8:stl/tls具体是怎么保障安全性的?9:你测http的那些接口?10:说一下http的协议格式是什么样的?11:http协议是基于udp还是tcp的?12:tcp有了解过吗?例如三次握手,四次挥手,tcp的抓包?13:http的短链接和长连接是什么东西?14:它具体怎么保证短链接在不需要的时候断开连接,在需要的时候建立连接?15:静态方法和类方法的区别?16:mysql中插入数据怎么做?对数据进行排序怎么做?17:group by是干嘛的?怎么用?18:group by只能用来进行分组吗?19:  一个sql语句的执行过程是什么样的?20:连接了解吗?比如左连接,右连接,内连接,交叉连接21:你平时Java代码使用git管理的吗?22:考了一些代码的提交以及拉取的命令23:同时开发情况下,如果发现两个人代码冲突了怎么办?24:算法题:求数组中两个目标数之和,讲了一下思路面试官很专业,几乎没有陈述句,都是反问句,我觉得问的基础但很仔细,也不会出现和某马力一样很生硬的问法,回答了差不多有百分之80-90%但还是挂了,还是我太菜了,体验感不错#牛客解忧铺##牛客在线求职答疑中心##牛客创作赏金赛#
点赞 评论 收藏
分享
不愿透露姓名的神秘牛友
11-07 19:05
已编辑
投票
神州信息 java (n-3)*13 其他
点赞 评论 收藏
分享
6 8 评论
分享
牛客网
牛客企业服务