系统设计
共 1 条笔记
2026-01-16 09:51
您的浏览器不支持 audio 元素。 📑 智能总结 录音信息 时长 :约 0小时47分钟 参与人数 :约 4人 内容类型 :工作会议 录音总结 本次为技术面试,包含编码和系统设计两部分,面试官介绍规则后,候选人尝试用Java编写HTTP请求代码,后转为仿真实现,接着讨论将功能转化为生产级URL抓取服务的设计思路。 面试开场与规则说明 * 面试流程与时长 :面试总时长45分钟,其中35分钟为技术部分,首尾各5分钟供候选人提问。技术部分包含编码和系统设计两部分,旨在考察候选人多方面技术能力的早期信号。 * 技术环境与限制 :候选人可使用Google搜索文档,但禁止使用任何AI工具。候选人首选Java语言,需确认是否已准备好开发环境。 编码环节:HTTP请求实现 * 初始实现思路与挑战 :候选人计划编写一个静态方法发送HTTP请求,需要URL参数并进行检查。由于Java的HTTP请求相对复杂,候选人表示可能需要搜索相关类和参数,面试官允许搜索,并提出若过复杂可仿真响应。 * 仿真实现方案 :候选人尝试使用HttpURLConnection等类,但遇到“Protocol doesn’t support input”错误。面试官建议创建自定义仿真HTTP客户端,忽略实际HTTP库调试,仿真返回URL和响应体,候选人接受并开始编写仿真代码。 * 并发处理考虑 :针对输入为URL列表的需求,候选人考虑到需要支持并发请求与响应,提出同步处理、回调或挂起两种方案,初步倾向于使用回调,并考虑使用线程和线程池(ExecutorService)来优化性能,处理大量URL(如10,000个)。 系统设计环节:URL抓取服务生产化 * 需求澄清与内核目标 :将URL抓取功能转化为客户可用的API服务,需处理每天数百万次页面抓取。服务需提供端点供客户调用,客户发送包含目标URL列表的请求,服务返回对应抓取结果,需保证服务的健壮性和可靠性。 * 用户与流量特征 :候选人询问用户是否分布在全球,以考虑响应相关因素;面试官提出需处理突发请求,如高峰期10,000个客户端同时发送请求的场景。 * 架构组件初步设想 :候选人初步设想包含API层、缓存(如Redis)、数据库(如PostgreSQL)、搜索引擎(如Elasticsearch)等组件。缓存用于提高热门URL的响应速度和命中率,数据库可能用于保存业务逻辑数据(如URL流行度排名),搜索引擎用于相关搜索功能。 * 流量控制与优化策略 :针对流量控制,候选人提出滑动窗口、令牌桶等限流方案,如设置每个用户每分钟最多10个请求,以防止系统滥用。针对高并发和吞吐量,强调缓存(Redis)的重要性,可重用相同URL的请求结果,减少后端负载,同时考虑使用多台服务器,并通过Redis实现集中化缓存管理。 服务设计细节探讨 * 数据库保存内容 :面试官询问PostgreSQL的保存内容,候选人推测可能保存URL字符串、请求计数及流行度等信息,用于排序和热门资源优化。 * 客户端请求处理流程 :客户通过端点指定要抓取的URL列表,服务需返回这些URL的抓取结果。候选人考虑到需设计健壮的端点来支持该流程。 候选人提问环节 * 岗位职责与日常工作 :候选人询问该角色的日常工作内容。面试官表示职位为通用后端岗位,尚未确定具体团队,日常工作遵循敏捷实践,多数团队采用 sprint 流程,包括每日站会。高端成员需驱动项目、解决自身及团队问题、指导初级工程师,并与经理和首席工程师沟通技术难点。 * AI工具使用情况 :候选人询问团队在日常工作中是否使用AI工具。面试官确认会使用,团队在AI工具方面投入大量资源,产品中有类似Bubl和B Depth的功能,也会使用Cursor、Gemini等多种模型和工具。 📅 章节概要 00:01:02 候选人开场问候 候选人以“Hello yeah hello yeah great I’m glad to join them the interview today yeah good good yeah.心里有。”开场。 00:01:27 面试官背景与环境干扰说明 面试官表示自己住在悉尼,并为狗叫声道歉,称“the dog I’ fine”。 00:01:50 面试流程与技术部分说明 面试官欢迎候选人并感谢其时间,介绍这是技术面试,包含编码和系统设计两部分,旨在考察多方面技术能力的早期信号,说明45分钟面试中35分钟为技术部分,首尾各5分钟供提问。 00:02:56 编程语言与开发环境确认 面试官询问候选人首选编程语言,候选人回答Java,面试官确认无问题,并询问是否已准备好开发环境。 00:03:11 搜索与AI工具使用规则 面试官告知候选人可使用Google搜索文档,但禁止在本轮面试中使用任何AI工具,候选人表示理解。 00:03:35 面试官自我介绍与屏幕共享请求 面试官自我介绍名为Jeremy,已在公司工作四年以上,询问候选人是否准备好,请求共享屏幕开始面试,候选人同意并共享整个屏幕。 00:05:35 编码题目:URL列表的HTTP GET响应 面试官提出编码题:编写函数,输入URL列表(如Google.com、ALA.com),返回对应GET请求的响应。允许使用HTTP库,提及Java的HTTP请求较复杂,询问候选人是否有同感。 00:06:16 候选人对题目难度的反馈与开始编码 候选人表示可能需要搜索HTTP请求相关的类和参数,但会尝试。面试官允许搜索,并提出若过复杂可仿真响应,即假设发送请求并获取响应,候选人表示理解并询问是否可开始写代码,得到肯定答复。 00:07:14 编码思路:方法定义与参数检查 候选人计划编写一个静态类中的方法发送请求,可能需要URL参数并进行检查,提及IDE有相关建议。 00:07:49 HTTP客户端选择与配置 候选人考虑使用HttpClient和HttpRequest类,提及不需要过多配置即可发送请求,需要配置请求的URL等参数。 00:09:55 仿真实现的进一步确认 候选人在编写代码时遇到困难,面试官再次确认若复杂可仿真,即发送请求时仅仿真发送和接收响应的过程,候选人表示理解。 00:11:19 代码实现尝试与错误处理 候选人尝试编写代码,包括连接、发送请求、获取响应码和消息,提及可能需要处理JSON项目,打印响应信息。后遇到错误,考虑是否需要使用客户端还是直接用HttpURLConnection。 00:15:35 从实际实现转为仿真实现 由于代码运行报错“Protocol doesn’t support input”,面试官建议忽略该部分,创建自定义仿真HTTP客户端,返回URL和虚拟响应体,避免调试整个Java库,候选人同意。 00:18:58 URL列表处理与并发考虑 针对输入为URL列表的需求,候选人考虑使用列表保存,并意识到需要支持并发请求与响应,提出同步处理、回调或挂起两种方案,倾向于使用回调,考虑使用线程和ExecutorService。 00:22:42 线程与性能优化讨论 面试官询问仅创建一个线程处理所有URL是否足够,例如10,000个URL时,候选人意识到需要多线程,计划使用线程池(ExecutorService),但表示不确定如何使用,可能需要搜索。 00:28:48 系统设计题目:POC转生产级服务 编码环节后,面试官提出系统设计题:将刚才的功能(POC)转化为客户可用的API生产服务,每天处理数百万次页面抓取。候选人询问POC的具体含义。 00:30:18 服务需求与客户端场景澄清 候选人理解POC为概念验证,现需转化为正式服务,询问是否存在客户端,面试官确认服务需提供端点,客户发送包含目标URL的请求,获取抓取结果,候选人进一步询问用户是否分布在全球。 00:32:27 服务功能与架构初步设想 候选人设想服务包含API层、缓存(Redis)、数据库(PostgreSQL)、搜索引擎(Elasticsearch)等组件,缓存用于热门URL提高响应速度,数据库可能保存业务逻辑数据(如热门URL排名)。 00:35:54 突发流量处理与限流方案 面试官询问如何处理突发请求,如高峰期10,000个客户端同时发送请求,候选人提出滑动窗口、令牌桶等限流方案,如设置每个用户每分钟最多10个请求,防止系统滥用。 00:38:36 缓存与吞吐量优化 候选人强调缓存(Redis)可重用相同URL请求结果,减少后端负载,提高响应速度,对于多台服务器,Redis可作为集中化缓存源,提升整体吞吐量。 00:41:11 数据库用途探讨 面试官询问PostgreSQL保存内容,候选人推测保存URL、请求计数、流行度等信息,用于排序和热门资源优化,提及PostgreSQL查找较重,需结合技术优势避免劣势。 00:43:32 候选人提问:岗位职责与日常工作 候选人询问该角色的日常工作,面试官表示职位为通用后端岗位,未确定具体团队,日常遵循敏捷实践,多数团队采用sprint和每日站会,高端成员需驱动项目、解决问题、指导初级工程师,与经理和首席工程师沟通技术难点。 00:45:44 候选人提问:AI工具使用情况 候选人询问团队是否在日常工作中使用AI工具,面试官确认会使用,团队在AI工具投入大量资源,产品中有类似Bubl和B Depth的功能,也使用Cursor、Gemini等多种模型和工具。 00:47:02 面试结束与告别 候选人表示没有其他问题,感谢面试官时间,双方互相道别,面试结束。 ✨ 金句精选 “Java is quite complicated to to start a http call.” (方法技巧) “If it’s too complicated, we can just mock the response.” (运行策略) “The requirement is we will have a list of urls and you have a list of responses.” (运行策略) “To optimize the performance, just use the multiple threads.” (运行策略) “We want to productionize it, we want to make it a proper service.” (战略洞见) “Consider the response, I mean, are they all around the world?” (战略洞见) “To control the flow, to control the traffic, like sliding Windows or bucket control solutions.” (运行策略) “If some requests are exactly the same, we can reuse them as a cache.” (运行策略) “We do agile practices, most teams follow sprint and daily stand up.” (运行策略) “We are heavily investing resources in AI tooling.” (战略洞见) 📋 待办事项 候选人:完成仿真HTTP客户端代码,实现处理URL列表并返回响应功能。 候选人:设计将URL抓取功能转化为生产级服务的详细架构方案,包含缓存、数据库、限流等组件。
