分布式
前言
这篇文章对我目前理解的分布式系统做一个介绍,包括什么是分布式系统,引入分布式系统带来的数据一致性问题。
什么是分布式系统
我们先说说什么是分布式系统,我目前对分布式系统的理解其实很粗俗。
随着互联网业务的发展,传统的、部署在单机上的单体架构已经无法承受用户的高并发请求的访问,因为一台计算机的内存、CPU 资源是有上限的,当压榨一台机器达到瓶颈时,我们就不得不想其他的办法来提升整个系统的可支配的资源上限。
一个显而易见的方式就是堆机器,我们将原来系统中的业务模块做拆分,拆分成一个个更小的业务模型,比如结算域、订单域、交易域等,然后将这些更小的业务域部署到不同的机器上,更进一步的,我们还可以在多台机器上部署相同的服务,做成集群,整体通过负载均衡对外提供服务。
这样机器一多,那么整个系统能够支配的 CPU、内存、存储资源也会更多,就能应对更高的并发和流量。
数据一致性问题
虽然通过增加机器解决了整个系统的资源瓶颈,但是也带来了一些额外的问题。
首当其冲的就是节点之间如何进行通信,同一个节点上进程间的通信(IPC)可以基于消息队列、共享内存、管道等来实现,但是对于跨节点进程通信,就不得不使用 Socket 网络通信。
但网络总是不可靠的,它会带来接口调用的第三种结果,超时,这种不知道实际成功还是失败的结果又会引发一些其他的问题,比如数据一致性问题。
以电商交易场景为例,用户支付订单这一核心操作的同时会涉及到下游物流发货、积分变更、购物车状态清空等多个子系统的变更。
假设支付订单之后远程调用下游物流发货超时,那我们支付订单这个事务是要提交还是回滚呢?如果支付回滚,但实际上物流发货成功,这出现了数据不一致的问题,如果支付提交,但实际上物流发货失败,这还是出现了数据不一致性的问题。
所以正是由于网络调用超时的出现,我们不确定下游系统的状态,从而导致了数据不一致的问题。
实际上,这种数据不一致更多的体现在事务不一致,这其中掺杂着分布式事务的解决方案,除此之外,还有一种副本一致性。
更多数据一致性的内容,你可以参考:CAP 和一致性理论
后记
后面不断成长,应该会有一些更深刻的体会,不断更新。