多语言展示
当前在线:780今日阅读:176今日分享:34

怎样用go语言中使用分布式任务队列?

布式任务队列是大型系统中经常用的技术方案,是一种高效、可靠性高,能够承受海量并发的技术方案。目前有个名为[machinery][1]的开源项目,用go语言开发了一个分布式任务框架。
工具/原料

能联网的linux或者mac电脑

快速体验
1

首先获取项目代码:go get github.com/RichardKnop/machinery/v1

3

machinery项目自带了一个使用示例,进入后,先合适配置文件config.yml:cd $GOPATH/src/github.com/RichardKnop/machinery/example

4

启动worker:  go run machinery.go worker

5

启动sender,下发任务,可以看到,下发了几个计算任务。

6

在worker端,可以看到收到的消息的情况,以及计算过程的日志

worker的开发
1

worker是用来执行任务的,worker启动的时候注册它能够承担的任务。首先要创建一个server:    var cnf = &config.Config{        Broker:        'amqp://guest:guest@localhost:5672/',        DefaultQueue:  'machinery_tasks',        ResultBackend: 'redis://127.0.0.1:6379',        AMQP: &config.AMQPConfig{            Exchange:     'machinery_exchange',            ExchangeType: 'direct',            BindingKey:   'machinery_task',        },    }    //init server    server, err := machinery.NewServer(cnf)    if err != nil {        log.Fatal(err)    }

2

在server中注册task。每个task都是一个函数,task函数返回的最后一个参数必须是error,例如:    func HelloWorld(arg string) (string, error) {        return 'Hi, i'm worker@localhost', nil    }

3

最后创建worker,并启动.    //create worker    worker := server.NewWorker('worker@localhost', 10)    err = worker.Launch()    if err != nil {        log.Fatal(err)    }

sender开发
1

发送端用来向worker发送任务。发送端也需要像worker一样创建server,在server注册task,需要与worker保持一致。

2

每个要发送的task,用Signature描述。

3

然后就可以获取task执行的结果。

运行结果
1

先启动worker,worker启动后,结果如下:

2

然后启动sender,可以看到任务指定的结果:

3

在worker端,可以到详细的任务执行日志

注意事项

machinery支持很多task的编排方式,限于篇幅这里不介绍。

推荐信息