使用 sponge + dtm 轻松实现秒杀抢购服务(HTTP),彻底解决库存与订单数据不一致的难题

news2024/11/17 9:56:45

秒杀场景的挑战

秒杀是电商中常见的抢购商品场景,其技术特点是瞬间请求量巨大,对服务的性能和一致性要求极高。即使服务出现崩溃,也必须确保库存扣减和订单生成保持一致,避免出现超卖或超买的现象。通过使用 dtm(分布式事务管理器),可以轻松解决库存与订单数据不一致的问题。


构建秒杀服务

秒杀服务(http)代码由 sponge 自动生成(选择 ⓷基于 protobuf 创建 web 服务),开发者只需在生成的模板代码文件 (例如 internal/handler/flashSale.go) 中填写秒杀相关的业务逻辑。

下图是生成代码的界面:

在这里插入图片描述

解压代码,切换到项目目录(如 flashSale 目录),执行以下命令:

# 生成代码
make proto

# 打开 internal/handler/flashSale.go 文件,按照生成的示例代码添加业务逻辑代码。

# 编译并启动服务
make run

更详细的 sponge 创建 web 服务的开发文档请参考:sponge Web 开发文档。

这是添加业务逻辑后的flashSale服务代码。


快速开始

  1. 启动 Redis 服务

  2. 启动 dtm 服务

    • 下载 dtm 可执行文件,修改 dtm 默认配置以使用 Redis 作为存储,并启动 dtm 服务:
      dtm -c conf.yml
      
  3. 配置项目

    • 克隆项目代码flashSale到本地,打开配置文件 configs/flashSale.yml,修改 Redis 和 dtm 的配置项,将默认的 IP 地址(如 192.168.3.37 和 192.168.3.90)替换为实际环境中的 IP 地址(如果所有服务在本地运行,填写127.0.0.1即可)。
  4. 编译并启动服务

    • 可以直接使用以下命令编译并运行服务:
      cd cmd/flashSale
      go run main.go
      
    • 或者,如果已安装 sponge,直接运行以下命令启动服务:
      make run
      
  5. 测试秒杀 API

    • 在浏览器中访问 http://localhost:8080/apis/swagger/index.html,通过 Swagger UI 测试秒杀抢购 API。

    在这里插入图片描述

    API 测试示例:

    1. 设置库存 API

      • 请求示例参数:
        {
          "productID": 1,
          "stock": 3
        }
        
    2. 秒杀请求 API

      • 请求示例参数:
        {
          "productID": 1,
          "amount": 100,
          "userID": 1
        }
        
      • 如果库存不足,则返回 409 状态码,表示秒杀失败。
  6. 性能压测api

    在进行性能压测时,为避免终端日志输出影响服务性能,建议将服务以后台模式运行。已安装 sponge 的情况下,可使用以下命令在后台启动服务:

    make run-nohup
    

    使用ab、wrk等压测工具进行压测api。


总结

通过结合 sponge 和 dtm,可以快速搭建一个高性能、高可靠的秒杀服务,彻底解决库存与订单数据不一致的问题。该方案不仅简化了开发流程,还能显著提升服务的并发处理能力和稳定性,是构建电商秒杀系统的理想选择。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2168302.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于Springboot+Vue的高校体育运动会比赛系统(含源码+数据库)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 3.功能 该系统…

根据软件架构设计与评估的叙述开发一套机器学习应用开发平台

案例 阅读以下关于软件架构设计与评估的叙述,回答问题 1和问题 2。 【说明】 某公司拟开发一套机器学习应用开发平台,支持用户使用浏览器在线进行基于机器学习的智能应用开发活动。该平台的核心应用场景是用户通过拖拽算法组件灵活定义机器学习流程&…

如何用一段文字或一张图片生成一段视频?

找了下AI视频工具的排行,发现在这款国内好多大模型的AI视频工具都排在前面。测试了好几款,整体感觉还是非常不错,除了生成的时间比较短,清晰度和效果比自己找的会好很多。 AI视频工具文成视频成品展示 一个视频生成的时间大概是5-…

【CTF刷题8】2024.9.26

ps:源自CTFhub 基础认证: 在HTTP中,基本认证(英语:Basic access authentication)是允许http用户代理(如:网页浏览器)在请求时,提供 用户名 和 密码 的一种方式。详情请查…

什么是智慧党建?可视化大屏如何推动高质量党建?

在数字化时代,党建工作迎来了新的发展机遇。智慧党建,作为新时代党建工作的创新模式,正逐渐成为推动党的建设向高质量发展的重要力量。它不仅改变了传统的党建工作方式,还通过现代信息技术的应用,提升了党建工作的效率…

HttpSession使用方法及原理

HttpSession使用方法及原理 一、HttpSession使用流程说明二、登录概述具体 三、访问过程概述具体 一、HttpSession使用流程说明 1.用户发送登录请求到服务器。 2.服务器处理登录请求,调用userService.login(loginUser)。 3.如果登录成功,服务器调用requ…

LeetCode(Python)-贪心算法

文章目录 买卖股票的最佳时机问题穷举解法贪心解法 物流站的选址(一)穷举算法贪心算法 物流站的选址(二)回合制游戏快速包装 买卖股票的最佳时机问题 给定一个数组,它的第 i 个元素是一支给定股票第 i 天的价格。如果你…

大数据新视界 --大数据大厂之数据清洗工具 OpenRefine 实战:清理与转换数据

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

linux命令:显示已安装在linux内核的模块的详细信息的工具modinfo详解

目录 一、概述 二、使用方法 1、基本的使用语法 2、常用选项 3、输出字段 4、获取帮助 三、示例 四、实际用途 1、诊断问题 2、模块依赖 3、参数配置 五、其他事项 一、概述 modinfo 是 Linux 系统中的一个工具,用于显示有关已安装内核模块的详细信息。…

MySQL 预处理语句:强大的数据库工具

《MySQL 预处理语句:强大的数据库工具》 在 MySQL 数据库的使用中,预处理语句是一个非常有用的功能。它可以提高数据库的性能、安全性和可维护性。那么,什么是预处理语句呢?它又有哪些优点呢?让我们一起来了解一下。 …

C++_24_适配器

A 函数对象 概念&#xff1a; ​ 重载函数调用运算符的类实例化的对象&#xff0c;就叫函数对象.又名仿函数,函数对象和&#xff08;)触发重载函数调用运算符的执行。 作用&#xff1a; ​ 为算法提供策略 示例&#xff1a; #include <iostream> using namespace s…

OCI 简介:Kubernetes 环境下从代码到容器的全流程

OCI 简介 在容器化技术的演进中&#xff0c;OCI&#xff08;Open Container Initiative&#xff09;提供了一套标准化的规范&#xff0c;帮助统一容器的构建、分发和运行。OCI 规范包含三个部分&#xff1a; OCI Image-spec&#xff1a;定义了容器镜像的结构&#xff0c;确保…

自闭症儿童寄宿学校揭秘:全方位呵护孩子成长

自闭症儿童寄宿学校揭秘&#xff1a;星贝育园——全方位呵护孩子成长的温馨港湾 在繁华的广州城&#xff0c;有一所专为自闭症儿童打造的温馨家园——星贝育园自闭症儿童寄宿制学校。这里&#xff0c;不仅是一个提供专业康复训练的地方&#xff0c;更是一个充满爱与关怀的成长…

DVWA 靶场环境搭建

作者&#xff1a;程序那点事儿 日期&#xff1a;2024/09/15 09:30 什么是DVWA: 是OWSASP官方编写的PHP网站&#xff0c;包含了各种网站常见漏洞&#xff08;漏洞靶场&#xff09;&#xff0c;可以学习攻击及修复方式。 PHP环境包含了&#xff0c;Windows/Apache/Mysql/Php g…

【小程序】微信小程序课程 -2 快速上手

目录 1、快速上手基本概念 1.1 小程序常用组件 1.2 tabbar配置 1.3 尺寸单位 1.4 样式 1.4.1 全局样式 app.wxss 1.4.2 局部样式 xx.wxss 2、首页案例 2.1 button组件使用 2.2 swiper swiper-item 2.3 tips效果 2.4 引入矢量图 2.5 flex&#xff08;布局&#…

11. Map和Set

一、二叉搜索树 1. 概念 二叉搜索树又称二叉排序树&#xff0c;它或者是一棵空树&#xff0c;或者是具有以下性质的二叉树&#xff1a; 若它的左子树不为空&#xff0c;则左子树上所有节点的值都小于根节点的值若它的右子树不为空&#xff0c;则右子树上所有节点的值都大于根…

一篇文章讲清楚synchronized关键字的作用及原理

概述 在应用Sychronized关键字时需要把握如下注意点&#xff1a; 一把锁只能同时被一个线程获取&#xff0c;没有获得锁的线程只能等待&#xff1b; 每个实例都对应有自己的一把锁(this),不同实例之间互不影响&#xff1b;例外&#xff1a;锁对象是*.class以及synchronized修…

Docker全家桶:Docker Compose项目部署

在学习完了前面的基础知识之后&#xff0c;我们现在可以开始部署完整的项目了。项目分成两个部分&#xff0c;前端和后端&#xff0c;并且采用前后端分离的形式。对应到docker&#xff0c;就是前端和后端分别对应一个容器。把这两个容器加入到同一个网段中&#xff0c;就能够进…

iOS OC 底层原理之 category、load、initialize

文章目录 category底层结构runtime 执行 category 底层原理添加成员变量 load调用形式系统调用形式的内部原理源码实现逻辑 initialize调用形式源码核心函数&#xff08;由上到下依次调用&#xff09;如果分类实现了 initialize category 底层结构 本质是结构体。struct _cat…

找不到MSVCR100.dll怎么办,解决MSVCR100.dll丢失的六种方法

在计算机的日常使用中&#xff0c;我们可能会遇到各种各样的问题&#xff0c;其中之一就是MSVCR100.dll文件丢失。这个文件是Microsoft Visual C 2010的一个组件&#xff0c;如果丢失&#xff0c;可能会导致某些程序无法正常运行。那么&#xff0c;如何解决这个问题呢&#xff…