美文网首页
一分钟一百万请求优化之路

一分钟一百万请求优化之路

作者: 清晨的麦田 | 来源:发表于2019-06-11 18:33 被阅读0次

原文:https://medium.com/smsjunk/handling-1-million-requests-per-minute-with-golang-f70ac505fcaa

工人

var (
    MaxWorker = os.Getenv("MAX_WORKERS")
    MaxQueue  = os.Getenv("MAX_QUEUE")
)

// Job represents the job to be run
type Job struct {
    Payload Payload
}

// A buffered channel that we can send work requests on.
var JobQueue chan Job

// Worker represents the worker that executes the job
type Worker struct {
    WorkerPool  chan chan Job
    JobChannel  chan Job
    quit        chan bool
}

func NewWorker(workerPool chan chan Job) Worker {
    return Worker{
        WorkerPool: workerPool,
        JobChannel: make(chan Job),
        quit:       make(chan bool)}
}

// Start method starts the run loop for the worker, listening for a quit channel in
// case we need to stop it
func (w Worker) Start() {
    go func() {
        for {
            // register the current worker into the worker queue.
            w.WorkerPool <- w.JobChannel

            select {
            case job := <-w.JobChannel:
                // we have received a work request.
                if err := job.Payload.UploadToS3(); err != nil {
                    log.Errorf("Error uploading to S3: %s", err.Error())
                }

            case <-w.quit:
                // we have received a signal to stop
                return
            }
        }
    }()
}

// Stop signals the worker to stop listening for work requests.
func (w Worker) Stop() {
    go func() {
        w.quit <- true
    }()
}

分发处理

type Dispatcher struct {
    // A pool of workers channels that are registered with the dispatcher
    WorkerPool chan chan Job
}

func NewDispatcher(maxWorkers int) *Dispatcher {
    pool := make(chan chan Job, maxWorkers)
    return &Dispatcher{WorkerPool: pool}
}

func (d *Dispatcher) Run() {
    // starting n number of workers
    for i := 0; i < d.maxWorkers; i++ {
        worker := NewWorker(d.pool)
        worker.Start()
    }

    go d.dispatch()
}

func (d *Dispatcher) dispatch() {
    for {
        select {
        case job := <-JobQueue:
            // a job request has been received
            go func(job Job) {
                // try to obtain a worker job channel that is available.
                // this will block until a worker is idle
                jobChannel := <-d.WorkerPool

                // dispatch the job to the worker job channel
                jobChannel <- job
            }(job)
        }
    }
}

相关文章

  • 一分钟一百万请求优化之路

    原文:https://medium.com/smsjunk/handling-1-million-requests...

  • 网络请求优化之取消请求

    网络请求优化之取消请求 网络请求优化之取消请求

  • 2018.5面试总结

    问题1:前端性能优化 优化图 参考:掘金 1.1. http请求优化 优化手段1:合并请求合并请求的主要目的是减少...

  • APP重构之路 网络请求框架

    APP重构之路 网络请求框架 APP重构之路 网络请求框架

  • 等一分钟

    等一分钟 或许下一分钟 一切都会有所不同 下一分钟,一百万...

  • 2022-01-25

    蛙笑网络请求优化方案 优化目的 解耦网络请求,解决嵌套地狱,减少内存泄漏 方案对比 原始请求方式: 改造完成的请求...

  • 前端性能优化

    前端性能优化 1.网络请求 DNS 查询优化 减少请求域名数量 减少请求数 合并文件 css 合并 js Spri...

  • 性能优化

    性能优化 代码层面: 缓存利用 请求数量 请求带宽 总的来说 移动端性能优化 具体优化 加号操作符 事件委托 避免...

  • 网络优化(一)缓存优化

    除了上面的JobSchedule的网络时机请求的网络优化还有其他优化。 1.请求的缓存。Http请求是可以做缓存的...

  • webpack

    用于webapp。 webpack 打包优化。选项去优化项目。 减少HTPP请求,减少请求文件,希望使用缓存让我们...

网友评论

      本文标题:一分钟一百万请求优化之路

      本文链接:https://www.haomeiwen.com/subject/malcfctx.html