转--分布式系统开发里必须要解决的3个技术问题

以前跟开发提过很多次,今天又有人出错了,看样子不经常提不行

这里记录一下,看到的开发人员都注意一下:

这3个问题经常出现,不解决的话,一定会造成经济损失的

1、同一个请求被发送了多次

可能出现的地方:(1)和别人接口对接,别人同一份数据发送了多次 (2)用户在“提交”按钮里点击了多次 (3) 其他可能的一些恶意调用,尤其是涉及支付环节的,危险性非常大

解决办法: (1) 在网页端,用户点击“提交”后,将按钮disable掉 (2) 对于收到的数据插入到数据库或者其他一些地方,做好唯一键控制

能够确定唯一的:订单号,或者几个字段拼凑在一起,或者把时间考虑进去,精确到分钟。整个md5一次,放到一个字段里,加个唯一键

2、同一秒内有多次请求

这个就是并发控制,涉及到抽奖等等需要控制到数量的地方,控制不好,会出现抽奖抽多了,卖东西卖超了等情况 出现的原因也很清晰,同一秒内收到多个请求,分布式的,可能不同的请求会分布到不同的机器或者程序上去执行,都去读取一下计数器(记录卖的数量),比如:1,每个请求都各自执行读取操作,发现都是1,没有超出1的限制,然后都来修改计数器为0,然后各自都去发货或者发送奖品,结果造成了卖超。

解决办法:

利用数据库或者其他有并发控制的程序来做一个锁的逻辑 利用数据库的话,有一个小技巧提供给大家 伪代码如下:

[php] view plain copy

  1. //字段A里存储的是计数器数字,控制最多奖品数量,1个奖品和多个奖品的逻辑有点不一样,注意下面的伪代码
  2. // 如果是1个奖品
  3. select A from 字段B;
  4. $a = A;
  5. if ( $a == 1)
  6. {
  7. update A=0 where A==1;
  8. //如果执行成功,则可以领取奖品
  9. //这样可以控制并发时只卖掉一个奖品
  10. }
  11. // 如果是N个奖品
  12. select A from 字段B;
  13. $a = A;
  14. if ( $a <= N)
  15. {
  16. update A=A-1 where A<=N and A > 0;
  17. //如果执行成功,则可以领取奖品
  18. //这样可以控制并发时只卖掉N个奖品
  19. }

3、分布式系统里的超时控制

如果有这样一个分布式业务:用户购买东西,扣钱成功后发货,发货失败的话,退钱给用户

如果A负责处理业务逻辑

B负责扣钱 C负责发货 D负责退钱 正常逻辑1:A调用 B扣钱成功的话,C发货 正常逻辑2:A调用B扣钱,扣钱成功,调用C发货,C发货失败,调用D退钱 那么A调用C的超时时间一定要足够大,大于C处理发货的时间

否则会出现一种情况: A调用C发货,超时了,A以为发货失败了,调用D给别人退钱了,结果C发货是成功的,D也把钱退了 所以A调用C发货的系统超时时间一定要远远大于C处理发货的最大时间

原文发布于微信公众号 - Golang语言社区(Golangweb)

原文发表时间:2016-03-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏加米谷大数据

Kafka Consumer的配置

FlinkKafkaConsumer08可以消费一个或多个Kafka topic的数据,它的构造器需要接收以下参数:

2041
来自专栏数据和云

使用 Oracle 的 Security External Password Store 功能实现数据库加密登陆

编辑手记:让安全成为一种习惯,使用 Oracle 的 Security External Password Store 功能实现加密登录, 不将明文密码暴露在生...

4896
来自专栏我是攻城师

Hadoop2.7.1和Hbase0.98添加LZO压缩

3327
来自专栏技术博文

H5缓存机制浅析

1 H5 缓存机制介绍 H5,即 HTML5,是新一代的 HTML 标准,加入很多新的特性。离线存储(也可称为缓存机制)是其中一个非常重要的特性。H5 引入的离...

4358
来自专栏Ryan Miao

Javascript跨域后台设置拦截

子域名之间互相访问需要跨域 结论放在开头: 服务端必须设置允许跨域 客户端带cookie需要设置withCredentials 无论服务端是否允许跨域,该req...

2788
来自专栏大数据实战演练

Ambari2.7整体编译+安装使用

出错的Java文件编码和CheckStyle设置的编码不同。CheckStyle里设置的编码是UTF-8

4221
来自专栏北京马哥教育

Linux进程及作业管理

一、进程查看及其管理工具 ps命令:报告当前进程的快照信息 ps - report a snapshot of the current processes....

3535
来自专栏何俊林

一个强大的网络库RxEasyHttp

本文来自周游的投稿,封装的网络请求库,github:https://github.com/zhou-you/RxEasyHttp,欢迎点击【阅读原文】,查看更多...

4038
来自专栏互联网技术栈

Redis 队列

举例: 队列主要用在系统解耦、流量削峰、异步处理、数据顺序处理等场景。新手在使用时可能会犯一些常见的错误。下面讲一个新手容易犯的错误,在这个示例中把队列的入...

4935
来自专栏24K纯开源

Windows下程序打包发布时的小技巧

一、背景     Windows下开发的应用程序在发布时,需要将其依赖的一些动态链接库一起打进安装包里面去。这个时候,快速确定这个程序到底依赖哪些动态链接库变得...

2746

扫码关注云+社区

领取腾讯云代金券