实现百万并发的服务器端框架图解

本文内容转自:Golang实现百万并发
但内容并不局限于Go语言,而是服务器框架都要解决的问题,原文用图示简单易懂,转来这里是为了以后复习。
以下是具体内容:

这篇文章源自Handling 1 Million Requests per Minute with Go。原文中的例子是一个HTTP服务器,将上传的Json文档写入亚马逊的简单存储服务(S3)。这是一个异步服务,不需要等到存储真正完成,收到请求后可以立刻返回。

在这里我们用一个例子来类比上面的工作,有一条传送带(网络),源源不断的运来小球(来自客户端的请求),在远处有一个箱子(Amazon S3)。我们的任务就是把这些小球放到箱子里。

在这里插入图片描述
我们想到的第一个方法是,每来一个球,我们就雇一个人(goroutine)把这个球放到远处的箱子里。这样做乍看上去效率很高,比如一次来了10个球,我们就同时叫10个人一人拿一个球,10个人的行动是同时进行的。但如果同时送来了1000个球呢,难道找1000个人,不要说1000个人站都没地站,就是报酬也付不起啊。
在这里插入图片描述
既然人太多了不好使,那干脆就只找一个人,在传送带的尽头再放一个筐(缓存队列),传送带运过来的小球,先掉到筐里,那个人再从筐里拿一个球,放到箱子里,再回来,如此往复。还是那个问题,如果球送来的的很快,人即使跑的再快,也赶不上球过来的速度,结果就是筐很快被填满。我们这是只好停掉传送带(阻塞请求),等把筐清理出一些空间之后,再恢复。显然,这种方法效率不会太高。
在这里插入图片描述
我们想到的第三个方法结,是把前面两个方法结合起来,我们还会在传送带尽头放一个筐,并且雇11个人,其中10个人每人发给他们一个盒子,里面可以放一个小球。告诉他们按照下面的方法工作。
1、没有盒子的那个人(原文中的dispatcher)站在筐的旁边,在他前面放一张长桌(Queue),长桌上如果有空盒子,并且筐里有球,就把筐里的球放到到空盒子里。
2、有盒子的人(worker)把盒子放到上面提到的长桌上,然后什么也不做(阻塞),一直盯着自己个盒子,直到dispatcher把一个球放到里面。然后他抱着自己的盒子,跑到箱子哪里把盒子里的球放到箱子里,然后再回来把空盒子放到长桌上,如此往复。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
代码这里就不贴了,建议大家去看原文Handling 1 Million Requests per Minute with Go,写的非常详细。

——————————————
版权声明:本文为CSDN博主「imyuyufei」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/sinat_26058371/article/details/86634296

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值