go语言并发请求器 go语言 并发( 四 )


Go 是一种非常高性能的语言 , 对并发有很好的支持 。它几乎与 C++ 和 Java 等语言一样快 。虽然与 Python 或 Ruby 相比,使用 Go 构建东西确实需要更多时间,但您将节省大量用于优化代码的时间 。我们在Stream有一个小型开发团队,为超过 5 亿最终用户提供动力和聊天 。Go 结合了强大的生态系统、新开发人员的轻松入门、快速的性能、对并发的可靠支持和高效的编程环境,使其成为一个不错的选择 。Stream 仍然在我们的仪表板、站点和机器学习中利用 Python 来提供个性化的订阅源. 我们不会很快与 Python 说再见,但今后所有性能密集型代码都将使用 Go 编写 。我们新的聊天 API也完全用 Go 编写 。
如何用go语言每分钟处理100万个请求在Malwarebytes go语言并发请求器我们经历go语言并发请求器了显著的增长go语言并发请求器,自从我一年前加入了硅谷的公司 , 一个主要的职责成了设计架构和开发一些系统来支持一个快速增长的信息安全公司和所有需要的设施来支持一个每天百万用户使用的产品 。我在反病毒和反恶意软件行业的不同公司工作了12年,从而我知道由于我们每天处理大量的数据,这些系统是多么复杂 。
有趣的是,在过去的大约9年间,我参与的所有的web后端的开发通常是通过Ruby on Rails技术实现的 。不要错怪我 。我喜欢Ruby on Rails,并且我相信它是个令人惊讶的环境 。但是一段时间后,你会开始以ruby的方式开始思考和设计系统,你会忘记,如果你可以利用多线程、并行、快速执行和小内存开销 , 软件架构本来应该是多么高效和简单 。很多年期间,我是一个c/c++、Delphi和c#开发者 , 我刚开始意识到使用正确的工具可以把复杂的事情变得简单些 。
作为首席架构师,我不会很关心在互联网上的语言和框架战争 。我相信效率、生产力 。代码可维护性主要依赖于你如何把解决方案设计得很简单 。
问题
当工作在我们的匿名遥测和分析系统中,我们的目标是可以处理来自于百万级别的终端的大量的POST请求 。web处理服务可以接收包含了很多payload的集合的JSON数据,这些数据需要写入Amazon S3中 。接下来 , map-reduce系统可以操作这些数据 。
按照习惯,我们会调研服务层级架构,涉及的软件如下go语言并发请求器:
Sidekiq
Resque
DelayedJob
Elasticbeanstalk Worker Tier
RabbitMQ
and so on…
搭建了2个不同的集群 , 一个提供web前端,另外一个提供后端处理,这样我们可以横向扩展后端服务的数量 。
但是,从刚开始,在 讨论阶段我们的团队就知道我们应该使用Go,因为我们看到这会潜在性地成为一个非常庞大( large traffic)的系统 。我已经使用了Go语言大约2年时间,我们开发了几个系统,但是很少会达到这样的负载(amount of load) 。
我们开始创建一些结构,定义从POST调用得到的web请求负载 , 还有一个上传到S3 budket的函数 。
type PayloadCollection struct {
WindowsVersionstring`json:"version"`
Tokenstring`json:"token"`
Payloads[]Payload `json:"data"`
}
type Payload struct {
// [redacted]
}
func (p *Payload) UploadToS3() error {
// the storageFolder method ensures that there are no name collision in
// case we get same timestamp in the key name
storage_path := fmt.Sprintf("%v/%v", p.storageFolder, time.Now().UnixNano())
bucket := S3Bucket
b := new(bytes.Buffer)
encodeErr := json.NewEncoder(b).Encode(payload)
if encodeErr != nil {
return encodeErr
}
// Everything we post to the S3 bucket should be marked 'private'

推荐阅读