# code **Repository Path**: learn_2_zfc9393/code ## Basic Information - **Project Name**: code - **Description**: 代码学习 - **Primary Language**: Go - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2020-03-21 - **Last Updated**: 2022-12-28 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # abm-cache-center http service based on golang ![流程](./doc/flow.png) ## 项目简介 - 单创电商平台-缓存订阅中心 - 为提高业务访问速度,提升业务读并发,通常的做法是在业务架构中引入缓存层,让业务所有读请求全部路由到缓存层, 通过缓存的内存读取机制来提升业务读取性能。由于缓存中的数据不能持久化 ,一旦缓存异常退出,那么内存中的数据将会丢失。 - DTS提供的数据订阅功能,可以帮助您异步订阅数据库的增量数据,并更新缓存的数据,实现轻量级的缓存更新策略。 ## 项目特点 - 重点分dao,service,http/rpc层来开发业务 - 基础框架,基础组件,基础业务都是从0开始布局,数据层和逻辑层完全分离 - 模块化设计,核心足够轻量 ## 缓存更新策略 - 设计基础服务针对业务做缓存中心,完善的rpc熔断回路器 - 针对dts kafka topic做订阅, 实时解析表结构和写变动同步到redis, 可以针对我们业务情况做cache流 - 这边只负责cache单表的数据,至于聚合cache操作,请应用层自行处理(比如:多表关联数据的,delete/set操作需要自行处理) - 异步goroutine每秒实时跑监听binlog,可以直接push,支持rest和grpc协议,方便多端调用 - 统一管理cache以及安全防范(比如:穿透和雪崩防范), 应用层完全不用担心cache过期 ## 接口文档 - http://git.abmau.com:10080/gukai/abm-cache-center/blob/master/doc/doc.md ## 编译环境 - 请只用 Golang v1.8.x 以上版本编译执行 ## siege压测php和golang性能对比 ```php Transactions: 5000 hits Availability: 100.00 % Elapsed time: 109.23 secs Data transferred: 44.10 MB Response time: 1.09 secs Transaction rate: 45.77 trans/sec Throughput: 0.40 MB/sec Concurrency: 49.68 Successful transactions: 5000 Failed transactions: 0 Longest transaction: 2.79 Shortest transaction: 0.16 ``` ```golang Transactions: 5000 hits Availability: 100.00 % Elapsed time: 111.51 secs Data transferred: 44.36 MB Response time: 1.11 secs Transaction rate: 44.84 trans/sec Throughput: 0.40 MB/sec Concurrency: 49.72 Successful transactions: 5000 Failed transactions: 0 Longest transaction: 2.44 Shortest transaction: 0.15 ``` ## 后期改进 - 新增配置热加载功能,目前已sigusr1模式加载 - 新增进程的心跳检测功能, 目前已支持rest/rpc模式 - 新增监控进程panic和error的上报,或者对接prom - 新增log的动态分割策略等 - 新增机器宕机自动报警策略 - 目前框架本真支持grpc协议,但没有对内暴露api和定义pb文件,dao和service是可以公用的,但是pb struct需要重新定义 ## 为什么采用golang #### 更新路径短,延迟低 - 业务完成更新数据库后直接返回,不需要关心缓存失效流程,整个更新路径短、延迟低。 #### 应用简单可靠 - 应用无需实现复杂双写逻辑,只需启动异步线程监听增量数据,更新缓存数据即可。 #### 应用更新无额外性能消耗 - 数据订阅通过解析数据库的增量日志来获取增量数据,不会对业务和数据库性能造成影响 ## 弹力设计 - 我们会根据报警机制来进行人工干预扩容 - 如有需要,我们可以开发自动扩容, docker+mesose ## 申请资源 - 2台redis 32G机器 - 2台api接口对外服务机器 ## 发布流程 - supervisor管理进程 - ops拉取项目持续集成install bin - 启动cmd/bin