A lightweight social project developed in Go, based on accumulated experience.
基于 Gin + Gorm + Redis + MySQL + Kafka + Etcd 开发的轻量级社交项目。
-
自定义中间件
- 基于 IP 的限流
- JWT 用户鉴权
-
高可用客户端
- 断路器、超时、重试、指数退避策略封装自定义 REST Client
- RPC 客户端拦截器,用于调用第三方服务
-
第三方服务集成
- 对 Twitter、Discord Oauth2 服务进行统一 RPC 封装
-
社交关系与互动
- 建立关注关系、关注/关注者统计
- 实现用户发帖
- 使用邻接表设计用户评论
-
高性能消息系统
- 二次封装基于 Sarama 的 Kafka 客户端
- 生产-消费者模式实现高性能帖子阅读、点赞、收藏计数
- 用户交互时并发发送计数消息,异步消费
-
热榜与缓存
- 基于热度公式实现高并发帖子热榜计算
- 定时任务 + 分布式锁,异步计算热榜
- 基于最小堆的优先队列构造排行
- 本地缓存(原子变量+自定义过期时间)+ Redis 缓存组成高性能方案
- 基于热度公式实现高并发帖子热榜计算
-
全文检索与相关性提升
- 使用 ES 对文章建立索引
- 利用用户交互(点赞、收藏)提升相关性和搜索体验
-
Feed 流实现
- 基于用户交互行为(关注、点赞、发帖),采用拉/推模型、收/发信箱设计
- 线性交互关系:全推模型,产生用户收信箱事件
- 非线性交互关系:混合推拉模型
- Feed 写流程:用户粉丝数大于阈值时,使用拉模型创建自己的发信事件;否则查询粉丝,使用推模型创建粉丝的收信事件
- Feed 读流程:查询关注者发信箱事件 + 查询自己的收信箱事件,合并排序
-
微服务与架构
- 除基础用户服务外,全部服务 gRPC 微服务化
- 使用 Etcd 进行服务注册、发现与续约
- DDD 分层建模
- 基于接口,采用 Wire 依赖注入,构造代码依赖链路