`

JGroups的可靠性保证

 
阅读更多

         Jgroups的传输协议有UDP、TCP 等,在这些传输协议上,为可靠性提供了UNICAST、UNICAST2、UNICAST3、pbcast.NAKACK、pbcast.NAKACK2五种自定义协议,其中前三种用于点对点传输,后两种用于多播。下边来看下其如何做到可靠性保证:

      1.   UNICAST:    主动重发、逐个确认,有如下3个步骤:

                  A                                                  B

           1):    |-------------send msg------------->|

           2):    |<----------- ack-----------------------|

           3):    |-------------retransmit------------->|

        假设是节点A向B节点发送消息

        1):  A向B发送消息,同时在内存中保存消息(用于重发)。

        2): 如果B收到消息会立刻返回一个确认ack,A收到确认后从内存中删除相应的信息。

        3): 在发送方A,会启动一个定时器定时检测有多少消息已被确认,没被确认的消息要逐个重发。

       这种方式的优缺点为:(+:优点  -: 缺点)

      +. 占用内存小,因为正常情况下,每条消息发送之后会立刻得到确认,然后立刻被丢弃。

      +. 简单。在传输过程丢失消息或者确认消息丢失,一定周期A会重发消息。

      -.  频繁的通信,每一条消息对应一条确认消息。

      -.  没有必要的消息重发。试想,如果因为网络延迟A没及时收到确认消息或者确认消息根本就丢失了,则A就重发消息,其实这是没必要的。

      1.   UNICAST2:    被动重发,主要是为了解决UNICAST的两个缺点,有如下3个步骤:

                  A                                                B

           1):    |-------------send msg------------>|

           2):    |<---interval need retransmit----|

           3):    |------------ retransmit------------>|

           4):    |<--------interval stable msg-----|

        假设是节点A向B节点发送消息

        1):  A向B发送消息,同时在内存中保存消息(用于重发)。

        2):  B收到消息不会返回确认消息,而是启动定时线程,定时检测有消息丢失就向A请求重发。

        3):  A收到重发请求,向B重发丢失的消息。

        4):  B定时计算收到消息总量大小到达一定量后,向A发送清理B已经收到的消息的请求,A收到消息则删除内存中B已经收到的消息。

       这种方式的优缺点为:(+:优点  -: 缺点):

      +.  减少没必要的消息确认。

      +.  消息传输速度快。

       -.  第一条和最后一条消息有可能没有可靠性保证。

            试想,如果A向B发送的第一条消息丢失了,直到B收到后续的消息才会检测到第一条消息丢失,才要求A重发,如果A只发送这一条消息呢?  类似的,如果A发送[1...5] 条消息,而消息5丢失,B只收到[1....4]消息,那么B无法要求A重发消息5,因为其不知道A到底发送了消息没有,只有B收到后续的消息才能检测到消息5丢失,才会要求A重发;或者直到B向A发送清理资源的消息后,A才重发消息5,而这过程很长。

        所以我们要对第一条消息和最后一条消息来进行特殊处理。对于第一条消息,接收方收到后一定要立刻返回确认消息,在发送方如果没有收到第一条消息的确认消息,则会定时重发第一条消息,如下图。 

                A                                                   B

           1):    |-------------send msg------------->|

           2):    |<-----------ack  first msg----------|

           3):    |-------------resend first msg---->|

           4):    |<------------need retransmit------|

           5):    |------------retransmit-------------->|

           6):    |<-------interval stable msg-------|

         对于最后一条消息的情况,接收方每次收到消息,在批量删除已被正确分发的消息后,向发送方发出一条清除资源的消息,发送方收到这条消息后重发丢失的消息。如下图:

                A                                                   B

           1):    |-------------send msg------------->|

           2):    |<-----------ack  first msg----------|

           3):    |-------------resend first msg---->|

           4):    |<------------stable msg------------|

           5):    |<------------need retransmit------|

           6):    |------------retransmit miss msg->|

           7):    |<-------interval stable msg-------|

       因为这个特殊处理,每次收到一条消息就会立刻发送一条清除资源消息,这么看来,和UNICAST中每次收到消息就返回确认消息,并没有减少网络通信?! 其实,还是有区别的,这里,在时间T0,如果收到5条消息,只发送一条清除资源消息。

      总体上看,UNICAST2并没有比UNICAST有太多的优势,反倒复杂很多。 如果把UNICAST和UNICAST2结合起来,会如何?  UNICAST3由此应运而生.

      1.   UNICAST:    UNICAST和UNICAST2的结合,目的是提供可靠性保证同时减少网络通信和资源。

                  A                                                             B

           1):    |-------------send msg----------------------->|

           2):    |<-----------interval ack-----------------------|

           3):    |<-----------interval need retransmit--------|

           4):    |--------------retransmit miss msg---------->|

           5):    |<-----------interval retransmit last   msg---|

        假设是节点A向B节点发送消息

        1):  A向B发送消息,同时在内存中保存消息(用于重发)。

        2):  B收到消息不是立刻返回确认消息ack,而是,定时向A发送确认,而且只确认最新的正确分发的消息 

        3):  B启动一个定时线程,定时检测有消息丢失就向A请求重发。   

        4):   A收到重发请求,向B重发丢失的消息。   

        5):  在发送方A,会启动一个定时器定时检测有多少消息已被确认,有消息没被确认则重发最后的那条消息(不像UNICAST重发所有消息)。

 

       所以,因为接收方周期且经过合并的发送确认消息,比UNICAST减少了很多网络通信。 而且,在发送方定时检测丢失消息,只重发最后的消息,减少没必要的消息重发,而且解决了UNICAST2的第一条及最后一条消息丢失的问题。

分享到:
评论

相关推荐

    JGroups_集群.pdf

    在JGroups中,消息传输可以保证可靠性,即消息在传输过程中不会丢失,所有的接收者以相同的顺序接受所有的消息,并且原子性,即一个消息要么被所有的接收者接收,要么不被任何一个接收者都接收。 JGroups的主要功能...

    jgroups官方帮助文档html格式打包2.X版本

    JGroups是Java平台上的一个开源通信框架,主要用于构建高效、可靠且容错的集群通信系统。它提供了多种协议和服务,使得节点间可以进行消息传递,从而实现数据共享、状态传播、故障检测等功能。此文档主要针对JGroups...

    Java多播通讯框架 JGroups

    总的来说,JGroups是Java开发人员构建分布式系统时的强大工具,它简化了集群通信的复杂性,提供了高效、可靠的通信机制。通过灵活的协议栈配置,开发者可以根据具体需求调整性能和功能,从而实现高度定制化的解决...

    Jgroups-all.jar

    JGroup可以基于TCP协议来实现消息广播,也可以通过UDP方式来广播消息,利弊不言而喻,TCP可靠,但是代价大,性能没有UDP来的好,UDP速度快,代价小,但是消息的丢失率以及无序性有着很大的限制。但是JGroup在UDP方式...

    JGROUPS集群框架源码分析之消息发送、处理、接收

    JGROUPS是一款强大的开源通信框架,专为构建高可用性、高容错性的分布式系统而设计。它提供了集群内的消息传递功能,允许节点间可靠地交换信息。本文将深入探讨JGROUPS在消息发送、处理和接收方面的实现原理。 1. ...

    JGroups通讯框架 v4.2.27.zip

    通过调整堆栈配置,可以优化性能和可靠性。 3. **创建Channel**:Channel是JGroups的主要接口,通过它发送和接收消息,加入和离开组。 4. **编程模型**:JGroups提供了多种编程模型,如收发消息的API、基于事件的...

    JGroups群组通讯工具包 v5.3.4.zip

    6. **可扩展性**:JGroups的设计允许用户自定义协议栈,以满足特定的性能和可靠性需求。 7. **安全性**:提供了安全协议,如加密和认证,保护群组通信不被窃听或篡改。 在JGroups-jgroups-5.3.4.Final目录下,通常...

    encache+jgroups集群缓存共享

    它的协议栈可以根据具体需求进行配置,支持TCP、UDP等多种传输协议,以及一系列优化策略,如GMS(Group Membership Service)用于管理群组成员,FLUSH协议用于一致性保证,NAKACK用于可靠的消息传递等。 在EnCache...

    Ecahche+Jgroups

    Jgroups是一个用于构建集群通信的工具,它可以提供节点间的可靠消息传递,确保消息的顺序性和一致性。Jgroups支持多种协议栈,这些协议栈涵盖了诸如成员发现、消息传输、故障检测和恢复等多个方面。通过灵活配置,...

    JGroups通讯框架 v4.2.8-源码.zip

    消息的可靠性是其另一个关键特性,JGroups提供了诸如确认重传、排序保证等机制,确保消息的准确无误地传递。此外,JGroups还具有高效的并发处理和缓存策略,能有效地处理高并发场景下的大量消息。 在故障检测和恢复...

    jgroups-chat:JGroups 聊天

    - **并发控制**: 在多线程环境中,可能需要使用锁或其他并发控制机制来保证数据的一致性。 4. **AGH 2015 分布式系统课程** - AGH 大学可能在 2015 年的分布式系统课程中使用 JGroups 聊天作为示例项目,让学生...

    activemq-transport-jgroups-1.2.jar.zip

    在ActiveMQ中,JGroups负责在节点间传递消息,确保数据的一致性和可靠性。通过使用JGroups,ActiveMQ可以实现节点间的组播和单播通信,支持故障检测和自动故障恢复,从而提高了服务的健壮性。 在"activemq-...

    activemq-transport-jgroups-1.3.jar.zip

    ActiveMQ是Apache软件基金会开发的一款强大的消息队列,它遵循开放消息中间件协议(Open Message Broker Protocol,简称AMQP),支持多种消息协议,如STOMP、XMPP、AMQP等,能够实现高效率、高可靠性的消息传递。...

    activemq-transport-jgroups-1.5.jar.zip

    例如,NAKACK协议用于在可能丢失或重复的数据包中保证消息的顺序性和可靠性,而UNICAST协议则用于高效、无损的单播通信。 在实际应用中,activemq-transport-jgroups-1.5.jar的配置通常会涉及到ActiveMQ的XML配置...

    基于Java的多播通讯框架 JGroups.zip

    JGroups的设计目标是提供高可用性、容错性和性能。它支持故障检测和恢复机制,如心跳检测、快速故障检测算法(如PING和PING2)以及更高级的故障恢复策略(如VIEWACK和STATE_TRANSFER)。此外,JGroups还提供了消息...

    基于JGroups的分布式缓存的设计与实现.pdf

    - **消息确认**:确认消息被正确接收,提高通信的可靠性。 ### 实验与结果 实验表明,该分布式缓存实现方案在保证数据冗余备份的同时,拥有良好的可扩展性。这体现在它能够应对节点数量变化和数据迁移带来的挑战,...

    jgroups-3.6.4-fixed

    标题中的"jgroups-3.6.4-fixed"暗示了这是一个针对3.6.4版本的修复版,意味着在原有基础上对某些问题进行了优化和修复,以提升系统的稳定性和可靠性。 JGroups的核心功能包括组成员管理、消息传递和故障检测,它为...

    Java多播通讯框架 JGroups源码

    2. **消息处理**:JGroups如何序列化和反序列化消息,以及如何保证消息的顺序性和一致性,这些都是源码中值得关注的点。 3. **容错机制**:JGroups如何检测和应对节点故障,包括心跳检测、故障恢复策略等。 4. **...

    基于java的开发源码-多播通讯框架 JGroups.zip

    4. **成员管理**:维护集群成员关系,自动处理新加入或离开的节点,保证集群状态的一致性。 5. **负载均衡**:通过负载感知和负载均衡策略,优化资源分配,提高系统性能。 6. **安全性**:提供加密、认证和授权服务...

    vertx-jgroups:基于JGroups的集群管理器实现

    4. **一致性保证**:JGroups的协议栈支持各种一致性算法,使得Vert.x应用可以实现分布式状态的一致性。 **使用方法** 要使用`vertx-jgroups`,开发者首先需要在Vert.x应用中引入JGroups模块,然后配置集群参数,如...

Global site tag (gtag.js) - Google Analytics