DeltaPub 社区交流项目架构

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: DeltaPub 社区交流项目架构

本文主要关注用哪些技术解决了哪些问题,整理思路

系统架构图3iUkxs.png


整个项目构建于 Spring Boot 之上,Spring MVC 处理请求,MyBatis 访问数据库,Spring Security 管理用户的权限


Spring MVC 拦截器使用场景

拦截用户请求,在调用具体方法之前从cookie中获取凭证,构建用户认证的结果,存入存入SecurityContext,以便于Security进行授权,并存入 ThreadLocal,请求完成后对ThreadLocal 和 SecurityContext 中的对象进行清理。

  • 在请求开始时查询登录用户
  • 在本次请求中持有用户数据
  • 在模板视图上显示用户数据
  • 在请求结束时清理用户数据

拦截用户请求,在调用具体方法之前获取用户 IP 和 id 实现数据统计,如统计 UV 与 DAU。


Redis 使用场景

二级缓存:Redis 缓存帖子列表数据,当本地缓存查不到时就查询 Redis。

对性能要求高模块,需要高频访问的模块:

  • 关注功能使用了 Redis 的 ZSet 数据结构实现关注列表和被关注列表,将当前时间做为权重,关注时将数据存入 Redis 中,取关时将 Redis 中的数据删除。
  • 点赞功能使用了 Redis 的 Set 和 String 数据结构分别存储实体的赞和用户的赞,实现实时获取点赞状态和数量。

Redis 中的事务是细粒度的,当需要进行增加或删除操作时将事务打开,完成后提交事务。

统计网站 UV 使用了 Redis 的高级数据类型 HyperLogLog,其中日期做 key、IP 做 value 将指定的 IP 计入UV,实现了统计指定日期范围内的 UV。

统计网站 DAU 使用了 Redis 的高级数据类型 Bitmap,其中日期做 key、userId 做 value 将指定的 用户 计入UV,通过 OR 运算实现了统计指定日期范围内的 DAU。

使用 Redis 存储了用户的登录凭证,解决了分布式环境下的 Session 的共享。


Kafka 使用场景

当用户进行评论、点赞、关注,触发相应事件,发送到指定主题,事件消费者监听主题,消费消息发送站内通知。

当用户进行发帖和删帖时,发送异步消息,事件消费者监听到消息后,处理事件,包括检验格式、记录日志、对 Elasticsearch 数据库中的数据进行增删。

当用户进行分享时,发送异步消息,将上传文件与分享功能解耦,实现异步生成长图。


Elasticsearch 分布式搜索引擎使用场景

对帖子全文搜索 使用 Elasticsearch,对帖子进行了保存,搜索时根据关键字对帖子的标题和内容检索,并设置了排序规则和高亮显示匹配到的关键词。


多线程与定时任务使用场景

ThreadLocal实现线程隔离

为什么用 ThreadLocal,每个浏览器访问服务器时,服务器会创建独立的线程进行处理请求,服务器处于多线程的环境,存储用户信息时需要考虑多线程的情况,为了防止并发时产生冲突,将用户信息存入 ThreadLocal 实现线程隔离。

Quartz 分布式定时任务框架

使用 Quartz 做定时任务的原因,防止在分布式环境下,不同的服务器做同样的任务产生冲突,而 Quartz 是分布式定时任务框架,数据存储在数据库中,可以实现分布式环境下的定时任务。

业务中使用 Quartz 定时刷新帖子分数,用户后续热度排名。

本地定时任务 Spring 定时任务

业务中向云服务器上传图片采用了 ThreadPoolTaskScheduler,启用定时器,监视该图片,一旦生成了,则上传至云服务器。

Spring AOP 和 ControllerAdvice 使用场景

ControllerAdvice 实现全局异常处理。

Spring AOP 实现统一记录日志。

Spring 事务使用场景

对帖子评论时,需要同步更新帖子的评论数据量,设计到两个实体:评论和帖子,修改了两次数据库,先添加评论,后更新帖子的评论数量。

隔离级别选用 *READ_COMMITTED *解决第二类丢失更新、不可重复读以及幻读。

事务传播行为采用 REQUIRED 支持当前事务(外部事务),如果不存在则创建新事务。

数据结构与算法

利用 Trie 实现了发帖、评论时对敏感词过滤。

利用 StackOverflow 的问答排名算法,计算帖子分数,实现帖子热门排名。

项目部署图

3iUtZ6.png

目录
相关文章
|
4月前
|
消息中间件 监控 前端开发
如何开发项目管理系统中的项目结项板块?(附架构图+流程图+代码参考)
在企业项目管理中,“项目结项”是关键环节,常因流程不清、文档不全、审批滞后等问题导致交付困难。本文介绍如何通过“项目结项”模块实现线上化管理,涵盖结项申请、审批流程、成果上传、权限控制等功能,帮助团队高效完成项目收尾,避免成果丢失与流程混乱。内容包括功能设计、业务流程、系统架构、数据库设计、核心代码实现、前端交互及优化建议,助力项目管理系统快速落地并稳定运行。
|
3月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
354 0
|
4月前
|
数据挖掘 项目管理 Python
如何开发项目管理系统中的项目启动板块?(附架构图+流程图+代码参考)
本文介绍了项目管理系统中“项目启动”板块的设计与实现,涵盖功能模块、业务流程、开发技巧及效果展示,并提供代码参考和常见问题解答,助力企业高效搭建项目管理平台。
|
4月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
414 0
|
4月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
221 2
|
4月前
|
监控 前端开发 BI
如何开发项目管理系统中的项目收支板块?(附架构图+流程图+代码参考)
本文深入讲解项目管理系统中项目收支模块的设计与实现,涵盖预算、收入与支出管理,以及报表分析功能。内容包括模块功能概述、业务流程、开发技巧与实现方法,并提供数据库设计及前后端代码示例,助力企业打造高效的项目财务管控系统。
|
4月前
|
SQL 前端开发 项目管理
如何开发项目管理系统中的项目执行板块?(附架构图+流程图+代码参考)
随着企业项目规模扩大,传统管理方式已难以满足需求。本文介绍项目管理系统中“项目执行”板块的开发,涵盖任务管理、创建、验收及进度汇报等核心环节。通过功能设计、业务流程和开发技巧,结合代码示例,帮助企业高效推进项目执行,提升管理效率。
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
177 3
|
5月前
|
设计模式 开发者
一、HarmonyOS Next 开发者手册项目之项目架构设计
该项目是一个基于HarmonyOS Next的开发者学习手册应用,旨在帮助开发者系统学习HarmonyOS开发知识。项目采用分级学习方式,从基础到高级逐步深入讲解技术与实践案例。前四章重点介绍应用架构相关内容,助力快速掌握应用核心。 项目结构清晰,包含主入口、源代码目录、公共资源和工具等。页面导航分为多个阶段:萌新小白(基础入门)、登堂入室(进阶学习)、进阶高手(高级开发)。支持Markdown解析,使用`@luvi/lv-markdown-in`插件展示内容,并定义了多种数据结构以规范开发流程。 源码已开源,持续更新中
169 1
|
7月前
|
存储 编解码 搜索推荐
文生图架构设计原来如此简单之社区与共享机制
工作流共享是文生图应用社区建设的核心功能,它使用户能够分享创作经验和技巧,形成知识共享生态。工作流序列化与存储设计需要解决复杂工作流的高效表示问题。
189 10

热门文章

最新文章