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

如何做视频卖给网站网站建设做什么会计分录

如何做视频卖给网站,网站建设做什么会计分录,百度营销登录入口,南宁网站制作计划在分布式系统中,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.yayakq.cn/news/881476/

相关文章:

  • 抚州市建设局网站如何进行网站icp备案
  • 手机网站 返回顶部网站制作分工
  • 吉林市网站建设优化wordpress 手机适配
  • 免费行情软件网站下载大全网站维护的要求
  • 手机网站建设 jz.woonl网站建设需求列表
  • iis 7.5 网站wordpress 中文教程
  • 厦门建站最新消息苏州网站建设哪家效果好
  • 揭阳做网站哪个好抖音代运营工作怎么样
  • 做哪个视频网站赚钱的海外购物app排行榜前十名
  • 做网站如何躲过网警网络公司做网站后交代给客户什么
  • 做网站需要掌握网站建设合约具体内容
  • 网站开发尺寸西安优化网站推广
  • 如何使用mysql数据库做网站网站制作文件
  • 建站网址不安全庆安建设局网站
  • 网站建设服务费属于什么科目平面设计速成班
  • 服装网站建设公司哪家好南京网络公司平台
  • 做app网站的软件有哪些内容吗杭州中小企业网站建设
  • 网站建设犭金手指a排名12南昌快速优化排名
  • 鲜花网站数据库建设上海网站开发公司外包
  • 网站设置伪静态wordpress手机顶部菜单
  • 创建站怎么上传网站怎么办做ppt很有创意的网站
  • 郑州建网站多少规划设计公司网站
  • 网站开发报价 知乎怎么查网站的关键词
  • 网站内嵌地图网站模板信息不存在
  • 网站开发宣传图片网络设计实训课程
  • 贵阳有哪些做网站的公司贾汪建设局网站
  • 大埔网站建设济南百度开户电话
  • 58同城枣庄网站建设烟台北京网站建设公司哪家好
  • 大学生个人网站作品网站怎么添加统计代码
  • 收录查询 站长工具vps远程桌面服务器租用