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. 如何使用VSTO自动将Excel中的图表复制到Word

    如何使用VSTO自动将Excel中的图表复制到Word 原文地址:https://code.msdn.microsoft.com/How-to-copy-Chart-in-Excel-a29f9029 ...

  2. spring有关jar包的作用

    参考的是spring官网spring4.3版本. 链接:https://docs.spring.io/spring/docs/4.3.19.RELEASE/spring-framework-refer ...

  3. 缓存一致性协议 mesi

    m : modified e : exlusive s : shared i : invalid 四种状态的转换略过,现在讨论为什么有了这个协议,i++在多线程上还不是安全的. 两个cpu A B同时 ...

  4. Java语法基础学习DayEight

    一.异常处理 1.结构 java.lang.Object |-----java.lang.Throwable |-----java.lang.Error:错误,java程序对此无能为力,不显式处理 | ...

  5. jquery 正则表达式

  6. php优秀框架codeigniter学习系列——CI_Utf8类

    CI_Utf8类用来对Utf8编码环境提供支持.(Provides support for UTF-8 environments). 从构造函数看,只有当开启了PCRE模式,加载了iconv或者mbs ...

  7. 位(bit)、字节(Byte)、MB(兆位)之间的换算关系

    B是Byte的缩写,意思是字节:b是bit的缩写,意思是比特位:Kb是千比特位,KB是千字节:MB意思是兆字节: 换算关系: 1MB=1024KB=1024B*1024=1048576B: 8bit= ...

  8. Go实战--也许最快的Go语言Web框架kataras/iris初识(basic认证、Markdown、YAML、Json)

    ris自称是Go语言中所有Web框架最快的,它的特点如下: 1.聚焦高性能 2.健壮的静态路由支持和通配符子域名支持. 3.视图系统支持超过5以上模板 4.支持定制事件的高可扩展性Websocket ...

  9. 简短而有效的python queue队列解释

    Queue.qsize() 返回队列的大小  Queue.empty() 如果队列为空,返回True,反之False  Queue.full() 如果队列满了,返回True,反之False Queue ...

  10. ubuntu 安装 mysql 的正确姿势

    1.下载官方提供的mysql-apt-config.deb包进行APT源设置,下载地址:https://dev.mysql.com/downloads/repo/apt/ 2. // 将 mysql- ...