热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

方圆的秒杀系统优化方案实战,(一)想说的话

1.希望能有用大家好,我是方圆。之前在部门业务中开发过类似秒杀的功能,但是因为QPS并不是很高,所以使用到的技术栈和指定的业务方案比较简

1. 希望能有用

大家好,我是方圆。之前在部门业务中开发过类似秒杀的功能,但是因为QPS并不是很高,所以使用到的技术栈和指定的业务方案比较简单。

但是对此并不满意,再加上之前校招的时候跟着视频写过一个秒杀系统,回头看它觉得它实在是太low了,借着这些引子,想把那些网上听过的不错解决方案实现。

为了方便大家参考和仿写,或者是从0到1的开发,我打算创建不同的分支来保存具体的改动,它也像是这个秒杀系统不断演进一样,能够面对更大规模的并发量。

2. 分支介绍

目前该项目做到的优化包括缓存、限流和异步削峰,点击进入该项目Github 。

  • master:主分支将集成秒杀系统所有的功能,它是秒杀系统的完全体
  • base-framework:这个分支只是搭了一个架子,添加了一些通用的实体类,保留它的目的是方便大家从0到1的去实现这个秒杀项目,只不过需要大家根据自己的环境更改一下配置
  • base-function:这个分支保留的是这个系统的最基础的针对秒杀活动、秒杀商品、订单的CRUD功能,未进行任何针对高并发的优化,大家也可以从这个分支开始,但是这个项目采用的是DDD架构,推荐考虑也把这个分支的代码写一写,更好的理解DDD
  • increase_local_cache:这个分支是缓存设计的开始,对应本地缓存,是在base_function分支上进行开发的
  • increase_distributed_cache:在本地缓存的基础上引入分布式缓存,它是在increase_local_cache分支基础上进行开发的
  • increase_refresh_cache:该分支对应秒杀活动、商品在执行发布、上线和下线操作时对缓存的更新的代码
  • increase_stock_cache:对应商品库存在缓存中的初始化、扣减和增加相关的代码
  • increase_sentinel:在缓存的基础上,添加限流,并使用Nacos进行配置
  • increae_mq:借助MQ异步实现削峰

3. 项目介绍


3.1 DDD架构


各个层次的依赖关系如下

在这里插入图片描述

  1. flash-sale-app 应用层,主要放的是service实现
  2. flash-sale-controller controller层,处理API请求和业务异常的处理
  3. flash-sale-domain 领域层,在我们的系统中,它不依赖任何层级,是最干脆和整洁的一层
  4. flash-sale-infrastructure 基础设施层,为上面各层提供通用的技术能力,包括消息处理持久化机制缓存处理
  5. flash-fale-start 启动服务,Application和配置都在这一层

3.2 使用的组件


  • mybatis-plus:为了避免手写简单SQL,集成进来再方便不过
  • swagger3.0:懒得用postman,方便的页面API调用,访问http://localhost:8090/api/swagger-ui/即可使用,也能在项目启动的时候发现它
  • Redis:分布式缓存使用的Redis,也是必须会的中间件
  • Kafka:异步削峰借助Kafka实现
  • Sentinel:限流
  • Nacos:限流配置文件和yaml配置文件,实现配置文件中内容的及时更新以控制定时任务的执行

4. 结语

这篇文章起稿于2月24日,完稿于4月中旬,由于工作在身,开发全都是在休息时间。但是写到分库分表解决更大型秒杀场景的时候,觉得心有余而力不足,看了一些别人的秒杀解决方案之后,发现自己忽略掉了很多细节,还有很大的优化空间:缓存的去中心化、保证Redis的高可用性、布隆过滤器、Niginx负载均衡、分布式事务等等,我目前做的这些相比于高大上的解决方案就像是洒了洒水…

但是这个项目也有值得参考的地方,因为它是我一步步自己写出来的,保证每一步都能实现,另外它还有详细的注释和我开发过程中的体会。还有它体现的是我的代码习惯,受《代码整洁之道》影响,我有信心它会对大家有一些参考价值。以它现在的阶段,其实我觉得并不适合写在简历上,虽然比我当时校招时的秒杀项目要完善,但是当我发现有很多很多优秀解决方案的项目时,还是觉得这个项目更像是一个玩具…

如果未来再有机会,再写吧…

5. 巨人的肩膀


  • 《高并发秒杀的设计精要与实现》,它的代码可读性比较差,有些乱
  • 《图解 Kafka 之实战指南》
  • GitHub:如何设计一个秒杀系统
  • 《Java秒杀系统方案优化 高性能高并发实战》,别去看这个慕课网的课了,很low
  • 《代码整洁之道》
  • 《京东秒杀架构升级优化实践》

推荐阅读
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • t-io 2.0.0发布-法网天眼第一版的回顾和更新说明
    本文回顾了t-io 1.x版本的工程结构和性能数据,并介绍了t-io在码云上的成绩和用户反馈。同时,还提到了@openSeLi同学发布的t-io 30W长连接并发压力测试报告。最后,详细介绍了t-io 2.0.0版本的更新内容,包括更简洁的使用方式和内置的httpsession功能。 ... [详细]
  • 本文讨论了clone的fork与pthread_create创建线程的不同之处。进程是一个指令执行流及其执行环境,其执行环境是一个系统资源的集合。在调用系统调用fork创建一个进程时,子进程只是完全复制父进程的资源,这样得到的子进程独立于父进程,具有良好的并发性。但是二者之间的通讯需要通过专门的通讯机制,另外通过fork创建子进程系统开销很大。因此,在某些情况下,使用clone或pthread_create创建线程可能更加高效。 ... [详细]
  • 统一知识图谱学习和建议:更好地理解用户偏好
    本文介绍了一种将知识图谱纳入推荐系统的方法,以提高推荐的准确性和可解释性。与现有方法不同的是,本方法考虑了知识图谱的不完整性,并在知识图谱中传输关系信息,以更好地理解用户的偏好。通过大量实验,验证了本方法在推荐任务和知识图谱完成任务上的优势。 ... [详细]
  • vue使用
    关键词: ... [详细]
  • PHP图片截取方法及应用实例
    本文介绍了使用PHP动态切割JPEG图片的方法,并提供了应用实例,包括截取视频图、提取文章内容中的图片地址、裁切图片等问题。详细介绍了相关的PHP函数和参数的使用,以及图片切割的具体步骤。同时,还提供了一些注意事项和优化建议。通过本文的学习,读者可以掌握PHP图片截取的技巧,实现自己的需求。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • 开发笔记:计网局域网:NAT 是如何工作的?
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了计网-局域网:NAT是如何工作的?相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 闭包一直是Java社区中争论不断的话题,很多语言都支持闭包这个语言特性,闭包定义了一个依赖于外部环境的自由变量的函数,这个函数能够访问外部环境的变量。本文以JavaScript的一个闭包为例,介绍了闭包的定义和特性。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • Go GUIlxn/walk 学习3.菜单栏和工具栏的具体实现
    本文介绍了使用Go语言的GUI库lxn/walk实现菜单栏和工具栏的具体方法,包括消息窗口的产生、文件放置动作响应和提示框的应用。部分代码来自上一篇博客和lxn/walk官方示例。文章提供了学习GUI开发的实际案例和代码示例。 ... [详细]
  • 本文介绍了OkHttp3的基本使用和特性,包括支持HTTP/2、连接池、GZIP压缩、缓存等功能。同时还提到了OkHttp3的适用平台和源码阅读计划。文章还介绍了OkHttp3的请求/响应API的设计和使用方式,包括阻塞式的同步请求和带回调的异步请求。 ... [详细]
author-avatar
奇丶葩故事会
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有