架构设计(重构)

2023/02/01 面试 共 3829 字,约 11 分钟
闷骚的程序员

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. 消息队列

用途

  • 提供简单的消息队列功能,用于异步处理或解耦服务。

    场景

  • 订单处理、日志收集、任务队列。

    实现

  • 使用 ListStream 作为消息队列。
  • 结合 Pub/Sub 模式进行消息发布与订阅。

5. 排行榜与计数器

用途

  • 实现实时排行榜或统计计数。

    场景

  • 游戏排行榜、文章点赞数、观看次数统计。

    实现

  • 使用 Sorted Set 存储分数和排名。
  • 使用 INCRINCRBY 实现高效计数。

6. 数据分析

用途

  • 结合大数据平台,用于实时分析或临时查询。

    场景

  • 实时用户行为分析。
  • 热门关键词统计。

    实现

  • 使用 HyperLogLog 实现基数统计。
  • 使用 Bitmap 实现用户活跃度统计。

7. 地理位置服务

用途

  • 存储和查询地理位置信息。

    场景

  • 附近的人或商家的查询。
  • LBS(基于位置的服务)推荐。

    实现

  • 使用 Geo 模块存储位置信息,提供距离计算与范围查询。

8. 实时应用

用途

  • 提供实时性较高的功能支持。

    场景

  • 实时弹幕系统。
  • 在线用户列表。

    实现

  • 使用 Pub/SubStream 提供实时数据流。

9. 全文搜索

用途

  • 作为搜索引擎的一部分,支持快速模糊匹配。

    场景

  • 自动补全、关键字提示。

    实现

  • 使用 SetZSet 配合模糊查询实现简单搜索。
  • 借助 Redisearch 提供更强大的全文搜索能力。

10. 事务处理

用途

  • 处理少量具有事务性的操作。

    场景

  • 短期交易管理。

    实现

  • 使用 Redis 提供的事务命令(如 MULTIEXEC)。

11. 配置中心

用途

  • 存储分布式系统的配置项,支持实时更新。

    场景

  • 动态加载系统配置。

    实现

  • 使用 Hash 结构存储配置项。

12. 数据过期与淘汰

用途

  • 临时数据的高效管理。

    场景

  • 验证码存储。
  • 一次性任务数据存储。

    实现

  • 借助 EXPIRETTL 自动清理过期数据。

13. 图数据存储

用途

  • 处理简单的图数据结构。

    场景

  • 社交网络中的好友关系。
  • 路径查找或网络分析。

    实现

  • 使用 SetHash 模拟图的顶点和边。

14. 日志存储

用途

  • 存储临时日志,用于实时分析。

    场景

  • 日志聚合或短期存储。

    实现

  • 使用 ListStream 存储日志。

15. 限流与计时器

用途

  • 实现访问频率控制。

    场景

  • 接口限流、防止刷接口。
  • 定时任务。

    实现

  • 使用 INCR 实现计数,结合过期时间管理。
  • 使用 Sorted Set 实现精确限流。

Redis 凭借其强大的功能、高性能和丰富的数据结构,在众多场景中发挥了重要作用,并可结合其他技术(如 Spring、Kafka)实现更复杂的业务需求。

文档信息

Search

    Table of Contents