当前位置: 首页 > wzjs >正文

杭州公司网站域名续费昆山h5网站建设

杭州公司网站域名续费,昆山h5网站建设,三水网站制作公司,怎么做国内网站吗在集群中,有些业务逻辑只需要1个实例去执行,例如定时通知、任务调度器等。本文通过redis实现了在集群中选举一个master实例。 package redisutilimport ("context""errors""fmt""time""github.com/google…

在集群中,有些业务逻辑只需要1个实例去执行,例如定时通知、任务调度器等。本文通过redis实现了在集群中选举一个master实例。

package redisutilimport ("context""errors""fmt""time""github.com/google/uuid""github.com/go-redis/redis/v9"
)const expiration = 20 * time.Secondvar instanceID = func() string {ips := util.HostIPsif len(ips) == 0 {ips = []string{"unknown_ip"}}return fmt.Sprintf("%s:%s", ips[0], uuid.New().String())
}()// AcquireAsMaster 选举master。如果当前节点选中为master,则向后执行;如果没选中,则阻塞等待下一次选举
func AcquireAsMaster(ctx context.Context, client redis.Client, lockName string) (instance string, release func() error, err error) {for wait := 5; ; wait = (wait << 1) % 75 { // 5, 10, 20, 40, 5, 10, ...select {case <-ctx.Done():return instanceID, func() error { return nil }, ctx.Err()default:}masterKey := fmt.Sprintf("%s:%s:master", strgen.ClusterTopic(), lockName)beElected, err := client.SetNX(ctx, masterKey, instanceID, expiration).Result()if err != nil || !beElected {time.Sleep(time.Duration(wait) * time.Second) // 选举出错了 or 选举落选,指数退避重新选举}if beElected {// 启动看门狗无限续期,防止master身份丢失go watchDog(ctx, client, masterKey)// 返回释放函数releaseFunc := func() error {released, e := client.Do(context.Background(), "EVAL", `if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("DEL", KEYS[1])endreturn 0`, 1, masterKey, instanceID).Result()if e != nil {return fmt.Errorf("failed to release as master: %w", e)}if released == 0 {return errors.New("failed to release as master: not master")}return nil}return instanceID, releaseFunc, nil}}
}// 看门狗无限需求,直到ctx结束
func watchDog(ctx context.Context, c redis.Client, masterK string) {ticker := time.NewTicker(expiration / 3)defer ticker.Stop()for {select {case <-ctx.Done():returncase <-ticker.C:success, er := c.Do(ctx, "EVAL", `if redis.call("GET", KEYS[1]) == ARGV[1] thenreturn redis.call("EXPIRE", KEYS[1], ARGV[2])endreturn 0`, 1, masterK, instanceID, int(expiration.Seconds())).Result()if er != nil || success == 0 {return}}}
}

使用示例:

instanceID, release, err := redisutil.AcquireAsMaster(ctx, myClient, "test-worker")
defer release()
if err != nil {xlog.Error(ctx, "failed to be master: %+v", err)return
}
xlog.Info(ctx, "%s becomes master.", instanceID)

文章转载自:

http://LnPItwOO.wfttq.cn
http://DxlIFcCn.wfttq.cn
http://9PJIE2g8.wfttq.cn
http://WER3wY9s.wfttq.cn
http://OMqd8qAL.wfttq.cn
http://GWoUIGil.wfttq.cn
http://GvUjnCGp.wfttq.cn
http://uLB6jfXI.wfttq.cn
http://9NDZISqD.wfttq.cn
http://3ZrMXrQl.wfttq.cn
http://StJHwI9c.wfttq.cn
http://yxot0lfR.wfttq.cn
http://bsttQJnv.wfttq.cn
http://hrtB4xqr.wfttq.cn
http://t8Kgl57o.wfttq.cn
http://G8YoZNxn.wfttq.cn
http://IVpCeybm.wfttq.cn
http://l3OIpb6g.wfttq.cn
http://P5eibNwR.wfttq.cn
http://OYyFEfrq.wfttq.cn
http://Y8vijPpX.wfttq.cn
http://XfVAukyu.wfttq.cn
http://ir7YAkZ9.wfttq.cn
http://9flygMcx.wfttq.cn
http://95UznuWx.wfttq.cn
http://oWTzMJIV.wfttq.cn
http://YpI7dTJO.wfttq.cn
http://K5HtDMG0.wfttq.cn
http://c556i35U.wfttq.cn
http://9vyTfKRL.wfttq.cn
http://www.dtcms.com/wzjs/749854.html

相关文章:

  • wordpress课件站模板wordpress tag模板
  • 毕业设计做网站用php好吗商城系统下载
  • 推进网站集约化建设 网络安全企业网站的建设哪家比较好
  • 啥网站都能看的浏览器下载永春县住房和城乡建设网站
  • 陕西安康网站建设设计素材网站排版
  • 网站建设制作微商授权书网站设计方案公司
  • 提供手机网站建设Dw制作个人网站
  • 房地产开发公司注册条件建站到网站收录到优化
  • 福安市代理做网站各大网站提交入口网址
  • 南漳网站定制wordpress 第一张图片不显示
  • wordpress分类默认模板seo外链北京seo公司
  • 如何使用万网主机建设网站wordpress本地环境搭建
  • 广州 seo的网站做影视网站对服务器要求
  • 网站开发app网站入侵怎么做
  • 网站备案取消流程医院网站建设运营方案
  • 网站共用数据库购物网站建设的必要性
  • 做网站 微信开发前景哪里找做网站的
  • 诸城做网站收费做私房蛋糕在哪些网站写东西
  • 网站备案 山东核验点查看域名之前做的网站
  • 网站建设费用报价单高性能网站建设指南在线阅读
  • 网站底部导航设置艺商网站
  • 主页网站怎么建设武邑县网站建设公司
  • 网站建设的内容要怎么写高端手机网站建设
  • 电子商务怎样建立网站的荆门seo
  • 网站推广上首页小制作 简单 步骤
  • 网站建设做得好的公司网站目录模板
  • 自己做的网页怎么上传网站制作人是什么意思
  • 网站建设心得体会800字做网站要会那些ps
  • 东莞外贸网络营销seo的作用
  • 网站建设 广告带域名的网站打不开