【分布式技术专题】「数据一致性体系」带你一同建立采用消息队列实现的数据一致性框架技术体系方案

571 阅读5分钟

分布式服务数据一致性问题

分布式服务的数据一致性问题是指在分布式系统中,由于数据的复制和分布在不同的节点上,可能会出现数据不一致的情况。这种情况可能会导致系统的错误行为,甚至会影响到系统的可用性和可靠性。

为了解决分布式服务的数据一致性问题,可以采用以下几种方法:

采用分布式事务

分布式事务是一种保证分布式系统中数据一致性的方法。 在这里插入图片描述 在分布式事务中,所有的操作要么全部成功,要么全部失败,从而保证了数据的一致性,例如我们的2PC协议模式下的处理方式。 在这里插入图片描述

3PC模式

三阶段提交协议(3PC):3PC是在2PC的基础上进行改进的一种分布式事务协议,它通过引入超时机制来避免2PC中的阻塞问题。3PC协议分为三个阶段:CanCommit阶段、PreCommit阶段和DoCommit阶段。 在这里插入图片描述

3PC模式阶段分析

  • CanCommit阶段,协调器会向各个节点发送CanCommit请求,各个节点需要回复CanCommit就绪或者CanCommit失败。
  • PreCommit阶段,协调器会向各个节点发送PreCommit请求,各个节点需要回复PreCommit就绪或者PreCommit失败。
  • DoCommit阶段,协调器会向各个节点发送DoCommit请求,各个节点需要回复Commit成功或者Commit失败。 在这里插入图片描述

采用分布式锁

分布式锁可以保证在分布式系统中只有一个节点可以对数据进行修改,从而避免了数据的冲突和不一致。 在这里插入图片描述

采用数据同步机制

数据同步机制可以将数据在不同节点之间进行同步,从而保证数据的一致性。 在这里插入图片描述

采用数据分片机制

数据分片机制可以将数据分成多个片段,每个节点只负责处理其中的一部分数据,从而减少了数据的复制和分布,降低了数据不一致的风险。 在这里插入图片描述

总之,分布式服务的数据一致性问题是一个复杂的问题,需要综合考虑多种因素,采用多种方法来解决。

针对常规方案所具有的问题

针对上述方案其实还是很有很多的弊端和问题所在,比如说存在着可用性的问题,因为很多的弊端和问题所在,比如说存在着可用性的问题,因为上述所能够成立的原因是由于mq的可用性没有问题。

那么如果一旦消息队列出现了宕机或者是我们的业务服务出现了宕机的时候,再处理过程中那么数据的一致性就很难能够保证了。

因此我们就推出了我们自己设计一套分布式事务结合消息队列所形成的一致性框架,整体流程图如下所示。 在这里插入图片描述 总体分为以下几个阶段:

预发送消息阶段

在这里插入图片描述

  1. 执行业预先发送消息操作,发送到消息服务中心,当只有发送成功之后才会执行业务方法。
  2. 执行业务方法操作。
  3. 当消息中心收到了预发送消息之后,进行存储消息数据到数据库中。

切换为可发送状态

在这里插入图片描述

  1. 当业务执行结束之后,进入可发送状态阶段,通知发送消息通知消息服务中心。
  2. 当发送成功之后切换为可发送状态,默认为待发送状态。

定时补偿更新为可发送状态

在这里插入图片描述

  1. 定时任务01,定时扫描的捞取待发送数据信息,从数据库中。
  2. 根据捞取的消息数据信息,通过业务id,请求到业务中心,进行判断是否该业务信息数据是否已经完成。
  3. 如果是未完成,直接忽略,如果是已完成则进行请求到消息中心,要求其修改状态为可发送状态。
  4. 更新消息中心的数据库为可发送状态。

定时补偿发送数据到下游业务服务

在这里插入图片描述

  1. 定时任务02,定时扫描的捞取可发送数据信息,从数据库中。
  2. 发送消息到下游服务,通过消息队列服务。
  3. 下游业务服务,幂等性消费到下游业务服务。
  4. 更新业务中心的数据库为业务数据状态跃迁。

分布式数据一致性框架总结

通过消息队列实现数据的一致性问题,可以考虑以下几种要点:

  1. 采用事务消息:事务消息是一种保证消息队列中消息的原子性、一致性和持久性的方法。在事务消息中,消息的发送和确认是在同一个事务中完成的,从而保证了消息的一致性。

  2. 采用幂等性处理:幂等性处理是指对于同一个消息的多次处理结果是相同的。通过在消息队列中对消息进行幂等性处理,可以避免重复处理消息,从而保证数据的一致性。

  3. 采用消息确认机制:消息确认机制是指在消息队列中,消费者在消费消息后需要向消息队列发送确认消息,从而保证消息已经被正确处理。通过消息确认机制,可以保证消息的可靠性和一致性。

  4. 采用消息重试机制:消息重试机制是指在消息队列中,当消息处理失败时,可以将消息重新发送到消息队列中,从而保证消息的可靠性和一致性。

总之,通过消息队列实现数据的一致性问题,需要综合考虑多种因素,采用多种方法来解决。在实际应用中,需要根据具体的场景和需求来选择合适的方法。