在之前的文章中也介绍了相关微服务的项目开发知识,那么在本文中我将分享一份来自字节跳动相关岗位的面试经历,在其中我们一起来看看面试问题的详细内容,如果有对微服务的感兴趣的朋友们也可以联系我了解我们的微服务项目,也希望该面经能助力求职者在求职道路上顺利前行。

💼岗位职责:

1、负责开发者平台、小游戏 SDK、小游戏中心等业务相关建设;

2、参与海量小游戏及相关开发者生态的稳定性建设;

3、负责多样化业务带来的技术中台化及字节生态下多端的复杂业务抽象;

4、关注技术创新,驱动新业务探索。

📋任职要求:

1、本科及以上学历,计算机、通信等相关专业;

2、有扎实的编程能力,有优秀的设计和代码品位;

3、深刻理解计算机原理, 有良好的数据结构和算法基础;

4、熟悉微服务架构,熟悉 Nginx、Mysql、Redis、消息队列等常用组件,并有能力定制化改进;

5、有高并发服务设计和实现经验优先,有较好的产品意识优先,有游戏行业经验优先;

6、积极乐观,责任心强,工作认真细致,具有良好的团队沟通与协作能力;

7、热爱编程,有较强的学习能力,有强烈的求知欲、好奇心和进取心,能及时关注和学习业界最新技术。

✨面试问题回顾:

1. 自我介绍

2. 说一下项目的系统架构

我们项目采用分层架构,从下往上依次是数据接入层负责数据的收集与导入;业务层进行主要业务逻辑的处理;消息推送层负责消息的推送相关工作;跨领域层处理一些跨越不同领域的事务,同时还有 log 等相关模块用于记录系统运行信息等相关操作。

3. 为什么微服务可以提高 30%的资源利用率

微服务可以提高资源利用率主要原因有以下几点。

  • 首先,微服务可以根据不同业务的需求进行独立的资源分配,避免了传统单体架构中资源过度分配或分配不足的情况。
  • 其次,每个微服务可以独立地进行扩展和收缩,在业务量小的时候减少资源占用,业务量大的时候灵活增加资源。这样能更精准地利用资源,从而提高资源利用率。

4. 微服务拆分,拆分的方法是什么

微服务拆分可以从业务功能角度出发,将具有明确边界的业务功能拆分为独立的微服务,比如将订单管理、用户管理等拆分开。也可以根据数据的关联性进行拆分,如果某些数据在业务上相对独立且与其他数据关联较少,可将相关业务拆分为微服务。还可以从可扩展性方面考虑,把可能需要频繁变动或者独立扩展的部分拆分成单独的微服务。

5. 使用微服务架构其不足之处在哪

微服务架构的不足之处主要在于服务治理的复杂性增加。由于微服务数量众多,服务之间的调用关系复杂,容易出现服务发现、服务注册等方面的问题。另外,数据一致性较难保证,因为数据分布在不同的微服务中,事务管理变得复杂。而且部署和运维成本较高,需要管理多个微服务的部署、监控等工作。

6. 是如何解决这块不足之处的

对于服务治理的复杂性,我们可以采用成熟的服务治理框架,比如 Gozero 等,来简化服务的注册、发现和调用等过程。

在数据一致性方面,可以采用最终一致性的策略,结合分布式事务解决方案,如基于消息队列的事务等。

对于部署和运维成本高的问题,可以通过自动化部署工具和容器化技术,如 DockerKubernetes 等,提高部署效率和管理便利性。

7. 直播间 200 w 人,抢 2000 张优惠券,说下怎么设计

我们可以将用户分组,把 200 万用户分成 20 组,每组大概 10 万人。同时将 2000 张优惠券也平均分为 20 组,每组 100 张。这样可以在一定程度上减少并发压力,提高系统的稳定性和响应速度。

8. 如果客户端发请求超时了,但是实际上已经抢到了,怎么处理

我们利用 Redis 来保存用户是否抢到优惠券的状态。当客户端请求超时但实际上已抢到时,系统直接从 Redis 中获取状态并返回抢到了的信息。不过这是异步处理,详细信息可能还需要进一步的处理才能展示给用户。

9. 如果有一个项目,你是项目负责人来主导,应该如何推进

  • 首先,明确项目目标和需求,制定详细的项目计划,包括各个阶段的里程碑和交付物。
  • 然后,组建合适的项目团队,根据成员的技能和特长分配任务。在项目执行过程中,建立有效的沟通机制,定期召开项目会议,监控项目进度和质量。
  • 最后,及时处理项目中出现的问题和风险,根据实际情况调整项目计划。在项目完成后进行总结和复盘,为后续项目积累经验。

10. 其他的测试不认同你的方案,应该怎么办

会与测试人员进行充分的沟通,了解他们不认同的具体原因和关注点。然后,从他们的角度重新审视方案,分析方案中可能存在的问题。如果是误解导致的不认同,我会详细解释方案的设计思路和原理。如果确实存在不足,我会与团队成员一起探讨改进的方法,综合考虑各方意见,对方案进行优化。

按自己的经验回答

11. 编程题

题目: 小于 n 的最大数

题目描述:

给定一个数 n,如 23121;给定一组数字 A 如 {2,4,9},求由 A 中元素组成的、小于 n 的最大数,如小于 23121 的最大数为 22999。

思路:

从高位到低位遍历给定的数 n,对于每一位数字,在给定的数字集合 A 中找到小于该位数字的最大数字进行替换。如果找不到小于该位数字的数字,则保持该位数字不变。从左到右依次进行替换,直到构建出小于 n 的最大数。例如对于 23121 和 {2,4,9},从高位开始,第一位 2 保持不变,第二位 3 可替换为 2,后面尽量用大数字 9 填充,得到 22999。

12. 反问

公司业务是什么?

欢迎关注 ❤

我们搞了一个免费的面试真题共享群,互通有无,一起刷题进步。

没准能让你能刷到自己意向公司的最新面试题呢。

感兴趣的朋友们可以私信我。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐