g2 是golang 版的gearman 实现,包含了server (支持leveldb,以及metrics)、client 代码、worker 代码
使用上还是很方便的,同时部署也比较简单,结合docker 我们可以实现快速的部署
使用go mod 进行包管理

docker-compose文件

 
version: "3"
services:
  app:
    image: appscode/gearmand:0.5.2
    command: run --v=3 --storage-dir=/my-dir --addr="0.0.0.0:4730"
    volumes:
    - "./db:/my-dir"
    ports:
    - "4730:4730"
    - "3000:3000"
  client:
    build:
     context: ./client
  worker:
    build:
     context: ./worker
 
 

client 测试代码

package main
import (
  "log"
  "os"
  "sync"
  "github.com/appscode/g2/client"
  rt "github.com/appscode/g2/pkg/runtime"
)
func main() {
  // Set the autoinc id generator
  // You can write your own id generator
  // by implementing IdGenerator interface.
  // client.IdGen = client.NewAutoIncId()
  c, err := client.New(rt.Network, "app:4730")
  if err != nil {
    log.Fatalln(err)
  }
  defer c.Close()
  c.ErrorHandler = func(e error) {
    log.Println(e)
    os.Exit(1)
  }
  echo := []byte("Hello\x00 world")
  echomsg, err := c.Echo(echo)
  if err != nil {
    log.Fatalln(err)
  }
  log.Println(string(echomsg))
  jobHandler := func(resp *client.Response) {
    switch resp.DataType {
    case rt.PT_WorkException:
      fallthrough
    case rt.PT_WorkFail:
      fallthrough
    case rt.PT_WorkComplete:
      if data, err := resp.Result(); err == nil {
        log.Printf("RESULT: %v\n", data)
      } else {
        log.Printf("RESULT: %s\n", err)
      }
    case rt.PT_WorkWarning:
      fallthrough
    case rt.PT_WorkData:
      if data, err := resp.Update(); err == nil {
        log.Printf("UPDATE: %v\n", data)
      } else {
        log.Printf("UPDATE: %v, %s\n", data, err)
      }
    case rt.PT_WorkStatus:
      if data, err := resp.Status(); err == nil {
        log.Printf("STATUS: %v\n", data)
      } else {
        log.Printf("STATUS: %s\n", err)
      }
    default:
      log.Printf("UNKNOWN: %v", resp.Data)
    }
  }
  handle, err := c.Do("ToUpper", echo, rt.JobNormal, jobHandler)
  if err != nil {
    log.Fatalln(err)
  }
  status, err := c.Status(handle)
  if err != nil {
    log.Fatalln(err)
  }
  log.Printf("%v", *status)
  _, err = c.Do("Foobar", echo, rt.JobNormal, jobHandler)
  if err != nil {
    log.Fatalln(err)
  }
  log.Println("Press Ctrl-C to exit ...")
  var mutex sync.Mutex
  mutex.Lock()
  mutex.Lock()
}
 
 

worker 测试代码

package main
import (
  "log"
  "net"
  "os"
  "strings"
  "time"
  "github.com/appscode/g2/worker"
  "github.com/mikespook/golib/signal"
)
func ToUpper(job worker.Job) ([]byte, error) {
  log.Printf("ToUpper: Data=[%s]\n", job.Data())
  data := []byte(strings.ToUpper(string(job.Data())))
  return data, nil
}
func ToUpperDelay10(job worker.Job) ([]byte, error) {
  log.Printf("ToUpper: Data=[%s]\n", job.Data())
  time.Sleep(10 * time.Second)
  data := []byte(strings.ToUpper(string(job.Data())))
  return data, nil
}
func Foobar(job worker.Job) ([]byte, error) {
  log.Printf("Foobar: Data=[%s]\n", job.Data())
  for i := 0; i < 10; i++ {
    job.SendWarning([]byte{byte(i)})
    job.SendData([]byte{byte(i)})
    job.UpdateStatus(i+1, 100)
  }
  return job.Data(), nil
}
func main() {
  log.Println("Starting ...")
  defer log.Println("Shutdown complete!")
  w := worker.New(worker.Unlimited)
  defer w.Close()
  w.ErrorHandler = func(e error) {
    log.Println(e)
    if opErr, ok := e.(*net.OpError); ok {
      if !opErr.Temporary() {
        proc, err := os.FindProcess(os.Getpid())
        if err != nil {
          log.Println(err)
        }
        if err := proc.Signal(os.Interrupt); err != nil {
          log.Println(err)
        }
      }
    }
  }
  w.JobHandler = func(job worker.Job) error {
    log.Printf("Data=%s\n", job.Data())
    return nil
  }
  w.AddServer("tcp4", "app:4730")
  w.AddFunc("Foobar", Foobar, worker.Unlimited)
  w.AddFunc("ToUpper", ToUpper, worker.Unlimited)
  w.AddFunc("ToUpperTimeOut5", ToUpperDelay10, 5)
  w.AddFunc("ToUpperTimeOut20", ToUpperDelay10, 20)
  w.AddFunc("SysInfo", worker.SysInfo, worker.Unlimited)
  w.AddFunc("MemInfo", worker.MemInfo, worker.Unlimited)
  if err := w.Ready(); err != nil {
    log.Fatal(err)
    return
  }
  go w.Work()
  signal.Bind(os.Interrupt, func() uint { return signal.BreakExit })
  signal.Wait()
}
 
 

运行&&测试

  • 构建&&运行
docker-compose build && docker-compose up -d
  • 查看日志log
    日志包含了请求的处理
 
app_1 | I0117 13:43:22.960922 1 server.go:824] total cron job: 0 #repeated job: 0 #onetime job: 0
app_1 | I0117 13:43:22.960955 1 server.go:834] total job: 0 #background: 0 #running: 0
app_1 | I0117 13:53:22.960868 1 server.go:824] total cron job: 0 #repeated job: 0 #onetime job: 0
app_1 | I0117 13:53:22.960895 1 server.go:834] total job: 0 #background: 0 #running: 0
app_1 | I0117 14:03:22.960897 1 server.go:824] total cron job: 0 #repeated job: 0 #onetime job: 0
app_1 | I0117 14:03:22.960928 1 server.go:834] total job: 0 #background: 0 #running: 0
app_1 | I0117 14:13:22.960884 1 server.go:824] total cron job: 0 #repeated job: 0 #onetime job: 0
app_1 | I0117 14:13:22.960922 1 server.go:834] total job: 0 #background: 0 #running: 0
client_1 | 2019/01/17 13:34:17 {H:-866e208c2d8c:-1-1547732002-3 false false 0 100}
client_1 | 2019/01/17 13:34:17 Press Ctrl-C to exit ...
worker_1 | 2019/01/17 13:33:22 Starting ...
worker_1 | 2019/01/17 13:33:23 ToUpper: Data=[Hello world]
worker_1 | 2019/01/17 13:33:23 Foobar: Data=[Hello world]
worker_1 | 2019/01/17 13:34:17 ToUpper: Data=[Hello world]
worker_1 | 2019/01/17 13:34:17 Foobar: Data=[Hello world]
 
 

说明

gearman 是标准的job 处理框架,已经有了好多语言的实现

参考资料

https://github.com/appscode/g2 
https://github.com/rongfengliang/gearmangolang-docker 
http://gearman.org/

golang 版本 gearman 试用的更多相关文章

  1. 上传golang 版本SDK

    在上传的时候,文件都上传成功了,但是返回的信息里面errcode 404 token 是"".是不是因为我的callbackUrl(随便写的) 写错导致的. 上传golang 版本 ...

  2. Golang版本的rocksdb-对gorocksdb的封装

    rocksdb的优秀特性不用多说,但是它是用c++语言写的,就是这一个特点就把很多人拦住了.虽然rocksdb官方也有Java版本,但是Golang的发展速度让人不容小觑,而且由于golang原生对高 ...

  3. Beta版本——用户试用与调研报告

    1 引言 1.1 系统概述 ​ 毕设导师智能分配系统是一个用来简化传统手工匹配繁琐操作的系统.本系统将学生报志愿.系负责人收集整理数据.相关人员进行手工分配.反馈选择结果等繁琐的操作转移到线上.把毕设 ...

  4. Golang 版本发布 与 TIOBE 排名

    2016年国庆节(10月1日)开始接触 Go 语言,记录一下它的 版本发布 与 TIOBE 排名: Golang 排行榜 月份 版本 排名 备注 2012.03 1.0             201 ...

  5. golang 版本升降之后报错——imports runtime: C source files not allowed when not using cgo or SWIG

    问题: golang 升级或者降级版本之后,执行编译报错如下: package github.com/onsi/ginkgo/ginkgo imports runtime: C source file ...

  6. Linux分发版本的试用及选择工具

    https://www.forbes.com/sites/jasonevangelho/2019/06/15/how-to-test-drive-200-linux-distributions-wit ...

  7. [原创] linux 下上传 datapoint数据到yeelink 【golang版本】同时上传2个数据点

    /* Create by sndnvaps<sndnvaps@gmail.com> * data: 2015-04-12* upload 2 datapoint to yeelink.ne ...

  8. EasyDarwin开源流媒体服务器Golang版本:服务端录像功能发布

    EasyDarwin开源流媒体服务器(www.easydarwin.org)现在使用Go版本实现了.最新的代码提交,已经支持了推流(或者拉流)的同时进行本地存储. 本地存储的原理,是在推流的同时启动f ...

  9. TLS示例开发-golang版本

    目录 前言 制作自签名证书 CA 服务器证书相关 客户端证书相关 证书如何验证 在浏览器中导入证书 导入证书 修改域名 golang服务端 目录 main.go 测试 参考 前言 在进行项目总结的时候 ...

随机推荐

  1. Centos7创建用户su登录后显示为 bash-4.1$

    useradd name [root@localhost data]# su name bash-4.2$ [root@localhost ~]# cp -a /etc/skel/. /home/na ...

  2. 获得本机Ip地址

  3. JavaScript作用域及作用域链详解、声明提升

    相信大家在入门JavaScript这门语言时对作用域.作用域链.变量声明提升这些概念肯定会稀里糊涂,下面就来说说这几个 Javascript 作用域 在 Javascript 中,只有局部作用域和全局 ...

  4. Creating and Destroying Objects

    Consider static factpry methods instead of construction 四个优点两个缺点 One advantage of static factory met ...

  5. request 的下载文件

    前言:Content-Type类型为octets/stream,这种一般是文件类型了,比如有时候需要导出excel数据,下载excel这种场景如何用python来实现呢? 1.点击导出按钮 2.代码实 ...

  6. react 学习笔记 npm 命令

    第一步: cnpm install --save react react-dom babelify babel-preset-react 第二步: 安装es2015 cnpm install babe ...

  7. python django 创建虚拟环境

    DRF---django-rest-framework: 1.通过一个案例简单回顾一下django, 一.前后端分离,不分离 不分离:前端页面的显示,都是由后端返回的,就是说后端处理了参数,数据库,之 ...

  8. Script Encryption

    一.shc加密 加密软件shcshc是linux的一款加密脚本的插件东西比较安全我们可以利用wget将文件放在root目录下也可以通过sftp放在root目录也可以直接利用cd命令选择目录 wget ...

  9. 1--Jmeter4.0连接Oracle数据库

    一.Jmeter要连接oracle数据库,就必须复制JDBC驱动jar包文件ojdbc5.jar或者ojdbc6.jar到Jmeter的lib目录下 路径:oracle安装目录\jdbc\lib 二. ...

  10. 2017第八届蓝桥杯C/C++ B组省赛-日期问题

    标题:日期问题 小明正在整理一批历史文献.这些历史文献中出现了很多日期.小明知道这些日期都在1960年1月1日至2059年12月31日.令小明头疼的是,这些日期采用的格式非常不统一,有采用年/月/日的 ...