注:引用分布式系统原理

网络异常

网络异常是另一类常见的异常形式。节点间通过不可靠的网络进行通信。下面介绍几种常见的网络异常:
1: 消息丢失
消息丢失是最常见的网络异常。对于常见的 IP 网络来说,网络层不保证数据报文(IP fragment)的可靠传递,在发生网络拥塞、路由变动、设备异常等情况时,都可能发生发送的数据丢失。由于网络数据丢失的异常存在,直接决定了分布式系统的协议必须能处理网络数据丢失的情况。依据网络质量的不同,网络消息丢失的概率也不同,甚至可能出现在一段时间内某些节点之间的网络消息完全丢失的情况。如果某些节点的直接的网络通信正常或丢包率在合理范围内,而某些节点之间始终无法正常通信,则称这种特殊的网络异常为“网络分化”(network partition)。网络分化是一类常见的网络异常,尤其当分布式系统部署在多个机房之间时。用虚线分割了两片节点,这两片节点之间彼此完全无法通信,即出现了“网络分化”。
例 :某分布式系统部署于两个机房,机房间使用内部独立光纤链路。由于机房间的光纤链路交割调整,两个机房间通信中断,期间,各机房内的节点相互通信正常。更为严重的是,所有的英特网用户都可以正常访问两个机房内对外服务节点。本文后续将讨论出现这种严重的网络分化时,对分布式系统的设计带来的巨大挑战。
.2 消息乱序
消息乱序是指节点发送的网络消息有一定的概率不是按照发送时的顺序依次到达目的节点。通常由于 IP 网络的存储转发机制、路由不确定性等问题,网络报文乱序也是一种常见的网络异常。这就要求设计分布式协议时,考虑使用序列号等机制处理网络消息的乱序问题,使得无效的、过期的网络消息不影响系统的正确性。
.3 数据错误
网络上传输的数据有可能发生比特错误,从而造成数据错误。通常使用一定的校验码机制可以较为简单的检查出网络数据的错误,从而丢弃错误的数据。
.4 不可靠的 TCP
TCP协议为应用层提供了可靠的、面向连接的传输服务。TCP协议是最优秀的传输层协议之一,其设计初衷就是在可靠的网络之上建立可靠的传输服务。TCP 协议通过为传输的每一个字节设置顺序递增的序列号,由接收方在收到数据后按序列号重组数据并发送确认信息,当发现数据包丢失时,TCP 协议重传丢失的数据包,从而 TCP 协议解决了网络数据包丢失的问题和数据包乱序问题。TCP 协议为每个 TCP 数据段(以太网上通常最大为 1460 字节)使用 32 位的校验和从而检查数据错误问题。TCP 协议通过设置接收和发送窗口的机制极大的提高了传输性能,解决了网络传输的时延与吞吐问题。TCP 协议最为复杂而巧妙的是其几十年来不断改进的拥塞控制算法,使得 TCP 可以动态感知底层链路的带宽加以合理使用并与其他 TCP 链接分享带宽(TCP friendly)。上述种种使得 TCP 协议成为一个在通常情况下非常可靠的协议,然而在分布式系统的协议设计中不能认为所有网络通信都基于 TCP 协议则通信就是可靠的。一方面,TCP 协议保证了 TCP 协议栈之间的可靠的传输,但无法保证两个上层应用之间的可靠通信。通常的,当某个应用层程序通过TCP 的系统调用发送一个网络消息时,即使 TCP 系统调用返回成功,也仅仅只能意味着该消息被本机的 TCP 协议栈接受,一般这个消息是被放入了 TCP 协议栈的缓冲区中。再退一步讲,即使目的机器的 TCP 协议栈后续也正常收到了该消息,并发送了确认数据包,也仅仅意味着消息达到了对方机器的协议栈,而不能认为消息被目标应用程序进程接收到并正确处理了。当发送过程中出现宕机等异常时,TCP 协议栈缓冲区中的消息有可能被丢失从而无法被目标节点正确处理。更有甚者,在网络中断前,某数据包已经被目标进程正确处理,之后网络立刻中断,由于接收方的 TCP 协议栈发送的确认数据包始终被丢失,发送方的 TCP 协议栈也有可能告知发送进程发送失败。另一方面,TCP协议只能保证同一个 TCP 链接内的网络消息不乱序,TCP 链接之间的网络消息顺序则无法保证。但

在分布式系统中,一个节点向另一个节点发送数据,有可能是先后使用多个 TCP 链接发送,也有可能是同时并发多个 TCP 链接发送,那么发送进程不能认为先调用 TCP 系统调用发送的消息就一定会先于后发送的消息到达对方节点并被处理。由上述分析,在设计分布系统的网络协议时即使使用 TCP 协议,也依旧要考虑网络异常,不能简单的认为使用 TCP 协议后通信就是可靠的。另一方面,如果完全放弃使用 TCP 协议。

分布式系统的三态
由于网络异常的存在,分布式系统中请求结果存在“三态”的概念。在单机系统中,我们调用一个函数实现一个功能,则这个函数要么成功、要么失败,只要不发生宕机其执行的结果是确定的。
然而在分布式系统中,如果某个节点向另一个节点发起 RPC(Remote procedure call)调用,即某个节点 A 向另一个节点 B 发送一个消息,节点 B 根据收到的消息内容完成某些操作,并将操作的结果通过另一个消息返回给节点 A,那么这个 RPC 执行的结果有三种状态:“成功”、“失败”、“超时(未知)”,称之为分布式系统的三态。如果请求 RPC 的节点 A 收到了执行 RPC 的节点 B 返回的消息,并且消息中说明执行成功,则该 RPC 的结果为“成功”。如果请求 RPC 的节点 A 收到了执行 RPC 的节点 B 返回的消息,并且消息中说明执行失败,则该 RPC 的结果为“失败”。但是,如果请求 RPC 的节点 A 在给定的时间内没有收到执行 RPC 的节点 B 返回的消息,则认为该操作“超时”。对于超时的请求,我们无法获知该请求是否被节点 B 成功执行了。这是因为,如果超时是由于节点 A 发向节点 B 的请求消息丢失造成的,则该操作肯定没有被节点 B 成功执行;但如果节点 A 成功的向节点 B 发送了请求消息,且节点 B 也成功的执行了该请求,但节点 B 发向节点 A 的结果消息被网络丢失了或者节点 B 在执行完该操作后立刻宕机没有能够发出结果消息,从而造成从节点A看来请求超时。所以一旦发生超时,请求方是无法获知 RPC 的执行结果的。图 1-2 给出了操作成功但超时的例子。
一个非常易于理解的例子是在网上银行进行转账操作,当系统超时,页面提示:“如果系统长时
间未返回,请检查账户余额以确认交易是否成功”。
分布式系统一般需要区别对待 RPC 的“成功”、“失败”、“超时”三种状态。当出现“超时”时可以通过发起读取数据的操作以验证 RPC 是否成功(例如银行系统的做法)。另一种简单的做法是,
设计分布式协议时将执行步骤设计为可重试的,即具有所谓的“幂等性”。例如覆盖写就是一种常见的幂等性操作,因为重复的覆盖写最终的结果都相等。如果使用可重试的设计,当出现“失败”和“超时”时,一律重试操作直到“成功”。这样,即使超时的操作实际上已经成功了,重试操作也不会对正确性造成影响,从而简化了设计。后续本文中,如果说明“不成功”即指“失败”或“超时”两种状态之一。如果说明“失败”、则表示收到了明确的“失败”消息。

分布式系统的网络异常相关推荐

  1. SDN 云数据中心网络异常行为的智能处理实践

    火炉山蚁群 ┃ 一群自研转型的背锅侠 摘要:云数据中心的网络异常行为不仅对网络设备造成严重业务负荷,同时也显著影响云用户使用感知.云计算环境中的共享资源模式和云用户迥然不同的业务形态,使得云网络分析和 ...

  2. Ubuntu16.04 下的网易云出现网络异常、无法播放,界面无响应问题的统一解决

    能够在Linux系统下体验到原生界面的网易云音乐是件不错的事情,但是它总是经常性的出现网络异常,界面无响应的问题 为了听歌的体验,进行深入探究: 首先通过终端启用网易云音乐:sudo netease- ...

  3. 阿拉德之怒显示服务器错误,阿拉德之怒网络异常怎么办 安装失败怎么办

    阿拉德之怒安装失败怎么办,网络异常怎么办,玩家在玩阿拉德之怒的时候,由于手机和服务器等等原因,会出现阿拉德之怒安装失败或者网络异常等等情况,影响游戏体验,那么怎么办呢,今天369手游网小编将给大家带来 ...

  4. 使用NetFlow分析网络异常流量

    一.前言 近年来,随着互联网在全球的迅速发展和各种互联网应用的快速普及,互联网已成为人们日常工作生活中不可或缺的信息承载工具.然而,伴随着互联网的正常应用流量,网络上形形色色的异常流量也随之而来,影响 ...

  5. 如果MySQL事务中发生了网络异常?

    一 前言 在我们运维MySQL的时候,总会遇到各种情况导致程序和MySQL之间的会话异常中断,比如 假如强制关闭应用 假如client机器突然崩溃宕机/断电 假如网络发生抖动/网卡发生故障 机房级别断 ...

  6. Ajax 请求超时与网络异常

    <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8" ...

  7. 在C#中利用Keep-Alive处理Socket网络异常断开的方法

    最近我负责一个IM项目的开发,服务端和客户端采用TCP协议连接.服务端采用C#开发,客户端采用Delphi开发.在服务端开发中我碰到了各种各样的网络异常断开现象.在处理这些异常的时候有了一些心得,现在 ...

  8. 使用enterTextInWebElement处理qq授权页报“网络异常,请稍后再试”的解决方法

    robotium4.0之后支持处理WebElement,从此第三方的web页有更简单的解决方法. 上周五我很愉快的处理完新浪微博和腾讯微博的授权页之后,这周一处理qq的授权页,发现使用robotium ...

  9. 刺激战场战斗服务器无响应,绝地求生刺激战场网络异常怎么办 波动异常解决...

    最近一些小伙伴老是遇到网络环境异常的警告,这一类问题除了游戏本身和网络问题外,和使用科技也是有关系的,那么绝地求生刺激战场网络异常怎么办呢?来随小编看看吧. 1.网络问题 先看下是不是网络太差导致的, ...

  10. 楚乔传手游 服务器维护,楚乔传手游网络异常进不去游戏怎么办?楚乔传网络异常解决方法...

    随着楚乔传的大热,手游楚乔传也应运而生,上线后的楚乔传手游版虽然好玩但也出现了许多的BUG和问题,最近有小伙伴说楚乔传手游下载后,打不开一直显示网络异常,但是网都好的,那么楚乔传手游网络异常怎么办?楚 ...

最新文章

  1. linux kernel内存映射实例分析
  2. php %3c%3c%3c 解析常量,PHP基础知识小结1
  3. ActivityLifecycleCallbacks
  4. 有机物燃烧的化学方程式配平(洛谷P1994题题解,Java语言描述)
  5. Y15BeTa的乱搞方法(占坑待填)
  6. U3D性能分析 Profiling
  7. 【Elasticsearch】ARS提升检索吞吐率
  8. Python chardet
  9. oracle 扩充语句,Oracle扩充表空间语句
  10. 西南科技大学城市学院计算机专业录取分数线,西南科技大学城市学院2020年录取分数线(附2017-2020年分数线)...
  11. 【地理中国】百年地理大发现(全8集)内容笔记记录
  12. java中math是什么意思,java中的Math种
  13. python文件双击闪退_解决python文件双击运行秒退的问题
  14. NVIDIA Jetson TX2 上手指南
  15. 利用Python实现自动识别图片文字 -- OCR
  16. 副业案例-晴矢分享 短视频MCN亏损500W的总结的血泪经验
  17. 如何进行安全性测试?
  18. 助教总结 -【福大软工实践-2017-2018-K班】
  19. SMTP邮件发送原理
  20. 害怕疼痛不想打胰岛素无针注射器能减少注射时带来的疼痛

热门文章

  1. 云主机被挖矿解决方法
  2. TypeScript学习--Symbols
  3. 头像设计,如何用PS制作个性头像
  4. 西南大学网络作业答案计算机,西南大学网络教育2018[9124]《计算机图像处理基础》作业标准答案.docx...
  5. 安庆集团-冲刺日志(第九天)
  6. ff7重制版青魔法_《FF7重制》敌方招式获取方式与效果
  7. c语言tap位置什么意思,CTAP是什么意思
  8. 项目管理知识体系指南(四)项目管理范围
  9. 在CentOS上重新编译nginx,加sticky模块
  10. 通过Windows任务计划 ,定期恢复虚拟机快照