1. 业务背景
tachi企业级管理系统重构
基于大数据团队和企业级管理,基于原有的架构系统进行重构。
原有的架构系统
微服务化,只有核心服务tachi-system以及tachi-infra扩展服务。
- tachi-system:用户注册,登录,动态菜单,认证授权,多租户,支付退款,商品,实时通讯,通告等都在system中维护。
- tachi-infra:用户文件下载,操作日志记录,短信邮件等都在infra中维护。
弊端
- 核心服务耦合度太高,不解耦,代码复杂度偏高,粒度太粗
- infra服务和system服务通过feign进行调用,没有引入三方中间件必须Kafka等,通信层级太低,延迟性高,性能偏低
- 没有高可用集群,没有服务熔断机制,没有路由机制,B端和C端服务不分离,接口不分离
- 数据库单库架构,随着业务增长,可扩展性低
改造后的架构:微服务化,进一步拆分,引入中间件
改造思路
- 服务拆分
- 引入spring cloud微服务治理,如gateway整合spring security统一认证授权,统一进行接口鉴权,集成hystrix(Sentinel)统一进行服务限流降级熔断等。
- 引入中间件,实现分布式缓存以及分布式消息通信
- 引入webSocket实现实时通信
- 持久层进行分库分表,引入大数据DB如clickHouse或者byteHouse等
核心功能:
- 提供B端用户和C端用户注册能力
- 提供用户认证授权能力
- 提供Saas多租户的数据隔离能力
- 提供通告广播的能力
- 提供实时通讯的能力
- 提供短信邮件的能力
- 提供支付退款能力
- 提供商城能力,B端企业和C端企业可以进行下单、付款等常规电商场景
- 提供文件上传和下载能力
- 提供操作日志记录能力
- 提供大数据报表渲染能力
2. 架构设计
分为几个微服务模块:
- tachi-gateway:网关服务,通过路由配置,不同的B端请求转发到B端服务,C端请求转发到C端服务,进行下游服务分发
- tachi-office模块:统一管理B端用户以及B端的运营人员相关业务,比如查询登录日志,配置全局开关,配置业务模型,配置权限菜单等服务。
- tachi-user模块:统一C端的用户注册、登录问题,以及使用spring security实现用户登录认证,并且提供restful接口供其他微服务调用,提供oauth2.0 jwt token的校验能力。
- tachi-sms模块:统一进行短信发送,通过rabbitMQ、Kafka禁停其他服务广播的消息,从而触发短信发送事件
- tachi-email:统一进行邮件发送,通过rabbitMQ、Kafka监听其他服务广播的消息,从而触发邮件发送事件
- tachi-pay:统一进行支付服务,比如连接支付宝、微信支付接口进行钱包数据转移。提供两种方式:1.通过restful api实时暴露支付服务 2.通过监听kafka消息进行支付消息的消费。
- tachi-store:自营商城,通过redis缓存下单消息并持久化到DB,通过rabbitMQ、Kafka广播支付消息、taich-pay进行支付消息监听,通过seata和手动的方式(可靠消息最终一致性)确保下单服务和支付服务的分布式事务一致性
- tachi-discount:优惠服务,包括送积分、满减、会员充值等能力,于taich-store服务通过restful api和rabbitMQ、Kafka等方式进行消息通信,通过seata和手动的方式(可靠消息最终一致性)确保下单服务(下单送积分)和送积分服务的分布式事务一致性
- tachi-product:产品服务,负责产品信息管理和库存管理,主要暴露给office端进行手动管理,以及提供给C端其他服务进行下单服务的锁定等。
- tachi-msg:消息服务,主要用来负责消息的持久化、发送、以及xxlJob定时轮询兜底发送待发送消息,以及与各个业务侧的回查接口进行rpc通信。
- tachi-file:文件服务,主要用来提供文件的上传落地与下载能力,技术实现细节支持以aws的s3协议扩展的亚马逊文件服务、minIO、阿里云、腾讯云、七牛云等文件云服务能力。
- tachi-websocket:实时通信服务,通过webScoket与所有客户端建立tcp长连接,通过restful或者Kafka与其他服务保持通信,消费事件,并缓存事件,缓存过期消息等,将消息实时推送到客户端。
3. 技术实现细节
- 服务注册与发现:nacos
- 配置中心:nacos
- 网关:spring cloud gatwway,统一流量入口,结合Hystrix或者AOP策略进行限流。
- 下游服务:通过rabbitMQ、Kafka或者feign的方式与其他服务进行rpc交互,各个微服务可通过hystrix或者自定义aop+注解实现权限校验、限流、服务熔断与降级等策略。
- 消息广播:通过rabbitMQ、Kafka等广播下单消息、用户注册、登录消息等,达到服务之间的异步解耦。
- 事务:通过seata或者各个微服务手动控制事务(可靠消息最终一致性),通过消息服务的轮询兜底发送以及业务侧回查,实现分布式事务的最终一致性。以及MQ的重试机制,确保消息不丢失,以及业务侧实现幂等性逻辑。
- 数据库:使用分区表,或者ShardingSphere分库分表策略,实现数据查询以及写入的定向路由,以及数据查询时的索引优化,入参查询范围限制等,并且通过多数据源源的主从同步、读写分离机制,显著提升性能。
- 缓存:使用caffeine作为各自微服务的本地缓存,使用redis作为共享缓存,缓存热点数据比如热点商品、以及各种开关标志等,缓存用户token信息等。
- 商品搜索以及日志搜索:使用ES检索商品信息以及日志信息。
- 链路追踪:使用SkyWalking进行日志的全链路追踪,方便快速定位问题。
- 日志管理:使用ELK管理日志,实现日志的分布式采集、存储以及分析等。
- 性能监控:Grafana
- 实时通信:通过webSocket与客户端服务保持通信,进行后台消息的实时广播,并通过redis缓存离线消息,进行离线消息的回放。
- 动态数据源:基于AOP结合dynamicDataSource实现动态数据源路由,以及通过AOP实现主从库切换。
4. redis应用场景
Redis 是一个高性能的内存数据库,提供了丰富的数据结构和功能,其使用场景非常广泛,以下是 Redis 的常见使用场景及其优势总结:
1. 缓存
用途
- 加速读取速度,减轻数据库或后端服务的压力。
- 用于存储高频访问的数据,减少数据库查询次数。
场景
- 热门商品详情、热点新闻、配置项、首页推荐信息。
- 秒杀、抢购场景中的库存信息。
优势
- 低延迟、高吞吐。
- 支持过期策略,有效管理缓存的生命周期。
2. 分布式锁
用途
- 在分布式环境中,用于保证同一资源的互斥访问。
场景
- 订单系统防止超卖。
- 并发场景下的任务调度或限流。
实现
- 使用
SET key value NX EX
实现原子操作。 - 借助 Redisson、Spring Data Redis 等工具提供更高级的封装。
3. 会话管理
用途
- 存储用户登录状态和会话信息。
场景
- Web 应用中的分布式会话管理。
- 单点登录(SSO)。
优势
- 高性能的读写能力。
- 支持 TTL 轻松管理会话过期。
4. 消息队列
用途
- 提供简单的消息队列功能,用于异步处理或解耦服务。
场景
- 订单处理、日志收集、任务队列。
实现
- 使用
List
或Stream
作为消息队列。 - 结合 Pub/Sub 模式进行消息发布与订阅。
5. 排行榜与计数器
用途
- 实现实时排行榜或统计计数。
场景
- 游戏排行榜、文章点赞数、观看次数统计。
实现
- 使用
Sorted Set
存储分数和排名。 - 使用
INCR
或INCRBY
实现高效计数。
6. 数据分析
用途
- 结合大数据平台,用于实时分析或临时查询。
场景
- 实时用户行为分析。
- 热门关键词统计。
实现
- 使用
HyperLogLog
实现基数统计。 - 使用
Bitmap
实现用户活跃度统计。
7. 地理位置服务
用途
- 存储和查询地理位置信息。
场景
- 附近的人或商家的查询。
- LBS(基于位置的服务)推荐。
实现
- 使用
Geo
模块存储位置信息,提供距离计算与范围查询。
8. 实时应用
用途
- 提供实时性较高的功能支持。
场景
- 实时弹幕系统。
- 在线用户列表。
实现
- 使用
Pub/Sub
或Stream
提供实时数据流。
9. 全文搜索
用途
- 作为搜索引擎的一部分,支持快速模糊匹配。
场景
- 自动补全、关键字提示。
实现
- 使用
Set
或ZSet
配合模糊查询实现简单搜索。 - 借助 Redisearch 提供更强大的全文搜索能力。
10. 事务处理
用途
- 处理少量具有事务性的操作。
场景
- 短期交易管理。
实现
- 使用 Redis 提供的事务命令(如
MULTI
和EXEC
)。
11. 配置中心
用途
- 存储分布式系统的配置项,支持实时更新。
场景
- 动态加载系统配置。
实现
- 使用
Hash
结构存储配置项。
12. 数据过期与淘汰
用途
- 临时数据的高效管理。
场景
- 验证码存储。
- 一次性任务数据存储。
实现
- 借助
EXPIRE
或TTL
自动清理过期数据。
13. 图数据存储
用途
- 处理简单的图数据结构。
场景
- 社交网络中的好友关系。
- 路径查找或网络分析。
实现
- 使用
Set
或Hash
模拟图的顶点和边。
14. 日志存储
用途
- 存储临时日志,用于实时分析。
场景
- 日志聚合或短期存储。
实现
- 使用
List
或Stream
存储日志。
15. 限流与计时器
用途
- 实现访问频率控制。
场景
- 接口限流、防止刷接口。
- 定时任务。
实现
- 使用
INCR
实现计数,结合过期时间管理。 - 使用
Sorted Set
实现精确限流。
Redis 凭借其强大的功能、高性能和丰富的数据结构,在众多场景中发挥了重要作用,并可结合其他技术(如 Spring、Kafka)实现更复杂的业务需求。
文档信息
- 本文作者:Marshall