网络延迟

秒杀系统优化方案(上)吐血整理

匿名 (未验证) 提交于 2019-12-02 21:53:52
前一段时间好好研究了秒杀的问题,我把里面的问题好好总结了,可以说是比较全面的了,真的是吐血整理了。 由于我先是在word中整理的,格式都整理得比较好,放到博客上格式挺难调,暂时按word的格式来吧,有时间了在好好排版下。 主要需要解决的问题有两个: 高并发对数据库产生的压力 竞争状态下如何解决库存的正确减少(超卖问题) 优化的思路: 1) 尽量将请求拦截在系统上游 2)读多写少经量多使用缓存 3) redis缓存 +RabbitMQ+ mysql 批量入库 1.1 业务分析 秒杀系统业务流程如下: 由图可以发现,整个系统其实是针对库存做的系统。用户成功秒杀商品,对于我们系统的操作就是: 1. 减库存。2. 记录用户的购买明细。 下面看看我们用户对库存的业务分析: 记录用户的秒杀成功信息,我们需要记录: 1. 谁购买成功了。2. 购买成功的时间/ 有效期 。这些数据组成了用户的秒杀成功信息,也就是用户的购买行为。 为什么我们的系统需要事务 ? 1.若是用户成功秒杀商品我们记录了其购买明细却没有减库存。导致商品的 超卖 。 2.减了库存却没有记录用户的购买明细。导致商品的 少卖 。对于上述两个故障,若是没有事务的支持,损失最大的无疑是我们的用户和商家。在MySQL中,它内置的事务机制,可以准确的帮我们完成减库存和记录用户购买明细的过程。 当用户A秒杀id为10的商品时,此时 MySQL

网络瓶颈效应,如何选择语言编程

∥☆過路亽.° 提交于 2019-12-01 17:38:41
一、网络的瓶颈效应 上一节,我们讲到机器语言、汇编语言和高级语言,毫无疑问,机器语言和汇编语言我们可以放弃学习,谁想学让谁学去吧!我们重心可以放在高级语言上面,但是高级语言中的编译型语言和汇编型语言两者是互相矛盾的。这个时候对于不同的问题我们就应该有不同的策略,如果我们需要开发一个类似于操作系统这样要求执行速度并且开发周期长的系统,我们可以考虑使用编译型语言;如果我们需要开发一个跳一跳这样的娱乐软件,需要快速开发,我们可以考虑使用解释型语言。 最后,我们需要多说一嘴的是。如果只是开发互联网程序,我们更建议使用的是解释型语言。在了解为什么之前,我们首先给出一个木桶效应:木桶效应是讲一只水桶能装多少水取决于它最短的那块木板。好了,回归主题,将木桶效应是想告诉同学们,你在工业上开发一个项目的时候,你所开发的项目几乎都需要通过互联网传输数据。 假设一个程序使用编译型语言发送消息的执行效率为0.001ms;使用解释型语言的执行效率为0.1ms,但是,你要清楚是,互联网的网络延迟可能需要1ms,而你这靠语言节省下来的0.099ms相较于网络延迟的1ms可能无伤大雅,因为你发送第二条消息需要等网络延迟结束才能开始发送。这也就是互联网中的瓶颈理论。 原文出处: https://www.cnblogs.com/nickchen121/p/11069962.html 来源: https://www

1-5 互斥锁

余生长醉 提交于 2019-12-01 06:42:58
一 互斥锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的,而共享带来的是竞争,竞争带来的结果就是错乱,如下 #并发运行,效率高,但竞争同一打印终端,带来了打印错乱 from multiprocessing import Process import os,time def work(): print('%s is running' %os.getpid()) time.sleep(2) print('%s is done' %os.getpid()) if __name__ == '__main__': for i in range(3): p=Process(target=work) p.start() 如何控制,就是加锁处理。而互斥锁的意思就是互相排斥,如果把多个进程比喻为多个人,互斥锁的工作原理就是多个人都要去争抢同一个资源:卫生间,一个人抢到卫生间后上一把锁,其他人都要等着,等到这个完成任务后释放锁,其他人才有可能有一个抢到......所以互斥锁的原理,就是把并发改成穿行,降低了效率,但保证了数据安全不错乱 #由并发变成了串行,牺牲了运行效率,但避免了竞争 from multiprocessing import Process,Lock import os,time def work(lock): lock.acquire(

网络瓶颈效应

耗尽温柔 提交于 2019-11-30 19:16:14
网络瓶颈效应 一、网络瓶颈效应 上一节,我们讲到机器语言、汇编语言和高级语言,毫无疑问,机器语言和汇编语言我们可以放弃学习,谁想学让谁学去吧!我们重心可以放在高级语言上面,但是高级语言中的编译型语言和汇编型语言两者是互相矛盾的。这个时候对于不同的问题我们就应该有不同的策略,如果我们需要开发一个类似于操作系统这样要求执行速度并且开发周期长的系统,我们可以考虑使用编译型语言;如果我们需要开发一个跳一跳这样的娱乐软件,需要快速开发,我们可以考虑使用解释型语言。 最后,我们需要多说一嘴的是。如果只是开发互联网程序,我们更建议使用的是解释型语言。在了解为什么之前,我们首先给出一个木桶效应:木桶效应是讲一只水桶能装多少水取决于它最短的那块木板。好了,回归主题,将木桶效应是想告诉同学们,你在工业上开发一个项目的时候,你所开发的项目几乎都需要通过互联网传输数据。 假设一个程序使用编译型语言发送消息的执行效率为0.001ms;使用解释型语言的执行效率为0.1ms,但是,你要清楚是,互联网的网络延迟可能需要1ms,而你这靠语言节省下来的0.099ms相较于网络延迟的1ms可能无伤大雅,因为你发送第二条消息需要等网络延迟结束才能开始发送。这也就是互联网中的瓶颈理论。 来源: https://www.cnblogs.com/randysun/p/11637003.html

linux 网络带宽和延时测试

≡放荡痞女 提交于 2019-11-30 15:41:54
Linux下使用qperf命令来测试网络带宽和网络延迟 参考文章: https://access.redhat.com/solutions/2122681 若是没有安装qperf命令,请使用yum 安装该命令即可. 测试步骤: 找两个机器,一个作为qperf的服务器端,(服务器ip地址是192.168.80.50) 如下: [root@localhost ~]# qperf ------>>>>>系统会一直停在这个地方. 另外一个作为qperf的客户端: [root@localhost ~]# qperf -t 60 --use_bits_per_sec 192.168.80.50 tcp_bw tcp_bw: bw = 1.15 Gb/sec --------->>>这就是网络带宽 [root@localhost ~]# [root@localhost ~]# qperf -t 60 --use_bits_per_sec 192.168.80.50 tcp_lat tcp_lat: latency = 190 us --------->>>这就是网络延迟 [root@localhost ~]# qperf -t 60 --use_bits_per_sec 192.168.80.50 tcp_bw tcp_lat tcp_bw: bw = 1.58 Gb/sec--------->

Linux/Centos检测网络带宽与延迟

别等时光非礼了梦想. 提交于 2019-11-30 15:35:32
Linux下使用qperf命令来测试网络带宽和网络延迟 如果没有命令可以用yum安装,命令如下: #yum -y install qperf 如果没有yum 或者没有网络的情况下,依次安装以下rpm包,本次试验是在Centos6版本上做的,所使用的的包也是6版本的, 下载rpm包地址:Centos6/Redhat6 http://mirrors.163.com/centos/6/os/x86_64/Packages/ 或者可以加最下方微信免费获取 rpm包下载好以后,依次安装,命令如下: rpm –ivh --nodeps libibverbs-1.1.8-4.el6.x86_64.rpm rpm –ivh --nodeps librdmacm-1.0.21-0.el6.x86_64.rpm rpm –ivh qperf-0.4.9-1.el6.x86_64.rpm 这三个rpm包服务端和客户端都要安装 例如本次试验我测试192.168.0.129到192.168.0.91的带宽和延迟 那么192.168.0.91就是服务端,192.168.0.129是客户端 在192.168.0.91(服务端)执行下面命令: #qperf 如上图所示,执行命令后会一直停在那里,说明启动成功,然后去客户端执行命令测试 在192.168.0.129(客户端)执行下面命令 #qperf -t 60 -

网络的瓶颈效应

混江龙づ霸主 提交于 2019-11-30 06:26:03
网络的瓶颈效应 一、网络的瓶颈效应 上一节,我们讲到机器语言、汇编语言和高级语言,毫无疑问,机器语言和汇编语言我们可以放弃学习,谁想学让谁学去吧!我们重心可以放在高级语言上面,但是高级语言中的编译型语言和汇编型语言两者是互相矛盾的。这个时候对于不同的问题我们就应该有不同的策略,如果我们需要开发一个类似于操作系统这样要求执行速度并且开发周期长的系统,我们可以考虑使用编译型语言;如果我们需要开发一个跳一跳这样的娱乐软件,需要快速开发,我们可以考虑使用解释型语言。 最后,我们需要多说一嘴的是。如果只是开发互联网程序,我们更建议使用的是解释型语言。在了解为什么之前,我们首先给出一个木桶效应:木桶效应是讲一只水桶能装多少水取决于它最短的那块木板。好了,回归主题,将木桶效应是想告诉同学们,你在工业上开发一个项目的时候,你所开发的项目几乎都需要通过互联网传输数据。 假设一个程序使用编译型语言发送消息的执行效率为0.001ms;使用解释型语言的执行效率为0.1ms,但是,你要清楚是,互联网的网络延迟可能需要1ms,而你这靠语言节省下来的0.099ms相较于网络延迟的1ms可能无伤大雅,因为你发送第二条消息需要等网络延迟结束才能开始发送。这也就是互联网中的瓶颈理论。 来源: https://www.cnblogs.com/Lin2396/p/11568159.html

linux服务器测试性能

99封情书 提交于 2019-11-30 02:21:05
1)用到的工具以及指标 网络是python写的,各个自有aws节点主机到测试主机的网络延迟测试 cpu&内存&磁盘使用sysbench 综合评分使用的是unixbench 2)下载到需要测试机器的本地并执行 sudo wget -N --no-check-certificate https://raw.githubusercontent.com/learning2016/Server-evaluation/master/menu.sh && bash menu.sh 3)注意事项 步骤1是必须执行项 步骤2-8是可选项 来源: https://www.cnblogs.com/ccielife/p/11546484.html

装饰器

折月煮酒 提交于 2019-11-29 00:00:52
1. 开放封闭原则 什么是开放封闭原则?有的同学问开放,封闭这是两个反义词这还能组成一个原则么?这不前后矛盾么?其实不矛盾。开放封闭原则是分情况讨论的。 我们的软件一旦上线之后(比如你的软件主要是多个函数组成的),那么这个软件对功能的扩展应该是开放的,比如你的游戏一直在迭代更新,推出新的玩法,新功能。但是对于源代码的修改是封闭的。你就拿函数举例,如果你的游戏源代码中有一个函数是闪躲的功能,那么你这个函数肯定是被多个地方调用的,比如对方扔雷,对方开枪,对方用刀,你都会调用你的闪躲功能,那么如果你的闪躲功能源码改变了,或者调用方式改变了,当对方发起相应的动作,你在调用你的闪躲功能,就会发生问题。所以,开放封闭原则具体具体定义是这样: 1.对扩展是开放的 我们说,任何一个程序,不可能在设计之初就已经想好了所有的功能并且未来不做任何更新和修改。所以我们必须允许代码扩展、添加新功能。 2.对修改是封闭的 就像我们刚刚提到的,因为我们写的一个函数,很有可能已经交付给其他人使用了,如果这个时候我们对函数内部进行修改,或者修改了函数的调用方式,很有可能影响其他已经在使用该函数的用户。OK,理解了开封封闭原则之后,我们聊聊装饰器。 什么是装饰器?从字面意思来分析,先说装饰,什么是装饰? 装饰就是添加新的,比如你家刚买的房子,下一步就是按照自己的喜欢的方式设计,进行装修,装饰,地板,墙面,家电等等

LeetCode 网络延迟时间(图的最短路径问题)

拜拜、爱过 提交于 2019-11-28 13:48:25
问题描述: 有 N 个网络节点,标记为 1 到 N。 给定一个列表 times,表示信号经过有向边的传递时间。 times[i] = (u, v, w),其中 u 是源节点,v 是目标节点, w 是一个信号从源节点传递到目标节点的时间。 现在,我们向当前的节点 K 发送了一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1。 注意: N 的范围在 [1, 100] 之间。 K 的范围在 [1, N] 之间。 times 的长度在 [1, 6000] 之间。 所有的边 times[i] = (u, v, w) 都有 1 <= u, v <= N 且 0 <= w <= 100。 思路分析: 首先我们应该明白,从k传输到所有的的时间 = max (从k到点1所需要的最少时间,从k到2所需要的最少时间 … 从k到n所需要的最少时间),因为传输的过程是同时的。所以这道题就转换为图的最短路径求解问题。 请翻阅 图的最短路径:Floyd、DisjKstra、SPFA算法 我们先使用DisjKstra算法求出各个点到k的最短距离,然后求出这些距离中最大值。 //DisjKstra算法 class Solution { public : int networkDelayTime ( vector < vector < int >> & times , int N ,