DeltaPub 社区交流项目架构

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
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

相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore     ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库 ECS 实例和一台目标数据库 RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
目录
相关文章
|
2月前
|
前端开发 JavaScript 测试技术
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
Kotlin教程笔记 - 适合构建中大型项目的架构模式全面对比
37 3
|
3月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
143 2
|
2月前
|
监控 前端开发 数据可视化
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
@icraft/player-react 是 iCraft Editor 推出的 React 组件库,旨在简化3D数字孪生场景的前端集成。它支持零配置快速接入、自定义插件、丰富的事件和方法、动画控制及实时数据接入,帮助开发者轻松实现3D场景与React项目的无缝融合。
179 8
3D架构图软件 iCraft Editor 正式发布 @icraft/player-react 前端组件, 轻松嵌入3D架构图到您的项目,实现数字孪生
|
2月前
|
前端开发 JavaScript 测试技术
android做中大型项目完美的架构模式是什么?是MVVM吗?如果不是,是什么?
在 Android 开发中,选择合适的架构模式对于构建中大型项目至关重要。常见的架构模式有 MVVM、MVP、MVI、Clean Architecture 和 Flux/Redux。每种模式都有其优缺点和适用场景,例如 MVVM 适用于复杂 UI 状态和频繁更新,而 Clean Architecture 适合大型项目和多平台开发。选择合适的架构应考虑项目需求、团队熟悉度和可维护性。
62 6
|
2月前
|
存储 前端开发 数据可视化
在实际项目中,如何选择使用 Flux 架构或传统的 MVC 架构
在实际项目中选择使用Flux架构或传统MVC架构时,需考虑项目复杂度、团队熟悉度和性能需求。Flux适合大型、高并发应用,MVC则适用于中小型、逻辑简单的项目。
|
3月前
|
前端开发 JavaScript 测试技术
Android适合构建中大型项目的架构模式全面对比
Android适合构建中大型项目的架构模式全面对比
55 2
|
3月前
|
存储 分布式计算 Hadoop
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
Hadoop-33 HBase 初识简介 项目简介 整体架构 HMaster HRegionServer Region
70 2
|
4月前
|
负载均衡 数据库 开发工具
|
4月前
|
Java 数据库 Maven
谷粒商城笔记+踩坑(1)——架构、项目环境搭建、代码生成器
项目介绍、项目环境搭建、docker配置mysql,redis,jdk,maven、人人开源、快速开发、安装nodejs、逆向工程搭建,人人开源代码生成器
谷粒商城笔记+踩坑(1)——架构、项目环境搭建、代码生成器
|
3月前
|
缓存 前端开发 JavaScript
前端架构思考:代码复用带来的隐形耦合,可能让大模型造轮子是更好的选择-从 CDN 依赖包被删导致个站打不开到数年前因11 行代码导致上千项目崩溃谈谈npm黑洞 - 统计下你的项目有多少个依赖吧!
最近,我的个人网站因免费CDN上的Vue.js包路径变更导致无法访问,引发了我对前端依赖管理的深刻反思。文章探讨了NPM依赖陷阱、开源库所有权与维护压力、NPM生态问题,并提出减少不必要的依赖、重视模块设计等建议,以提升前端项目的稳定性和可控性。通过“left_pad”事件及个人经历,强调了依赖管理的重要性和让大模型代替人造轮子的潜在收益

热门文章

最新文章