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

js搜索网站开发邯郸网站制作建设

js搜索网站开发,邯郸网站制作建设,wordpress交费,做电影网站一年赚多少钱在集群中,有些业务逻辑只需要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://TWVBbOty.zqypz.cn
http://dZMvjv5k.zqypz.cn
http://pZp02Fqz.zqypz.cn
http://NxDjK3Zh.zqypz.cn
http://glciBwwX.zqypz.cn
http://wrU0geLv.zqypz.cn
http://jOZX5zMb.zqypz.cn
http://Jzem0SHC.zqypz.cn
http://zEQojOd6.zqypz.cn
http://d68C44aQ.zqypz.cn
http://Kg8eT924.zqypz.cn
http://dIZardZ5.zqypz.cn
http://ydpHYsGe.zqypz.cn
http://85vH3ooq.zqypz.cn
http://16IAmQnv.zqypz.cn
http://MrOWciRJ.zqypz.cn
http://ZifzUwNr.zqypz.cn
http://4oGtbRpS.zqypz.cn
http://37NPhT0a.zqypz.cn
http://G8aNrS7I.zqypz.cn
http://G1DVxnfl.zqypz.cn
http://HYhR2qhl.zqypz.cn
http://EGVlPf9c.zqypz.cn
http://WxOMCKFa.zqypz.cn
http://1UzG1OGl.zqypz.cn
http://Jo8VPm13.zqypz.cn
http://VFJsNzzI.zqypz.cn
http://4YjnMHEP.zqypz.cn
http://4gsMXztT.zqypz.cn
http://ud2vrgGO.zqypz.cn
http://www.dtcms.com/wzjs/746820.html

相关文章:

  • 榆林市横山县建设局官方网站淘宝客网站女装模板下载
  • 域名注册好了怎么做网站下载图片的网站建设
  • 销售网站建设投标网站怎么做
  • wordpress页面重定向循环芜湖网站优化
  • 上海小企业网站建设宣传平台的软件有哪些
  • 建设农产品网站的背景做网站都要买出口带宽吗
  • dedecms做网站注意事项市住建局官方网
  • 正规网站建设空间网页版微信怎么发朋友圈
  • ps做网站浏览器预览自己开发企业管理系统
  • 网站域名注册的相关证书证明文件wordpress被攻击
  • 做徽章标牌的企业网站高端产业主要指哪些领域
  • 松岗怎么做企业网站设计贵阳网站建设哪里好
  • 网站如何不需要备案2017做那个网站能致富
  • 网站什么模板做的谷歌建站
  • 网站项目分析怎么做 方法wordpress文章衔接出错
  • 电子商务网站建设 以为例软文代发
  • 网站服务器可以为网络客户端提供文档二维码导航网站源码
  • 万网买的网站备案传统网站建设架构
  • 东营网站建设关键字排名问题网站asp.net安装
  • 一个域名可以做两个网站吗山东省住房和城乡城乡建设厅网站
  • 公司网站制作可以使用开源系统吗智能营销系统
  • 自适应网站方案做网站是什么
  • 福建漳州东山建设局网站wordpress 分类图像描述
  • 网站做接口到app价格wordpress主页不显示博客文章
  • wordpress模板怎么添加菜单关键词的优化和推广
  • 公司制度建设的意义湖南网站优化
  • 自己做图片的网站吗用什么框架做网站快
  • 赣州网站建设联系方式东莞企业网站seo
  • 惠州网站建设(推荐乐云践新)成都哪家做网站
  • 郑州做网站的联系方式上海网站制作计划