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

做张家界旅游网站多少钱企业网站seo诊断报告

做张家界旅游网站多少钱,企业网站seo诊断报告,广西网站建设证件查询,东莞市朝阳企讯通在分布式系统中,ETCD 作为一个强一致性、高可用的 key-value 存储系统,广泛应用于服务发现、配置管理等场景。ETCD 在内部采用了 Raft 协议来保证集群的一致性,而日志预提案(log proposal)是 Raft 协议中至关重要的一部…

在分布式系统中,ETCD 作为一个强一致性、高可用的 key-value 存储系统,广泛应用于服务发现、配置管理等场景。ETCD 在内部采用了 Raft 协议来保证集群的一致性,而日志预提案(log proposal)是 Raft 协议中至关重要的一部分。ETCD 在接收到 Put 请求后,会首先进行日志预提案,确保数据一致性和系统的可靠性。

本文将深入解析 ETCD 源码中的一段关键代码,stepWithWaitOption 函数,它主要负责处理 Put 请求中的日志预提案部分。我们将详细剖析这段代码的功能和设计思路,帮助您更好地理解 ETCD 如何处理 Put 请求和日志提案。

代码分析

以下是 ETCD 服务器中 stepWithWaitOption 函数的核心源码,它用于处理日志预提案:

// Step advances the state machine using msgs. The ctx.Err() will be returned,
// if any.
func (n *node) stepWithWaitOption(ctx context.Context, m pb.Message, wait bool) error {// 如果消息类型不是 MsgProp,则将消息直接发送到接收通道if m.Type != pb.MsgProp {select {case n.recvc <- m:return nilcase <-ctx.Done():return ctx.Err()case <-n.done:return ErrStopped}}// 如果是 MsgProp 消息类型,进行日志预提案ch := n.propcpm := msgWithResult{m: m}// 如果需要等待结果,创建一个带缓冲的通道用于接收错误if wait {pm.result = make(chan error, 1)}// 将消息放入提案通道select {case ch <- pm:// 如果不需要等待结果,立即返回if !wait {return nil}case <-ctx.Done():return ctx.Err()case <-n.done:return ErrStopped}// 等待处理结果select {case err := <-pm.result:if err != nil {return err}case <-ctx.Done():return ctx.Err()case <-n.done:return ErrStopped}return nil
}

1. 消息类型判断与处理

在 ETCD 中,日志预提案的核心是通过 MsgProp 类型的消息来进行的。首先,函数检查传入的消息类型是否为 pb.MsgProp(即提案消息)。如果消息类型不是 MsgProp,则直接将消息发送到 n.recvc 通道。

if m.Type != pb.MsgProp {select {case n.recvc <- m:return nilcase <-ctx.Done():return ctx.Err()case <-n.done:return ErrStopped}
}

如果消息类型不是 MsgProp,那么说明这不是一个日志提案请求,因此直接将消息发送到接收通道 n.recvc,并根据上下文的取消信号或状态机的停止信号判断是否需要退出。

2. 日志提案与等待选项

如果消息类型是 MsgProp,说明这是一个日志预提案请求,函数会进入更复杂的逻辑。首先,创建一个 msgWithResult 结构体,该结构体包含消息本身和一个可选的错误通道 result。如果需要等待结果(waittrue),我们为 msgWithResult 创建一个缓冲的错误通道。

ch := n.propc
pm := msgWithResult{m: m}
if wait {pm.result = make(chan error, 1)
}

在这一部分,propc 是用于存储提案消息的通道,它会负责将消息发送到适当的处理函数。这里,我们根据是否需要等待结果来决定是否创建一个错误通道。如果需要等待结果,我们稍后会从该通道读取处理结果。

3. 发送提案消息到通道

接下来,使用 select 语句将消息发送到提案通道 ch。如果没有等待结果(wait == false),则消息发送成功后立即返回。如果需要等待结果,我们会在发送消息后继续执行,等待处理结果。

select {
case ch <- pm:if !wait {return nil}
case <-ctx.Done():return ctx.Err()
case <-n.done:return ErrStopped
}

在这里,我们检查是否有任何取消操作发生,或者状态机是否已经停止。如果没有,则将消息发送到提案通道,并根据 wait 参数决定是否立即返回或继续等待结果。

4. 等待处理结果

如果需要等待处理结果(wait == true),函数会进入第二个 select 语句,等待从 pm.result 通道中接收到处理结果。如果处理结果是错误,则返回该错误;如果在等待过程中上下文被取消或状态机停止,函数也会提前返回相应的错误。

select {
case err := <-pm.result:if err != nil {return err}
case <-ctx.Done():return ctx.Err()
case <-n.done:return ErrStopped
}

5. 上下文与停止条件

在整个函数的实现过程中,我们多次使用 ctx.Done()n.done 来监听上下文的取消和状态机的停止。上下文取消和状态机停止是确保在长时间运行的操作中能够及时响应外部信号,避免资源泄露或无意义的操作。

case <-ctx.Done():return ctx.Err()
case <-n.done:return ErrStopped

这两条语句确保了在出现异常或超时的情况下,我们能够安全退出并处理错误。

总结

ETCD 服务器的 stepWithWaitOption 函数是处理日志预提案的关键部分。它结合了消息传递、上下文控制和并发管理,确保系统能够在高并发和分布式环境中稳定运行。通过 select 语句的巧妙使用,ETCD 能够在不同的条件下(如上下文取消、状态机停止等)做出及时的响应。

在这篇文章中,我们详细解析了这段代码的工作原理,希望能帮助大家更好地理解 ETCD 如何通过 Raft 协议和日志提案机制来实现一致性。ETCD 的设计和实现展示了如何在复杂的分布式系统中,通过细致的并发控制和上下文管理来确保高效、可靠的服务。

如果你对 ETCD 或 Raft 协议有更多的疑问,或者想深入了解其他 ETCD 源码的实现,欢迎在评论区与我交流!

http://www.hkea.cn/news/510350/

相关文章:

  • 苏州知名网站建设开发新区seo整站优化公司
  • 政府建设网站计划书品牌营销策略包括哪些内容
  • 深圳市做网站百度seo排名点击器app
  • 五莲网站建设维护推广网络营销推广及优化方案
  • 重庆网红整站多关键词优化
  • 动易网站cms一级消防工程师考试
  • wordpress更新报错想找搜索引擎优化
  • 提供网站建设费用资源网
  • wordpress怎么使用主题seo优化评论
  • 柳州做网站如何建网站详细步骤
  • 黄岛做网站哪家好四川seo关键词工具
  • dede门户网站模版写软文推广
  • 网站开发者排名开发一个app平台大概需要多少钱?
  • 做网站 博客百度推广助手客户端
  • 温州市手机网站制作哪家好爱站网长尾词挖掘
  • 党委网站建设要求凡科建站靠谱吗
  • wordpress 安卓客户端福建seo优化
  • 襄阳seo技术长沙seo网站优化
  • 做一的同志小说网站做seo要投入什么
  • 网站的文件结构百度搜索排名怎么收费
  • 全景网站app网络营销工具分析
  • 南京建设工程交易中心网站seo是什么的简称
  • 利用vps做网站关键字排名查询
  • 常熟网站制作找哪家好品牌型网站制作价格
  • 怎么做自己网站推广网络广告
  • 化州网站建设促销方法100种
  • 长沙专业网站设计平台新闻最新消息10条
  • 惠州网站建设制作宣传推广方案
  • 宁波网站推广外包服务长岭网站优化公司
  • 哈尔滨市哪里做淘宝网站seo课程心得体会