DeltaPub 社区交流项目架构

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云原生内存数据库 Tair,内存型 2GB
云数据库 Redis 版,经济版 1GB 1个月
简介: 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月前
|
设计模式 前端开发 测试技术
Flutter 项目架构技术指南
探讨Flutter项目代码组织架构的关键方面和建议。了解设计原则SOLID、Clean Architecture,以及架构模式MVC、MVP、MVVM,如何有机结合使用,打造优秀的应用架构。
104 1
Flutter 项目架构技术指南
|
2月前
|
安全 架构师 Java
理论实战源码齐飞!架构师社区疯传的SpringSecurity进阶小册真香
安全管理是Java应用开发中无法避免的问题,随着Spring Boot和微服务的流行,Spring Security受到越来越多Java开发者的重视,究其原因,还是沾了微服务的光。作为Spring家族中的一员,其在和Spring家族中的其他产品如SpringBoot、Spring Cloud等进行整合时,是拥有众多同类型框架无可比拟的优势的。
64 0
|
22天前
|
Java 编译器 Maven
使用intellij idea搭建SSM架构的maven项目 详细
使用intellij idea搭建SSM架构的maven项目 详细
37 4
|
14天前
|
存储 负载均衡 网络协议
杨老师课堂之JavaWeb项目架构之NFS文件服务器
杨老师课堂之JavaWeb项目架构之NFS文件服务器
19 0
|
2月前
|
SpringCloudAlibaba Java 持续交付
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
【构建一套Spring Cloud项目的大概步骤】&【Springcloud Alibaba微服务分布式架构学习资料】
315 0
|
3天前
|
设计模式 消息中间件 监控
如何在Java项目中实现可扩展性架构
如何在Java项目中实现可扩展性架构
|
4天前
|
安全 Java Maven
Spring Boot项目的模块化设计与架构
Spring Boot项目的模块化设计与架构
|
15天前
|
JavaScript 前端开发 Java
信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ&插件项目
信息打点-JS架构&框架识别&泄漏提取&API接口枚举&FUZZ&插件项目
|
2月前
|
运维 监控 小程序
一个人也能支撑起的项目是怎样的架构
云托管真的是开发者的福音!!!不仅简化了小程序API的接入,还省了买服务器的钱。像灰度发布、监控实例、服务器规格调整这些头疼的事儿,统统都不用费心。
73 2
|
20天前
|
前端开发 JavaScript Java
计算机Java项目|基于SSM架构的网上书城系统
计算机Java项目|基于SSM架构的网上书城系统