草庐IT

读书区

全部标签

《Go 语言并发之道》读书笔记(三)

今天这篇笔记我们来学习锁:互斥锁(Mutex)和读写锁(RWMutex)互斥锁(Mutex)首先我们来看一段代码,没有加锁的情况下,两个goroutine同时修改一个变量,会发生什么funcmain(){ varcountint increment:=func(){ count++ fmt.Printf("Incrementing:%d\n",count) } decrement:=func(){ count-- fmt.Printf("Decrementing:%d\n",count) } vararithmeticsync.WaitGroup fori:=0;i上面的代码定义了一个

《Go 语言并发之道》读书笔记(六)

今天这篇笔记我们来学习一下context包context包的一个应用场景是可以通过它控制goroutine的取消,超时等。我们先来看一个取消的例子context.WithCancelfuncdoSomething(ctxcontext.Context){ ctx,cancelctx:=context.WithCancel(ctx) printCh:=make(chanint) godoAnother(ctx,printCh) fori:=0;i我们在doSomething方法中加了一个可以取消的Context,然后定义了一个channel,往channel里面放入3个数,另外启动一个gorou

《Go 语言并发之道》读书笔记(六)

今天这篇笔记我们来学习一下context包context包的一个应用场景是可以通过它控制goroutine的取消,超时等。我们先来看一个取消的例子context.WithCancelfuncdoSomething(ctxcontext.Context){ ctx,cancelctx:=context.WithCancel(ctx) printCh:=make(chanint) godoAnother(ctx,printCh) fori:=0;i我们在doSomething方法中加了一个可以取消的Context,然后定义了一个channel,往channel里面放入3个数,另外启动一个gorou

《Go 语言并发之道》读书笔记(四)

今天这篇笔记我们记录sync包下面的Cond,Once和PoolCondcond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子funcmain(){ c:=sync.NewCond(&sync.Mutex{}) queue:=make([]interface{},0,10) removeFromQueue:=func(delaytime.Duration){ time.Sleep(delay) c.L.Lock() queue=queue[1:] fmt.

《Go 语言并发之道》读书笔记(四)

今天这篇笔记我们记录sync包下面的Cond,Once和PoolCondcond就是条件,当条件不满足的时候等待Wait(),条件满足后,继续执行。通过Signal()和Broadcast()来通知wait结束,继续执行。我们先来看一个Signal通知的例子funcmain(){ c:=sync.NewCond(&sync.Mutex{}) queue:=make([]interface{},0,10) removeFromQueue:=func(delaytime.Duration){ time.Sleep(delay) c.L.Lock() queue=queue[1:] fmt.

《Go 语言并发之道》读书笔记(五)

今天这篇笔记我们来记录Channel和Select,Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。定义Channel双向Channel要定义一个channel很简单,只需要在类型前面加上chan就可以了,stringStream:=make(chanstring)这样就是定义和实例化了一个string类型的双向channel,先来看一个HelloWorld的例子funcmain(){ stringStream:=make(chanstring) gofunc(){ stringStream运行代码控制台打印出“Hellochannels”,这个简单的例

《Go 语言并发之道》读书笔记(五)

今天这篇笔记我们来记录Channel和Select,Go语言并发中Channel是goroutine传递数据的桥梁,是非常重要的一个工具。定义Channel双向Channel要定义一个channel很简单,只需要在类型前面加上chan就可以了,stringStream:=make(chanstring)这样就是定义和实例化了一个string类型的双向channel,先来看一个HelloWorld的例子funcmain(){ stringStream:=make(chanstring) gofunc(){ stringStream运行代码控制台打印出“Hellochannels”,这个简单的例

《微服务架构设计模式》读书笔记 | 第6章 使用事件溯源开发业务逻辑

目录前言1.使用事件溯源开发业务逻辑概述1.1传统持久化技术的问题1.2事件溯源通过事件来持久化聚合1.3事件溯源对领域事件提出的新需求1.4事件代表状态的改变1.5聚合方法都和事件相关;1.6创建与更新聚合的步骤1.7基于事件溯源的Order聚合1.8使用乐观锁处理并发更新1.9事件溯源和发布事件1.10使用快照提升性能1.11幂等方式的消息处理1.12领域事件的演化1.13事件溯源的好处与弊端2.实现事件存储库2.1EventuateLocal事件存储库的工作原理2.2针对Java语言的EventuateClient框架提供的主要类和接口3.同时使用Saga和事件溯源3.1使用事件溯源实现

《微服务架构设计模式》读书笔记 | 第6章 使用事件溯源开发业务逻辑

目录前言1.使用事件溯源开发业务逻辑概述1.1传统持久化技术的问题1.2事件溯源通过事件来持久化聚合1.3事件溯源对领域事件提出的新需求1.4事件代表状态的改变1.5聚合方法都和事件相关;1.6创建与更新聚合的步骤1.7基于事件溯源的Order聚合1.8使用乐观锁处理并发更新1.9事件溯源和发布事件1.10使用快照提升性能1.11幂等方式的消息处理1.12领域事件的演化1.13事件溯源的好处与弊端2.实现事件存储库2.1EventuateLocal事件存储库的工作原理2.2针对Java语言的EventuateClient框架提供的主要类和接口3.同时使用Saga和事件溯源3.1使用事件溯源实现

《微服务架构设计模式》读书笔记 | 第4章 使用Saga管理事务

目录前言1.微服务架构下的事务管理1.1分布式事务的挑战1.2一个Saga的示例1.3Saga使用补偿事务来回滚所作出的改变2.Saga的协调模式2.1两种Saga协调模式2.2实现协同式的CreateOrderSaga2.3协同式Sage服务间通信相关的问题2.4协同式Sage的优缺点2.5实现编排式的CreateOrderSaga2.6把Saga编排器视为一个状态机2.7编排式Saga的优缺点3.解决隔离问题3.1Saga只满足ACD3.2缺乏隔离导致的问题3.3Saga的结构模型术语3.4解决隔离问题的对策4.OrderService和CreateOrderSaga的设计4.1Order