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

国内有wix做的好的网站搜索引擎优化的流程

国内有wix做的好的网站,搜索引擎优化的流程,北京做网站好公司,网站图片上字体动态怎么做的在集群中,有些业务逻辑只需要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/29481.html

相关文章:

  • 网站如何做的有气质万网注册域名查询
  • 怎么做网站 白百度免费推广网站
  • 用dw怎么做网站留言板seort什么意思
  • 做网站骗子网络推广员是什么
  • 永兴网站建设足球排行榜前十名
  • 广水做网站广告位招商怎么找客户
  • 南皮县建设局网站营销案例100例小故事
  • 宝安网站建设公司968大庆建站公司
  • 专做特产的网站建设企业营销型网站
  • 做国际网站找阿里万网app下载
  • 做壁纸壁的网站有什么网络营销sem培训
  • 网站建设与推广范文2345网址导航中国最好
  • 中文wordpress工具箱杭州网站优化平台
  • 网站关键字挖掘用网站模板建站
  • 太原网站建设dweb泉州关键词搜索排名
  • 网站图片加alt标签人工智能教育培训机构排名
  • 网站生成app 免费工具线上推广公司
  • 网站建设产品分割网络推广加盟
  • 哪里有免费招聘网站怎么利用互联网推广
  • 深圳手机网站制作百度平台订单查询
  • 做微商怎样加入网站卖东西赚钱线上推广方案怎么做
  • 奢侈品商城网站建设方案网络管理系统
  • wordpress主题出错武汉网站seo推广公司
  • 免费网站服务商网页快照
  • 在线充值网站怎么做关于软文营销的案例
  • 做网站职校选什么专业国外免费域名申请
  • 上海福州路附近做网站的公司seo自然排名优化
  • 网站公司 转型百度关键词挖掘工具爱站网
  • 关于校园网站的策划书百度网盘云资源搜索引擎
  • 搜索引擎网站推广法 怎么做百度客服在线咨询