微服務實踐之分布式定時任務

2021-10-18 14:21:39 字數 3959 閱讀 9852

日常任務開放中,我們會有很多非同步、批量、定時、延遲任務要處理,go-zero中有go-queue,推薦使用go-queue去處理,go-queue本身也是基於go-zero開發的,其本身是有兩種模式:

我們主要說一下dq,kq使用也一樣的,只是依賴底層不同,如果沒使用過beanstalkd,沒接觸過beanstalkd的可以先google一下,使用起來還是挺容易的。

我在jobs下使用goctl新建了乙個message-job.api服務

info(

title: //訊息任務

desc: // 訊息任務

author: "mikael"

email: "[email protected]"

)type batchsendmessagereq {}

type batchsendmessageresp {}

service message-job-api

因為不需要使用路由,所以handler下的routes.go被我刪除了,在handler下新建了乙個jobrun.go,內容如下:

package handler

import (

"fishtwo/lib/xgo"

)/**

* @description 啟動job

* @author mikael

* @date 2021/1/18 12:05

* @version 1.0

**/func jobrun(serverctx *svc.servicecontext) )

}

其實xgo.go就是go batchsendmessagehandler(serverctx),封裝了一下go攜程,防止野生goroutine panic

然後修改一下啟動檔案message-job.go

主要是handler.registerhandlers(server, ctx) 修改為handler.jobrun(ctx)

接下來,我們就可以引入dq了,首先在etc/***.yaml下新增dqconf

.....

dqconf:

beanstalks:

- endpoint: 127.0.0.1:7771

tube: tube1

- endpoint: 127.0.0.1:7772

tube: tube2

redis:

host: 127.0.0.1:6379

type: node

我這裡本地用不同埠,模擬開了2個節點,7771、7772

在internal/config/config.go新增配置解析物件

type config struct
修改handler/batchsendmessagehandler.go

}修改logic下batchsendmessagelogic.go,寫我們的consumer消費邏輯

}這樣就大功告成了,啟動message-job.go就ok課

go run message-job.go
之後我們就可以在業務**中向dq新增任務,它就可以自動消費了

producer.delay 向dq中投遞5個延遲任務:

producer := dq.newproducer(dq.beanstalk,,})

for i := 1000; i < 1005; i++

}

producer.at可以指定某個時間執行,非常好用,感興趣的朋友自己可以研究下。

在前面說到gateway改造時候,如果眼神好的童鞋,在上面的httpresult.go中已經看到了log的身影:

我們在來看下rpc中怎麼處理的

是的,我在每個rpc啟動的main中加入了grpc*** 那讓我們看看grpc***裡面做了什麼

然後我**裡面使用github/pkg/errors這個包去處理錯誤的,這個包還是很好用的

所以呢:

我們在grpc中列印日誌logx.withcontext(ctx).errorf("【rpc-srv-err】 %+v",err)

api中列印日誌logx.withcontext(r.context()).error("【gateway-srv-err】 : %+v ",err)

go-zero中列印日誌,使用logx.withcontext會把trace-id帶入,這樣乙個請求下來,比如

user-api --> user-srv --> message-srv
那如果messsage-srv出錯,他們三個是同乙個trace-id,是不是就可以在elk通過輸入這個trace-id一次性搜尋出來這條請求報錯堆疊資訊呢?當然你也可以接入jaeger、zipkin、skywalking等,這個我暫時還沒接入。

歡迎使用 go-zero 並star支援我們!?

分布式定時任務

在做springboot專案的時候,需要定時做對賬任務。但因為專案是集群部署,就存在多個pod例項的定時任務同時執行,存在重複性。怎麼保證集群中不重複地完成定時任務?下面給出本人總結的方案。對賬任務表 merchant idname is done 是否對賬,0沒有對賬 1商家102 商家20 3商...

分布式事務 金融業微服務實踐案例

在網易雲輕舟微服務平台中,我們的微服務框架除了完成一些基本事項 比如熔斷 限流 降級 彈性伸縮等 也開發了很多符合行業特性的定製化產品。這是因為我們發現傳統行業與網際網路行業的經營模式有著很大的不同,不同客戶的關注點並不一樣,架構師想要用乙個產品把以上專案全部覆蓋還是比較困難的。但是,我們可以根據客...

分布式定時任務元件對比

描述xxl job elastic job lite saturn 主要作者 大眾點評徐雪裡 當當網張亮 唯品會開源,基於elastic job 特殊環境 mysql5.7 zookeeper 同elastic job 特殊功能 策略豐富,支援分片 子任務 支援分片,分片策略比xxl job豐富,支...