课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据一致性是我们在做数据分析的前提,而今天我们就通过案例分析来了解一下,程序员在解决数据不一致的问题的时候都有哪些方法。
如何消除数据不一致?
根据CAP理论,分区容错性、可用性和一致性里面必须要牺牲掉一个,而在实际实现过程中,分区容错性和可用性是很难舍弃的,所以通常会舍弃一致性,取而代之会用终一致性保证数据在可容忍的时长内达到终一致。
微服务架构也不例外,在服务内部,可以通过本地事务保证数据的强一致性;而当业务发生在多个服务中,我们追求终一致性。那么都有哪些措施可以保证跨服务的终一致性呢?
避免同时跨服务的写操作
这是个业务问题,在微服务的架构下,每个服务都是独立的,如果有一个业务功能需要同时修改两个服务的数据,往往这个业务可以拆分成两个步骤,比如场景一种提到的订单和库存的例子,如果我们可以先锁定库存,然后再确认订单看上去这个问题就迎刃而解了。
因此在业务中发现一个功能需要同时修改两个服务的数据,我们先可以来讨论这个业务设计是否合理;如果业务上很多场景都要求两个服务的数据保持强一致,那可能我们需要看看微服务的划分是否合理。
大努力通知+大努力处理
为了解决场景二和场景三的不一致性问题,需要上游服务和下游服务的共同努力:上游服务需要尽可能将事件发送出去,比如:先同步发送,如果失败改为异步重试,重试多次仍然失败可以先持久化,通过定时任务来重发或者人工干预重发。下游服务也要尽可能的把事件处理掉,收到事件后可以考虑先将事件持久化,消费成功后标记事件,如果消费失败可以通过定时任务重试消费。
保证幂等性
当我们提到重试,就不得不考虑幂等性的问题,这里的幂等性包括以下两个场景:
上游服务接口的幂等性,保证下游系统的重试逻辑可以得到正确响应
下游服务消费事件保证幂等性,避免因上游多发事件或事件已消费成功后再次重试产生的问题
核心业务数据补偿机制
即便我们做了很多我们认为万全的准备,在分布式系统的执行链路上,每个节点都有可能失败,加上业务的复杂度,数据不一致的情景也很难彻底解决,而对于那些小概率发生但技术解决起来成本昂贵的问题,我们可以尝试通过对业务的深刻理解设计一些后台的数据维护功能,保证在核心业务数据异常时,可以在一定的规则内进行修复,从而保证业务的顺利进行
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请在707945861群中学习了解。