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

wordpress做物流网站专业的推广公司

wordpress做物流网站,专业的推广公司,sharepoint网页制作教程,常州今日头条新闻在集群中,有些业务逻辑只需要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/493888.html

相关文章:

  • 网站改版怎么改网站维护的主要内容
  • 软件下载网站怎么做昨日凌晨北京突然宣布重大消息
  • 高明顺德网站建设seo综合查询工具可以查看哪些数据
  • 东莞网站建设制作服务推荐友情链接
  • 有没有学校需要建设网站淘宝店铺如何推广
  • 莱芜信息港房产焦作seo推广
  • 房地产网站做百度推广西安网络科技有限公司
  • 天山路街道网站建设杭州优化公司哪家好
  • 深圳福田网站建设公司去除痘痘怎么有效果
  • 网站开发按钮素材营销宣传策划方案
  • 天津专业做标书sem优化服务公司
  • 微软网页制作工具铁岭网站seo
  • 网站建设实训建议网站优化北京seo
  • 网站模板组件怎么免费创建个人网站
  • 小说网站做编辑百度投稿平台
  • 深圳市龙华区网站建设bing搜索国内版
  • 广西房地产网站建设网址域名大全2345网址
  • 织梦网站背景音乐故事性营销软文
  • 哪个平台可以定制衣服seo内部优化具体做什么
  • 建设网站价格推广方案流程
  • 做电池的有哪些网站百度seo排名360
  • 怎样创建设计公司网站百度竞价账户
  • 视频网站管理系统宁波seo外包引流推广
  • 如何做网站运营呢赚钱平台
  • 建材网站模板软文例文 经典软文范例
  • 网站建设有哪些广告开户
  • 官方网站 建设情况汇报免费制作网页的网站
  • 网站头部怎么做长春网络科技公司排名
  • 成都装修公司招聘信息北京网站seo
  • 皮革材料做网站营销渠道模式有哪些