TeamsApp LukcyDraw升级之路 之 DB Infra 篇

news2024/11/15 22:30:59

今天继续 LuckyDraw 的升级之路,之前在1500以上用户同时使用的时候,特别是在短时间内大家一起点击参与抽奖参的时候,服务会出现大量的错误,分析后发现,出现错误的原因基本都是 Azure Storage Table 返回的。当时使用 Azure Storage Table 的最最主要原因是它便宜,太便宜,真心便宜!缺点就是:

  • 要花大量的时间去设计数据表,从而在查询的时候能得到较好的效率
  • 不能跨表查询,不能join,这也就又回到第一点,需要花大量的时间去设计数据表的结构
  • 不支持很长的字段,需要分几列存储
  • 没有很好的测试库,不像EF Core,可以使用 in-memory db 来测试
  • 并发请求有上限,当短时间内有大量请求时,会报错。

最初设计的时候只是考虑了几百人一起抽奖的情况,也没有特别考虑到上千人的抽奖。

所以,这次决定改成 Azure SQL,原因是 Azure SQL 有最低最便宜的配置,也有超高配置,配置的scale up,scale down 非常方便,而且 Azure SQL 也有自动的备份机制,当出现问题的时候,可以很方便的回退版本。

说干就干,我分了 3 步来完成 DB 的 infra 升级。

第一步 增加 SQL Server 和 Database 资源

我先在 arm template 里增加 sql server 和 database 资源,下面是简化后的 arm 配置。

    {
      "type": "Microsoft.Sql/servers",
      "name": "[variables('sqlServerName')]",
      "apiVersion": "2019-06-01-preview",
      "properties": {
        "administratorLogin": "sqladmin",
        "administratorLoginPassword": "[parameters('databasePassword')]",
        "version": "12.0"
      },
      "resources": [ ... ]
    },
    {
      "type": "Microsoft.Sql/servers/databases",
      "name": "[concat(variables('sqlServerName'), '/main')]",
      "apiVersion": "2020-08-01-preview",
      "sku": {
        "name": "[parameters('sqlDatabaseSkuTier')]",
        "tier": "[parameters('sqlDatabaseSkuTier')]",
        "capacity": "[parameters('sqlDatabaseSkuCapacity')]"
      },
      "dependsOn": [
        "[variables('sqlServerName')]"
      ]
    },

可以看到我指定了数据库的 SKU,但没有写死,而是通过参与传入,这样我可以在我的 dev,uat 环境下使用较低的 basic DTU 5 的配置,这个最便宜。在生产环境使用较高的配置,来处理高并发的情况。

在上面的 resources 节点下,我增加了网络防火墙和管理员配置,如下:

        {
          "type": "firewallrules",
          "name": "AllowAllWindowsAzureIps",
          "apiVersion": "2014-04-01",
          "properties": {
            "endIpAddress": "0.0.0.0",
            "startIpAddress": "0.0.0.0"
          },
          "dependsOn": [
            "[concat('Microsoft.Sql/servers/', variables('sqlServerName'))]"
          ]
        },
        {
          "type": "administrators",
          "name": "ActiveDirectory",
          "apiVersion": "2014-04-01",
          "properties": {
            "administratorType": "ActiveDirectory",
            "login": "LuckyDrawEngineers",
            "sid": "[parameters('luckyDrawEngineersObjectId')]",
            "tenantId": "[subscription().tenantId]"
          },
          "dependsOn": [
            "[concat('Microsoft.Sql/servers/', variables('sqlServerName'))]"
          ]
        }

从上面可以看到,我首先允许 azure 的服务来访问这个数据库,这样的话,我的 lucky draw bot api就可以访问这个数据库了。

然后我增加了管理员,我在AzureAD 里创建了一个secuirity group,叫 LuckyDrawEngineers,这样如果有需要,我可以将我自己加入到这个 group,从而就有了对这个数据库的管理权限。

第二步 添加 long-term retention

默认情况下,数据库有 7 天备份,但是我想有更加老的数据备份,以防止一些突然灾难。在 azure portal 里直接上可以手动操作。

但是我是一个有代码控的人,这个也必须使用 ARM 来解决。

    {
      "type": "Microsoft.Sql/servers/databases/backupLongTermRetentionPolicies",
      "apiVersion": "2022-05-01-preview",
      "name": "[concat(variables('sqlServerName'), '/main/default')]",
      "dependsOn": [
        "[concat('Microsoft.Sql/servers/', variables('sqlServerName'))]",
        "[resourceId('Microsoft.Sql/servers/databases', variables('sqlServerName'), 'main')]"
      ],
      "properties": {
        "weeklyRetention": "P3W",
        "monthlyRetention": "P2M",
        "yearlyRetention": "P1M",
        "weekOfYear": 1
      }
    },

第三步 资源锁定

虽然我一般都不会手动去修改 azure 资源的配置,通常都是通过代码去新建删除资源,但为了防止不小心的人为删除数据库,我还是决定添加一个 lock,这个 lock 有两个级别:一个是防止修改,一个是防止删除。

操作比较简单,先进入 SQL server 资源,点击左边菜单的 Lock,然后点击 “Add” 按钮,输入一个名字,我这里叫它 avoid-deletion,然后 lock type 选择 delete,保存就好了。这样我就可以放心的使用了。

下一篇,我来讲讲我如何把 lucky draw bot api 代码升级,既能支持 azure storage table,同时也支持 SQL DB。

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

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

相关文章

【GRU回归预测】基于matlab卷积神经网络结合门控循环单元CNN-GRU数据预测(多输入单输出)【含Matlab期源码 2274期】

⛄一、CNN-GRU数据预测 1 理论基础 1.1 CNN算法 负荷序列数据为一维数据,用一维卷积核对数据进行卷积处理,以获取数据的特征。 现设定卷积核的维度为3,移动步长为1,对输入数据进行卷积,以获得特征图图谱,即…

记录那不用百度的美好代码

努力工作,日益消瘦,总有些代码不想记住。我称之为:拿来即用系列 一:格式化时间 1.去除时间的T // 去除日期中T function timeFormatSeconds(time) {if(!time) return time;var date time.substr(0, 10); //年月日var hours ti…

jsp+ssm计算机毕业设计宠物商城【附源码】

项目运行 环境配置: Jdk1.8 Tomcat7.0 Mysql HBuilderX(Webstorm也行) Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。 项目技术: JSPSSM mybatis Maven等等组成,B/S模式 Mave…

基于SPRINGBOOT的健康饮食管理系统

11-8开发工具(eclipse/idea/vscode等): 数据库(sqlite/mysql/sqlserver等): 功能模块(请用文字描述,至少200字): 基于springboot框架,通过对事物健康程度的总结与归纳,进行软件设计,并通过优秀的…

go 语言Http服务器远程执行shell命令

背景 想要在服务器上起一个http服务器,用来远程执行shell命令并且返回。 基础版 package mainimport ("io""log""net/http" )func main() {// Hello world, the web serverhelloHandler : func(w http.ResponseWriter, req *http.R…

性能脚本:用案例和图示帮你理解HTTP协议

当前使用得最为广泛的应用层协议就是 HTTP 了。我想了好久,还是觉得应该把 HTTP 协议写一下。 因为做性能测试分析的人来说,HTTP 协议可能是绕不过去的一个槛。在讲 HTTP 之前,我们得先知道一些基本的信息。 HTTP(HyperText Transfer Protocol,超文本传输协议),显然是…

linux shell编程

linux shell编程1.shell脚本概述2.脚本的调用形式3.shell脚本语法3.1 脚本开头标识3.2 脚本注释3.3 给脚本加上可执行权限3.4 shell脚本的运行方式3.5 检测脚本是否正确3.6 重定向的使用3.7 获取上一条命令的执行结果4.变量4.1 变量的定义和使用4.2 从键盘上读取变量&#xff1…

(十七)Vue之自定义指令

文章目录自定义指令局部指令回调函数形式配置对象形式全局配置回调函数形式配置对象形式Vue学习目录 上一篇:(十六)Vue之内置指令 先看两个需求: 需求1:定义一个v-big指令,和v-text功能类似,…

陈表达学VBA-msgbox辨别用户选择和代码调用

今天有个老客户提出需求: 模块:sub 过程A( ) ①如果是单独使用时则显示msgbox选择消息框 ②如果A过程调用B过程,则不显示消息框,默认选择是 msgbox没有设置默认值这个功能,msgbox也没有参数可以失败是用户点击还是代…

pytorch基础操作(六)利用L2范数(权重衰减)解决线性模型过拟合问题

一、一些概念 训练误差(training error) 是指,模型在训练数据集上计算得到的误差。 泛化误差(generalization error) 是指,模型应⽤在同样从原始样本的分布中抽取的⽆限多数据样本时,模型误差的…

【Linux】Linux基本指令

Linux基本指令1.ls指令2.pwd指令3.cd指令3.touch 指令4.mkdir指令5. rmdir指令 && rm 指令5.1 rmdir5.2 rm6.tree 指令7.man指令8.cp指令9.mv指令10. cat指令11.echo指令12.more指令13.less指令14.wc指令15.head指令16.tail指令17. | (管道指令)…

每天五分钟机器学习:PCA算法如何确定数据压缩降维的最佳维度?

本文重点 上节课程中我们已经学习了pca算法,已经知道了如何将n维特征变量降到k维,k是PCA算法的一个参数,也被称为主成分的数量。那么现在就产生了一个问题,这个问题就是如何选择K,因为PCA要做的就是要尽量减少投射的平均均方误差,所以K的选择很关键。 平均均方误差 其中…

22.MongoDB删除操作效率及相关问题验证

最近遇到一个了一个MongoDB数据删除的问题,需要一次性删除上线即1.5年前~1年前的数据且之后每天清空一年过期的数据。在数据量比较大的情况下何种方式的删除效率最高是一个值得研究的问题,本文通过实际测试找出其中规律。 本文采用腾讯云mongodb集群进行…

基于java的连连看游戏设计-计算机毕业设计

项目介绍 基于java设计的连连看游戏规则是模仿网络上的最普通的连连看游戏,主要是鼠标点击两次的图片能否消去的问题。当前,前提是点击两张相同的图片,若是点击的是同一张图片或者两张不同的图片,则不予处理。在两张相同的图片所…

这份pdf成功让我拿下了蚂蚁金服、字节跳动、小米等大厂的offer

关于程序员,除了做项目来提高自身的技术之外,还有一种提升自己的专业技能就是:多!看!书! 小编整理出一篇Java进阶架构师之路的核心知识,同时也是面试时面试官必问的知识点,篇章也是…

点云可视化工具

点云可视化工具 平时查看点云文件主要是用CloudCompare,基本上也就是打开看看这个点云大概是个什么样子,很少会在CloudCompare对点云进行处理,它可以直接将点云拖进软件进行显示也还是挺方便的。但是还是有点点不是很方便的地方,…

Linux从入门到进阶学习(Ⅲ):Linux权限管控

目录 1 root用户 1.1 su 1.2 sudo 2 用户和用户组 3 查看权限控制信息 4 修改权限控制 4.1 chmod命令 4.2 chown命令 1 root用户 1.1 su root用户即超级管理员 su [-] [用户名] 切换到root用户,exit退回普通用户从 -:可选&#xff0…

社会网络分析工具—— Gephi 或 NetworkX的简单介绍和比较(源自GPTchat)

文章目录我的原始需求两个工具介绍二者比较下载和使用后续 使用教程我的原始需求 如何对不同认知课堂的教师提问行为序列进 行社会网络分析,计算不同认知层级提问行为的中间 中心度和接近中心度, 在进行社会网络分析时,您首先需要收集数据并…

ArcGIS基础:栅格转ASCII校正简单栅格坐标

【校正栅格坐标】 有一些数据量比较小的栅格数据,位置发生了偏移,可以使用【转换工具】对其位置进行校正。 先看一下原始数据: 有2个栅格数据,如下所示,两个数据本身是一个数据,只不过发生了偏移&#x…

java+ssh+mysql银行收银管理系统

项目介绍: 本系统为基于jspmysql的银行管理系统,包含业务员、管理员登录权限,功能如下: 业务员:可以银行系统,可以查看所有客户账户信息、可以新开账户、销户、修改账户信息、存款、取款、转账等功能。 …