Skip to content

Commit acf084d

Browse files
committed
update
Former-commit-id: bec56950ee0e197120e2cf079dec4c49293283eb
1 parent 6e55c07 commit acf084d

1 file changed

Lines changed: 153 additions & 39 deletions

File tree

doc/project_interview_highlights.md

Lines changed: 153 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -5,61 +5,175 @@
55
在用户模块的设计中,我采取了以下关键步骤来优化安全性、性能和用户体验:
66

77
1. **身份校验与令牌管理**
8-
- **短Token(身份校验Token)**
9-
- 用于用户身份验证,每次用户请求时在HTTP头中携带。
10-
- 具有较短的有效期,如5分钟,以增强安全性。
11-
- 存储在客户端,如浏览器Cookie。
12-
- **长Token(刷新Token)**
13-
- 用于刷新短Token,确保用户持续登录状态。
14-
- 具有较长的有效期,如一周,减少用户重新登录的频率。
15-
- 存储在服务端,通常通过Redis等缓存服务实现。
8+
- **短Token(身份校验Token)**
9+
- 用于用户身份验证,每次用户请求时在HTTP头中携带。
10+
- 具有较短的有效期,如5分钟,以增强安全性。
11+
- 存储在客户端,如浏览器Cookie。
12+
- **长Token(刷新Token)**
13+
- 用于刷新短Token,确保用户持续登录状态。
14+
- 具有较长的有效期,如一周,减少用户重新登录的频率。
15+
- 存储在服务端,通常通过Redis等缓存服务实现。
1616
2. **令牌生成与验证**
17-
- 使用JWT(JSON Web Tokens)技术生成和验证Token。
18-
- 短Token和长Token都包含用户ID、SSID(会话ID)等信息。
19-
- 短Token包含用户代理和内容类型等信息,用于追踪用户行为。
17+
- 使用JWT(JSON Web Tokens)技术生成和验证Token。
18+
- 短Token和长Token都包含用户ID、SSID(会话ID)等信息。
19+
- 短Token包含用户代理和内容类型等信息,用于追踪用户行为。
2020
3. **安全性与性能**
21-
- 短Token的有效期短,即使被泄露,威胁窗口也较短。
22-
- 长Token在服务端存储,即使泄露,也不会直接暴露用户身份。
23-
- 减少了对数据库的直接访问,提高了性能。
21+
- 短Token的有效期短,即使被泄露,威胁窗口也较短。
22+
- 长Token在服务端存储,即使泄露,也不会直接暴露用户身份。
23+
- 减少了对数据库的直接访问,提高了性能。
2424
4. **用户界面**
25-
- 设计直观的用户登录和注册界面,简化用户操作。
26-
- 实现自动登录功能,使用户在刷新页面或重新加载时无需重新登录。
25+
- 设计直观的用户登录和注册界面,简化用户操作。
26+
- 实现自动登录功能,使用户在刷新页面或重新加载时无需重新登录。
2727
5. **数据同步**
28-
- 实现Token的有效期管理,自动刷新短Token。
29-
- 确保长Token在用户会话结束时失效,以防止滥用。
28+
- 实现Token的有效期管理,自动刷新短Token。
29+
- 确保长Token在用户会话结束时失效,以防止滥用。
3030
6. **异常处理**
31-
- 实现Token过期或无效时的错误处理,返回清晰的错误信息。
32-
- 监控Token的生成和使用情况,及时发现和处理异常。
31+
- 实现Token过期或无效时的错误处理,返回清晰的错误信息。
32+
- 监控Token的生成和使用情况,及时发现和处理异常。
3333

3434
## 帖子模块
3535

3636
在帖子模块的设计中,我采取了以下关键步骤来优化性能和用户体验:
3737

3838
1. **数据库选择**
39-
- 线上库(`Posts`):使用MongoDB存储已发布的帖子,利用其灵活的文档模型和高效的读写性能
40-
- 制作库(`Drafts`):使用MySQL存储未发布的帖子,利用其支持事务和严格数据一致性的特点
39+
- 线上库(`Posts`):使用MongoDB存储已发布的帖子,利用其灵活的文档模型和高效的读写性能
40+
- 制作库(`Drafts`):使用MySQL存储未发布的帖子,利用其支持事务和严格数据一致性的特点
4141
2. **数据同步**
42-
- 当用户发布帖子时,系统将帖子从制作库同步到线上库,确保帖子的状态和内容准确无误
42+
- 当用户发布帖子时,系统将帖子从制作库同步到线上库,确保帖子的状态和内容准确无误
4343
3. **查询逻辑**
44-
- 已发布的帖子通过线上库查询,提供快速、高效的访问
45-
- 未发布的帖子通过制作库查询,仅允许帖子的所有者访问
44+
- 已发布的帖子通过线上库查询,提供快速、高效的访问
45+
- 未发布的帖子通过制作库查询,仅允许帖子的所有者访问
4646
4. **用户界面**
47-
- 设计用户友好的界面,包括“保存草稿”和“发布”按钮,便于用户管理帖子
47+
- 设计用户友好的界面,包括“保存草稿”和“发布”按钮,便于用户管理帖子
4848
5. **安全性**
49-
- 实现严格的权限控制,确保只有帖子的所有者可以访问和编辑未发布的帖子
49+
- 实现严格的权限控制,确保只有帖子的所有者可以访问和编辑未发布的帖子
5050
6. **性能优化**
51-
- 考虑使用缓存机制来提高查询效率,同时确保同步操作不会影响系统性能
51+
- 考虑使用缓存机制来提高查询效率,同时确保同步操作不会影响系统性能
5252

53-
为什么选择分开存储(MongoDB/MySQL)
53+
### 为什么选择分开存储(MongoDB/MySQL)
5454

5555
1. **技术优势**:
56-
- MongoDB
57-
- 适合存储和查询文档型数据,如帖子的内容和评论
58-
- 提供灵活的查询能力,支持复杂的聚合操作
59-
- 适用于读写操作频繁的场景
60-
- MySQL
61-
- 适合存储结构化数据,如用户信息和帖子元数据
62-
- 支持事务处理,确保数据一致性
63-
- 提供丰富的数据管理和备份工具
64-
2. **安全性**
65-
- 可以根据不同的安全需求,对两个数据库实施不同的访问控制策略
56+
- **MongoDB**
57+
- 适合存储和查询文档型数据,如帖子的内容和评论
58+
- 提供灵活的查询能力,支持复杂的聚合操作
59+
- 适用于读写操作频繁的场景
60+
- **MySQL**
61+
- 适合存储结构化数据,如用户信息和帖子元数据
62+
- 支持事务处理,确保数据一致性
63+
- 提供丰富的数据管理和备份工具
64+
2. **安全性**
65+
- 可以根据不同的安全需求,对两个数据库实施不同的访问控制策略
66+
67+
## 榜单模块
68+
69+
在榜单模块的设计中,我采取了以下关键步骤来优化性能和用户体验:
70+
71+
1. **分批处理**
72+
- **批处理大小**:默认设置每次分页处理的帖子数量为100,保证在处理大量数据时不会占用过多资源。
73+
- **排名数量**:默认设置要计算并返回的排名前100帖子的数量,确保榜单的结果能够快速响应并呈现给用户。
74+
2. **计算逻辑**
75+
- **帖子评分函数**:根据点赞数和更新时间计算每个帖子的分数,确保评分逻辑能够准确反映帖子的受欢迎程度和时效性。
76+
- **优先队列**:使用优先队列对帖子进行排序,确保计算效率和内存使用的优化。
77+
- **时间截止**:将七天前的时间作为截止时间,确保榜单数据的时效性和动态更新。
78+
3. **数据获取**
79+
- **分页获取帖子**:通过分页方式从存储库中获取已发布的帖子,保证在大数据量时的获取效率。
80+
- **获取交互数据**:根据帖子ID列表获取交互数据(如点赞数),确保数据的完整性和准确性。
81+
4. **安全性与性能**
82+
- **日志记录**:使用zap日志库记录关键操作和错误,便于调试和监控。
83+
- **异常处理**:处理在获取帖子和交互数据时可能出现的错误,确保系统的健壮性。
84+
85+
### 技术优势
86+
87+
1. **技术选型**
88+
- **优先队列**:使用优先队列进行帖子排序,确保在处理大量数据时仍能保持高效的排序和检索性能。
89+
- **分页处理**:分页获取和处理帖子,避免一次性加载大量数据导致的内存溢出和性能问题。
90+
- **分数计算函数**:采用灵活的分数计算函数,可以根据业务需求进行调整,确保排名结果的准确性和合理性。
91+
2. **安全性**
92+
- **日志记录**:详细记录操作日志和错误日志,便于问题排查和系统维护。
93+
- **异常处理**:处理获取数据和计算排名过程中可能出现的各种异常情况,确保系统的稳定性和可靠性。
94+
3. **性能优化**
95+
- **批量处理**:通过批量处理帖子数据和交互数据,减少数据库的访问次数,提高处理效率。
96+
- **优先队列优化**:在队列已满时,进行替换操作,确保队列中始终保留分数最高的帖子,提高计算效率。
97+
98+
## 评论模块
99+
100+
在评论模块的设计中,我采取了以下关键步骤来优化性能和用户体验:
101+
102+
1. **临接表设计**
103+
- **多级评论支持**:通过设计根评论ID (`RootId`) 和父评论ID (`PID`) 两个字段来支持多级评论结构,确保评论层级关系的清晰。
104+
- **父评论引用**:通过 `ParentComment` 字段实现对父评论的引用,使得每条评论都可以关联其父评论,形成树状结构。
105+
- **高效查询**:使用索引优化根评论ID和父评论ID的查询,提高获取评论和回复的速度。
106+
107+
2. **数据访问层设计**
108+
- **评论创建与删除**:通过 `CreateComment``DeleteComment` 方法实现评论的创建与删除,确保数据操作的高效性和一致性。
109+
- **评论查询**
110+
- `ListComments` 方法实现分页查询指定帖子的评论,确保在大数据量时仍能高效获取评论列表。
111+
- `GetMoreCommentsReply` 方法实现分页获取更多评论回复,支持加载更多评论回复的功能,提升用户体验。
112+
113+
3. **并发处理**
114+
- 使用 `errgroup` 并发获取每个评论的子评论,确保在不阻塞主线程的情况下,快速获取所有评论及其回复,提升查询效率。
115+
116+
4. **数据转换**
117+
- **DAO 与领域模型的转换**
118+
- `toDAOComment` 方法实现领域模型评论到 DAO 评论的转换,确保数据在不同层次间的正确传递。
119+
- `toDomainComment` 方法实现 DAO 评论到领域模型评论的转换,确保业务逻辑处理的数据类型一致性。
120+
- `toDomainSliceComments` 方法批量转换 DAO 评论为领域模型评论,提升数据转换的效率。
121+
122+
5. **安全性与性能**
123+
- **日志记录**:使用 `zap` 日志库记录关键操作和错误,便于调试和监控。
124+
- **异常处理**:在数据操作和并发任务中处理可能出现的错误,确保系统的稳定性和可靠性。
125+
126+
127+
### 技术优势
128+
129+
1. **临接表设计**
130+
- **多级评论支持**:通过根评论ID和父评论ID的设计,支持多层次的评论结构,确保评论关系的清晰和查询的高效。
131+
- **索引优化**:对根评论ID和父评论ID添加索引,提高查询性能,特别是在大量评论数据的情况下。
132+
133+
2. **并发处理**
134+
- **errgroup 并发处理**:通过 `errgroup` 并发获取子评论,提升查询效率,确保系统的高性能。
135+
- **批量处理**:通过分页加载和批量转换数据,减少数据库的访问次数,提高处理效率。
136+
137+
3. **性能优化**
138+
- **批量处理**:通过分页加载和批量转换数据,减少数据库的访问次数,提高处理效率。
139+
- **数据转换优化**:通过高效的数据转换方法,确保数据在不同层次间的快速转换和传递。
140+
141+
## 搜索模块
142+
143+
在搜索模块的设计中,我采取了以下关键步骤来优化性能和用户体验:
144+
145+
1. **Elasticsearch 集成**
146+
- **高效搜索**:使用 Elasticsearch 提供全文搜索和关键字搜索功能,确保在海量数据下依然能快速响应用户的搜索请求。
147+
- **多索引支持**:通过创建 `PostIndex``UserIndex` 两个索引,分别存储帖子和用户的数据,便于分类管理和高效搜索。
148+
149+
2. **搜索功能实现**
150+
- **搜索帖子**`SearchPosts` 方法通过关键字搜索帖子内容和标题,并使用布尔查询条件确保搜索结果包含已发布状态的帖子,提升搜索结果的相关性和准确性。
151+
- **搜索用户**`SearchUsers` 方法通过关键字搜索用户的邮箱、昵称和电话,提供多维度的用户搜索功能,增强用户查找体验。
152+
153+
3. **数据管理**
154+
- **数据输入**:通过 `InputUser``InputPost` 方法将用户和帖子数据索引到 Elasticsearch,确保数据的实时性和准确性。
155+
- **数据删除**:通过 `DeleteUserIndex``DeletePostIndex` 方法删除 Elasticsearch 索引中的用户和帖子数据,确保数据的一致性和有效管理。
156+
157+
4. **查询构建与解析**
158+
- **查询构建**:构建符合 Elasticsearch 查询 DSL 的 JSON 请求,使用多匹配查询和布尔查询来满足复杂搜索需求。
159+
- **查询解析**:解析 Elasticsearch 返回的搜索结果,将 JSON 数据反序列化为 `PostSearch``UserSearch` 对象,确保数据格式的一致性和正确性。
160+
161+
5. **日志记录与错误处理**
162+
- **详细日志记录**:使用 `zap` 日志库记录关键操作和错误,便于调试和监控。
163+
- **错误处理**:处理在搜索请求、数据输入和删除操作中可能出现的错误,确保系统的稳定性和可靠性。
164+
165+
### 技术优势
166+
167+
1. **Elasticsearch 优势**
168+
- **全文搜索**:通过 Elasticsearch 的全文搜索功能,能够快速、准确地从海量数据中找到相关内容。
169+
- **分布式架构**:Elasticsearch 的分布式架构支持大规模数据的高效存储和搜索,保证系统的高可用性和扩展性。
170+
- **丰富的查询语法**:Elasticsearch 提供多种查询语法,支持复杂的搜索需求,提升用户搜索体验。
171+
172+
2. **高效数据管理**
173+
- **索引管理**:通过 `InputUser``InputPost` 方法,将数据实时索引到 Elasticsearch,确保搜索数据的实时性。
174+
- **数据清理**:通过 `DeleteUserIndex``DeletePostIndex` 方法,及时清理无效数据,确保索引数据的一致性和有效性。
175+
176+
3. **安全性与性能**
177+
- **日志记录**:详细记录操作日志和错误日志,便于问题排查和系统维护。
178+
- **错误处理**:处理在搜索请求、数据输入和删除操作中可能出现的各种异常情况,确保系统的稳定性和可靠性。
179+

0 commit comments

Comments
 (0)