本文主要是介绍老卫带你学---分布式系统(1),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
概念
分布式系统就是一组协作计算机系统,通过网络通信来完成一系列连贯任务
其特点在于
- parallelism并行性,cpu等计算资源可以并行计算
- toleration fault容错性,即使有一台设备出现问题,也不会影响整个系统的功能
- physical isolated物理隔离,目前分布式系统基本设计的都是物理隔离,以增强系统的健壮性
- security 安全性
分布式系统构建的本质在于,通过对底层infra的抽象来让整体变为单一系统
底层infra主要包括,storage存储,coms网络,comp计算
抽象的工具一般有rpc,threads,concurrency
Performance需要重点考虑的应该是scalebility可扩展性,因为有了可扩展就可以不断增加资源来增加系统的性能
Fault tolerance容错性重点关注:
- availability高可用性,即使有一个出现问题,也不会影响整体系统的工作。可以使用replication副本来实现,以及适用nv stotage非易失性存储来避免电源断开数据丢失问题
- consistency一致性,因为有多副本而使得一致性有不小的挑战。可以分为强一致性和弱一致性,主要差异于每次get是否都会拿到最新的更新数据。在设计强一致性的分布式系统时,会有很多的麻烦,所以需要根据业务场景看是否需要
线程与RPC
为了实现分布式系统,Threads与RPC是我们经常使用的技术
线程可以帮助我们:
- I/O Concurrency:client可以同时给Server端发送大量的请求,由Server端并发处理
- Multicore performance:充分利用多核计算资源
多线程的挑战在于对共享数据的访问,为了安全一般都需要加锁(Go里的sync.Mutex)
线程之间的协作,有的场景需要比如等待前面的线程的完成:
- channel:通过channel可以更好的进行并发的控制
- sync.Cond:也是通过mutex锁来进行并发控制,区别在于cond可以broadcast告诉其他goroutine,这样可以省去很多麻烦
- sync.waitgroup:等待协程组的完成
在分布式系统中,组件和组件之间大部分都是通过rpc进行网络通信。rpc的核心在于client、server端的通信中隐藏网络协议的细节,将语言本身的数据类型转化为wire format,增加可移植性和互操作性。好处在于可以让client端调用远程接口就像调用本地方法一样简单。
Go RPC是“最多一次”的简单形式
打开TCP连接
向TCP连接写入请求
Go RPC从不重新发送请求
所以服务器不会看到重复的请求
Go RPC代码如果没有得到回复则返回错误
这篇关于老卫带你学---分布式系统(1)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!