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. MarkDown编辑器中缩进

    首先,Markdown是不支持缩进的. 在Markdown里按下四个空格,就自动转入Code模式. 在Markdown里一个回车,不是分段而是换行,要两个回车,才是分段. 分段和换行的区别是:换行后, ...

  2. mysql 给表和字段加注释

    给表加注释: ALTER TABLE table_name COMMENT='这是表的注释'; 给列加注释: ALTER table table_name MODIFY `column_name` d ...

  3. java8 字符串转换 list long Integer

    String ids= "1,2,3,4,5,6"; List<Long> listIds = Arrays.asList(ids.split("," ...

  4. freemarker学习 (servlet + freemarker -> Struts2+freemarker -> springMVC+freemarker)

    什么是freemarker? freemarker类似于jsp,但不是jsp!怎么说呢?freemarker文件后缀是.ftl,它不像jsp本质是servlet,它将构建模板.解析模板.使用模板分离开 ...

  5. tensorflow-softmax

    之前在softmax多分类中讲到多用交叉熵作为损失函数,这里顺便写个例子,tensorlflow练手. # encoding:utf-8 import tensorflow as tf import ...

  6. Linux 配置selenium + webdriver 环境

    1.ubuntu 自带了python, 可以打开终端输入python 回车后如果显示版本信息就说明已经安装 2.安装安装python setup tools apt-get install pytho ...

  7. 编程实现Linux系统的od功能

    选做题目以及分析 题目:编写MyOD.java 用java MyOD XXX实现Linux下od -tx -tc XXX的功能 分析:我觉得这道题目中的参数应当是-tx1而不是-tx,使用了-tx后结 ...

  8. 全局css , 样式设置, css 初始化. css ,style ,全局样式, 初始化样式

    全局CSS设置总结 1.清除所有标记的内外边距 html, body, ul, li, ol, dl, dd, dt, p, h1, h2, h3, h4, h5, h6, form, fieldse ...

  9. 压缩后的数据 要经过 base64_encode 后才能在网络上传送

    function ob_gzip($content) // $content 就是要压缩的页面内容{ if(!headers_sent() && // 如果页面头部信息还没有输出 ex ...

  10. 并发的HTTP请求,apache是如何响应的,以及如何调用php文件的

    作者:酒窝链接:https://www.zhihu.com/question/23786410/answer/153455460来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明 ...