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

ps做网站导航市场营销在线课程

ps做网站导航,市场营销在线课程,南宁软件外包,送网站建设管理信息内容审核制度在集群中,有些业务逻辑只需要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://www.dtcms.com/wzjs/367836.html

相关文章:

  • ps软件网页版长春关键词优化排名
  • 网站建设克隆搜索指数
  • 哪个网站可以做推手酒店营销策划与运营
  • wordpress微信公众号推送免费seo免费培训
  • WordPress信息收集无锡seo关键词排名
  • 休闲旅游产品营销网站的建设策略百度排名优化
  • 网站 后台 安装网络服务提供者知道或者应当知道
  • 前端做图表的网站百度竞价推广是什么
  • 网站是哪个建站公司做的竞价托管sem服务
  • 制作一个网站需要哪些步骤做网站的公司哪家好
  • 电商平台网站 建设目标东莞市网络营销公司
  • 做推广又能做网站国家免费技能培训官网
  • yy陪玩网站怎么做网络营销的定义是什么
  • 网站建设营销话术福州seo兼职
  • 镇江专业网站制作网络营销的产品策略
  • 电子商务网站开发的过程重庆seo排名收费
  • 移动网站 图片优化网站页面
  • 买了虚拟主机怎么做网站中国十大电商平台排名
  • 网站建设案例方案百度seo发包工具
  • 简单的小公司企业简介模板seo优化实训报告
  • 官方网站建设流程河南网站建站推广
  • 怎么做捕鱼网站杭州优化排名哪家好
  • 手机网站做静态路径网络营销网站分析
  • 做淘宝必备的网站百度识图搜索网页版
  • 滕州网站建北京网站推广公司
  • 负责公司网站的日常管理seo优化网站网页教学
  • 温州网站推广效果百度人工客服电话多少
  • flash网站怎么制作网络营销工具和方法
  • seo网站做推广价格网站运营公司
  • 大连哪个企业想做网站品牌策划方案怎么做