作者丨Marcio Castilho
翻译丨无阻我飞扬
摘要:作者结合自身工作经历,以一个项目为案例,通过多个Go语言程序实例的尝试,阐述了Go语言是如何每
分钟可以处理100万个请求的,以下是译文。
我在几个不同的公司从事反垃圾邮件,反病毒和反恶意软件工作超过15年,现在我知道这些系统的复杂性
可能是由于我们每天处理的大量数据造成的。
目前,我是smsjunk.com的CEO和KnowBe4的首席架构师,两个活跃在网络安全行业的公司。
有趣的是,在过去10年左右的时间里,作为一名软件工程师,我所参与的所有web后端开发大部分都是以
Ruby on Rails(Rails是使用Ruby语言编写的网页程序开发框架,目的是为开发者提供常用组件)开发
的。不要误会我,我热爱Ruby on Rails,我相信它是一个令人着迷的开发环境,但一段时间后,你开始以
Ruby的方式思考和设计系统,忘了如何高效和原本可以利用多线程、并行、快速执行和小的内存消耗来简
化软件架构。多年来,我是一个C / C++、Delphi和C #开发人员,我刚刚意识到,用合适的工具来完成工
作可能会降低事情的复杂度。
我不太热衷于开发语言和框架的战争,网站之间总是为此争吵。我相信效率、生产率和代码的可维护性主
要取决于如何简单地构建解决方案。
问题
当我们在一个匿名的遥测和分析系统上工作时,我们的目标是能够处理来自数百万终端的大量的POST请
求。Web处理程序将接收一个JSON文档,其中可能包含需要写入Amazon S3的许多有效负载的集合,这
是为了使map-reduce系统稍后操作这个数据。
传统上,我们将研究创造一个一阶作业者架构,利用诸如:
Sidekiq
Resque
DelayedJob
Elasticbeanstalk Worker Tier
RabbitMQ
等等…
设置2个不同的集群,一个用于web前端,另一个用于作业者,这样会扩大可以处理的后台工作的数量。
但从一开始,我们的团队就知道应该这样做,因为在讨论阶段,我们预见这可能是一个非常大的流量系
统。我使用Go语言大约2年左右的时间,我们开发了一些在用的系统,但是没有一个系统能得到这么多的
负载。
首先通过创建一些structure,定义通过POST调用来接收到的web请求负载,还有一个上传请求负载到S3
bucket的函数。