系统模块分类为:cms系统,crm系统,会员系统,订单管理,采购管理,wms仓储管理,财务管理,供应商管理,质检系统等;
常见做事:文件图片上传做事,物流做事,商品搜索做事,订单做事,会员做事等;
在上述先容的模块中,采取分布式支配方案的情形下(某个模块或者系统支配多台做事器),在公司业务发展壮大后,会碰着各个别系业务流转,获取数据,分发,同步数据等问题,常见的有:行列步队异步任务,定时任务。

1,异步任务分发(处理完订单或者某一个流程后须要异步关照其它系统或者发送),一样平常采取行列步队监听(异步任务即可);
2,像报表,统计等须要定时任务完成;
但是在系统、做事越来越多的情形下,做事器上运行的行列步队做事和定时任务将会很弘大,十几台乃至几十台做事器有各种不同的做事很难以管理
注:像一次性任务,比如golang任务发布,打包支配等可以采纳jenkins来支配
1,定时任务采纳方案便是找一套开源的或者自己开拓一套分布式任务管理系统(一套后台管理几十上百台做事器上的定时任务和实行脚本)
具备一下功能:
做事创造做事注册定时任务管理精确到秒一次性任务管理任务备份2,任务分发
像订单审核后同步订单到采购,采购单同步到wms 入库单同步wms 发货单,收款单,等各个别系衔接的数据对接如果按照普通api接口会影响业务性能;办理方案:根据业务开拓一套异步任务分开系统
采购系统创建采购单 入库单同步wms仓储系统;仓储系统入库关照采购系统和发卖系统;发卖系统创建发卖单同步采购系统;crm和发卖系统发票关系同步;
像上述只是大略列举了业务当中大略的任务同步过程;每个任务单独运行一个行列步队的话,那么在公司正常运转情形下将很难以管理这些任务,于是在此场景下应运而生的系统 任务分发系统
任务分发系统要具备一下功能:
每个别系做事一个或者多个行列步队运行(防止任务壅塞),并且支持直接向队里插入任务和htttp形式插入任务;插入数据中包含了须要要求的接口地址,参数,是否须要返回数据关照对方;回调地址,唯一标识key,搜索关键词(用于elk搜索)等;支持任务失落败了多次考试测验(切换行列步队或者延时行列步队),固定次数失落败后钉钉告警提醒;对付新增,修正、删除要支持,同一条数据不能重复要求插入(成功的任务),须要把任务存入elk中;对付修正数据,删除数据等要担保数据先手顺序;比如修正价格,库存等 第一条记录修正为80元,第一次修正为100;一定要担保数据顺序不能错乱,过期的要删除担保任务数据的幂等性,安全性,唯一性,可重复消费各个接供词给方要能担保接口支持重复增编削查后对数据没有太大影响,比如同一条数据插入,只能新增一条,第二次要求能返回插入成功;1,分布式任务管理系统先容:(开拓措辞golang)后台php,做事用golang开拓(1,对接后台api接口,新增一次性任务和定时任务,2.处理任务),采取golang+etcd+mongodb
支配方案:
学习golang的分布式任务之前先学习协etcd的利用,重点须要学习etcd的 续租,watch监听key
etcd的安装
etcd的利用
golang分布式任务紧张分为
master 做事端 紧张供应后台操作的api,添加定时任务和一次性任务到etcd中,对任务进行增编削查 日志 做事创造 做事注册等功能
worker 客户端 紧张监听etcd中的任务(与自己做事器ip干系的任务) 一次性任务立即实行即可,定时任务解析表达式后,放入内存中,定时实行
woker实行流程:.
githu地址:https://github.com/sunlongv520/go-crontab
code可以手动向etcd添加任务 或者删除任务
package mainimport ( "context" "fmt" "github.com/coreos/etcd/clientv3" "time")func main(){ var ( config clientv3.Config err error client clientv3.Client kv clientv3.KV getResp clientv3.GetResponse ) //配置 config = clientv3.Config{ Endpoints:[]string{"192.168.2.232:2379"}, DialTimeout:time.Second5, } //连接 床见一个客户端 if client,err = clientv3.New(config);err != nil{ fmt.Println(err) return } //用于读写etcd的键值对 kv = clientv3.NewKV(client) //删除key //kv.Delete(context.TODO(),"/cron/jobs/192.168.2.246/job1",clientv3.WithPrefix()) //kv.Delete(context.TODO(),"/cron/jobs",clientv3.WithPrefix()) //kv.Delete(context.TODO(),"/cron/oncejobs",clientv3.WithPrefix()) // //return //新增定时任务 //putResp, err := kv.Put(context.TODO(),"/cron/jobs/192.168.2.232/job2","{\"name\":\"job2\",\"command\":\"D:/phpstudy/PHPTutorial/php/php-5.6.27-nts/php E:/WWW/a.php\",\"cronExpr\":\"/7 \"}",clientv3.WithPrevKV()) //putResp, err := kv.Put(context.TODO(),"/cron/jobs/192.168.2.246/job2","{\"name\":\"job2\",\"command\":\" echo hello world\",\"cronExpr\":\"/5 \"}",clientv3.WithPrevKV()) //putResp, err := kv.Put(context.TODO(),"/cron/jobs/192.168.2.246/job3","{\"name\":\"job3\",\"command\":\" echo hello boy\",\"cronExpr\":\"/10 \"}",clientv3.WithPrevKV())//fmt.Println(putResp)//fmt.Println(err) //新增一次性任务 //putResp, err := kv.Put(context.TODO(),"/cron/oncejobs/192.168.2.232/job10","{\"name\":\"job10\",\"command\":\" echo hello world \"}",clientv3.WithPrevKV()) //强杀任务 //putResp, err := kv.Put(context.TODO(),"/cron/killer/192.168.2.246/job10","") // //if err != nil{ // fmt.Println(err) //}else{ // fmt.Println("Revision:",putResp.Header.Revision) // if putResp.PrevKv != nil{ // fmt.Println("key:",string(putResp.PrevKv.Key)) // fmt.Println("Value:",string(putResp.PrevKv.Value)) // fmt.Println("Version:",string(putResp.PrevKv.Version)) // } //} //查询 getResp,err = kv.Get(context.TODO(),"/cron/workers",clientv3.WithPrefix()) if err != nil { fmt.Println(err) return } for _, kvpair := range getResp.Kvs { fmt.Println(kvpair) } getResp,err = kv.Get(context.TODO(),"/cron/jobs",clientv3.WithPrefix()) if err != nil { fmt.Println(err) return } for _, kvpair := range getResp.Kvs { fmt.Println(kvpair) } getResp,err = kv.Get(context.TODO(),"/cron/oncejobs",clientv3.WithPrefix()) if err != nil { fmt.Println(err) return } for _, kvpair := range getResp.Kvs { fmt.Println(kvpair) }}
master:
紧张卖力吸收后台对任务的管理 供应api接口
go run .\master\main\master.go -config= .\master\main\master.json
worker:
监听任务,实行任务,任务调度
go run .\worker\main\worker.go -config=./worker\main\worker.json -logDir=./logs/worker
该套分布式任务管理开箱即用,如有疑问可以随时提问
项目框架解析: 供学习爱好者
#!/bin/bashcd /dataxxx/gocodexxxxx/golang_asynctaskgit reset --hard HEADgit pull origin masterfilename="/data2xxxxx/gocode/golang_asynctask/build/crm/sync_comuser_to_erp"rm -f $filenamego build -o /data2xxx/gocode/golang_asynctask/build/crm/sync_comuser_to_erp /data2xxxxxx/gocode/golang_asynctask/cmd/crm/sync_comuser_to_erp/main.gosupervisorctl restart crm_sync_comuser_to_erp: