成都职工 app 是成都市总工会面向成都市内全体职工发节日福利的一款 app ,上面包含了衣、食、住、行各种 app 应用,包括用户商城、即时聊天,职工婚恋,职工打车、职工就业、职工订餐等业务。成都职工 app有800w+用户数量,最高日活跃用户
70w+,最高并发用户数2w+。此系统使用到的技术有 springboot+springcloud+redis+mysql+netty+rabbitMQ+canal+kafka
商城系统作为核心业务,采用了微服务与分层架构。系统整合了产品、优惠、订单与物流等模块,其中产品系统管理着包含类型、规格和信息的SKU数据,数据量达50万以上,并承受超8000万的查询PV。为应对高并发读取,系统利用Redis的Hash结构缓存SKU信息。订单模块则采用多维度分表策略,按用户ID哈希分为32张表,每表预估承载百万级数据,以支撑每日超10万的订单量。为保证分布式环境下的库存准确性,系统使用Redisson实现分布式锁,防止超卖。订单ID预先生成并包含用户信息。同时,为满足商家对订单的查询与统计需求,订单数据通过Canal组件同步至Elasticsearch,提升检索效率。支付流程通过调用外部支付接口实现,并利用异步回调及RabbitMQ延迟队列,对未支付订单进行超时检查,若超时则自动删除订单并回滚库存,确保了最终一致性。
秒杀系统作为商城的高并发扩展,在架构设计上严格遵循漏斗模型,层层过滤流量,保护后端核心服务。首先,系统通过Freemarker对商品详情页进行静态化,降低数据库压力。其次,下单URL采用MD5加密与验证码机制,有效防止刷单。库存扣减完全基于Redis的哨兵集群(一主三从)进行高性能扣减,扣减成功后,订单数据异步推送至RabbitMQ,由独立的订单消费模块进行数据库最终库存扣减,保证秒杀商品“宁可少卖,绝不超卖”的业务底线。此外,业务上限制单个用户仅能购买一件商品,避免恶意囤货。库存变化无需实时展示给前端,通过定时任务将剩余库存重新同步至Redis进行下一轮销售。
IM聊天系统则展现了其在长连接与高吞吐消息处理方面的能力。系统采用Netty实现TCP长连接,通过Redis存储App用户的连接会话信息,实现多节点间的通道寻址,并结合IdleStateHandler进行高效心跳保活。消息发送优先保证在线用户的即时触达,离线用户则仅存储未读消息状态。用户上线后,从服务端拉取消息并更新状态,其中最新的200条未读消息使用Redis的List结构暂存。系统采用Kafka作为消息缓冲层,通过用户ID哈希将海量消息分区存储,解决数据倾斜问题。最终,离线消息服务消费Kafka数据,并通过用户ID分表策略,将消息持久化至MongoDB,实现了超大用户规模下的消息存储与快速检索。