作家
登录

如何用Go语言每分钟处理100万个请求

作者: 来源: 2017-09-15 10:52:23 阅读 我要评论

51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦!

在恰本地设备了集群和主动缩放设置今后,我们可以或许把它降低到仅有4x EC2 c4。如不雅CPU持续5分钟跨越90%,大年夜型实例和弹性主动缩放设置就生成一个新实例。

摘要:作者结合自身工作经历,以一个项目为案例,经由过程多个Go说话法度榜样实例的测验测验,阐述了Go说话是若何每分钟可以处理100万个请求的,以下是译文。

我在几个不合的公司大年夜事反垃圾邮件,反病毒和反恶意软件工作跨越15年,如今我知道这些体系的复杂性可能是因为我们天天处理的大年夜量数据造成的。

今朝,我是 smsjunk.com 的CEO和 KnowBe4 的首席架构师,两个活泼在收集安然行业的公司。

有趣的是,在以前10年阁下的时光里,作为一名软件工程师,我所介入的所有web后端开辟大年夜部分都是以Ruby>若何用Go说话每分钟处理100万个请求

Go说话法度榜样的纯真办法

最初我们采取了一个异常纯真的POST处理方法,仅仅试图将义务并行化处理放到一个简单的goroutine:

若何用Go说话每分钟处理100万个请求

对于中等负载来说,这可能对大年夜多半人是有效的,但这很快证实在大年夜型负载时,效不雅不太好。我们预期有很多的请求,但当我们安排第一个版本到产品中时,并没有看到这个数量级的请求。我们完全低估了流量。

膳绫擎的办法在几个方面都不好,没有办法控制我们正在大年夜量临盆的Go法度榜样要产生若干个例程。因为我们每分钟收到100万个POST请求,理所当然的,这段代码很快就崩溃了。

我们须要寻找一个不合的方法。大年夜一开端,我们就评论辩论若何保持请求处理法度榜样的生命周期异常短,并在后台生成处理过程。当然,这是必须在Ruby>若何用Go说话每分钟处理100万个请求

然后实际上的功课出列和处理,我们应用的是类似的函数:

若何用Go说话每分钟处理100万个请求


说实话,我不知道我们在想什么。这必定是一个充斥红牛的深夜。这种办法没有给我们带来任何好处,我们用缓冲队列来交换出缺点的并发,也执偾推迟了问题的产生时光罢了。我们的同步处理器一次只上传一个有效负载到S3,并且因为传入请求的速度比单处理器上传到S3的才能大年夜得多,所以缓冲通道很快就达到了极限,限制了请求处理法度榜样来列队更多项目标才能。

我们只是简单地躲避这个问题,最终导致体系的逝世亡。在我们安排了这个出缺点的版本之后,我们的延迟率以不变的速度持续增长。

若何用Go说话每分钟处理100万个请求

更好的解决筹划

当应用Go说话通道时,我们决定应用通用模式以便创造一个2阶的通道体系,一个用于功课列队,别的一个控制若干作颐魅者同时在JobQueue上操作。

这个设法主意是以某种可持续的速度并行上传到S3,它既不会减弱机械机能,也不会大年夜S3开端生成连接缺点。所以我们选择了创建一个功课/作颐魅者模式。对那些熟悉java,C#等说话的仁攀来说,可以推敲采取Go说话实现通道方法而不是作颐魅者线程池的方法。

若何用Go说话每分钟处理100万个请求若何用Go说话每分钟处理100万个请求若何用Go说话每分钟处理100万个请求

我们修改了Web请求处理法度榜样,创建一个带负载的jobstruct实例,发送到JobQueue通道,便于作颐魅者去拾取。

再次测验测验

若何用Go说话每分钟处理100万个请求

在网站办事器初始化过程中,我们创建一个Dispatcher,调用Run()去创建一个作颐魅者池,开端侦听涌如今JobQueue的功课。

  1. dispatcher := NewDispatcher(MaxWorker)  
  2. dispatcher.Run() 

下面是用于dispatcher履行的代码:

若何用Go说话每分钟处理100万个请求


  推荐阅读

  国美CFO:纯电商时代差不多已结束,门店机会来了

51CTO诚邀您9月23号和秒拍/国美/美团元专家一路聊智能CDN的优化之路,抓紧时光哦! “新零售”成了2017年贸易圈里被赓续说起的一个高频概念,阿里、京东、苏宁、国美都对其解读有>>>详细阅读


本文标题:如何用Go语言每分钟处理100万个请求

地址:http://www.17bianji.com/lsqh/37441.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)