首页
精选文章锁【Golang】查看全文通过通信共享数据,而不是通过共享内存共享数据是Golang中的并发理念,通信共享的数据只在自己的程序上下文有效,不会把副作用扩散到其他部分,所以通过通信共享数据更加简单,效率也更高。但是依然有场景需要不同线程之间共享数据,共享临界区的数据需要同步机制,通常也就是锁。Golang的锁分为普通的互斥锁以及读写锁,除了需要阻塞等待的锁之外,Golang还提供了原子操作类sync/atomic,atomic可以实现自旋锁。 互斥锁 sync.Mutex是Golang中普通的互斥锁的实现,锁的实现需要下列组件。 临界区状态的标识,代表临界区是否已经被占用。 请求锁的流程,请求锁的过程如果临界区还没有被锁定,则直接加锁,如果已经被其他线程锁定,sync.Mutex首先通过自旋的方式等待,通过若干次自旋仍然不能获取锁,则通过信号量阻塞当前线程。 锁的释放,通过信号唤醒阻塞的线程。 sync.Mutex的定义如下:Golang 语言中的 Mutex 实现在进入阻塞状态之前会采用自旋的方式来尝试加锁/解锁。 加锁 调用 Lock 加锁是在没有冲突的情况下直接使用 CAS 加锁。 加锁失败的情况下首先尝试自旋等待锁释放,进入自旋的条件是多核、GOMAXPROCS > 1 并且 mutex 是非饥饿模式的情况。 如果自旋尝试超过4次仍未获取锁,则按照 FIFO 的规则加入队列等待。 解锁 调用Unlock时如果没有冲突,则直接解锁。 否则就去唤醒等待队列中的一个 goroutine 去获取锁。 Mutex 可能处于两种不同的模式,正常模式和饥饿模式,两种模式类似于非公平锁和公平锁。 正常模式下,在队列中等待的 goroutine 和新的…Defer【Golang】查看全文defer 语句注册了一个函数调用,这个调用会延迟到defer语句所在的函数执行完毕后执行,所谓执行完毕是指该函数执行了return语句、函数体已执行完最后一条语句或函数所在的协程发生了panic。defer 语句可以在函数结束执行,所以通常用于进行资源的释放以及清理。 Go 1.13 版本之后的 defer 都在栈上进行分配,所以defer的执行顺序和声明顺序是相反的。 defer 结构体的定义如下:微服务查看全文微服务一般指一种架构思想,即把应用程序拆解为很多独立的微型组件或者服务,服务之间通过远程过程调用(RPC)或者消息的方式进行交互。微服务架构一般会根据不同的功能模块,基于不同的业务,将系统拆分成若干个独立的进程,进程之间会通过同步RPC或者异步消息的方式进行通信。 微服务因为服务数量较多,所以一般会提供独立的网关服务提供统一的对外出口。 微服务架构相较传统的单体架构,有以下优势: 单体应用只能由单一的技术栈进行开发,而微服务架构下,可以采用混合技术栈研发的模式,每个组件可以使用自己的技术栈。 单体应用通用业务逻辑复杂,给开发带来的较高的复杂度,因为耦合的业务逻辑很容易出现变更风险,而且在发布阶段也会因为不同的功能版本耦合在一个应用中而产生更高的风险,而微服务架构下,每个组件的功能更加单一,逻辑更加简单,所以可以提升研发效率,也更方便部署运维。 微服务因为把业务逻辑打散在多个组件,所以提供更高的鲁棒性,天然实现了错误隔离,较少会出现整体不可用的情况。 原则 架构的第一性要求是简单,微服务架构存在数据一致性问题,性能消耗,维护成本高等问题,所以从单体架构迁移到微服务架构一定要有充分的推演逻辑进行支撑,比如单体架构的复杂度过高,已经不能满足后续的业务迭代,单体架构的性能出现问题,必须进行微服务拆分满足性能问题,或者单体服务在组织协助层面已经不能满足当前的需求等。 微服务的拆分可以分为水平拆分,垂直拆分,横向功能拆分等。 水平拆分主要是按照服务承担的职责进行划分,例如分为接入层,逻辑层,存储层等。 垂直拆分按照业务功能拆分为不同的微服务。 通信 微服务之间的通信可以采用Http,SOA,RPC等方式进行通信… |
热门分类开源Golang消息队列JavaJavascriptLinuxMysqlNLPPHP事务内存管理分布式理论分类存储常用存储开源软件操作系统画图网络编程数据库算法虚拟化前端存储理论常用算法微服务数据结构算法应用计算机原理中间件共识算法分布式分治动态规划容器并发排序架构组件绘图工具网络协议编程语言理论算法思想树缓存架构C++字符串算法工程思想搜索
算法题库
精选内容 |