暂时未有相关云产品技术能力~
暂无个人介绍
Kafka 是由Linkedin公司开发的,它是一个分布式的,支持多分区、多副本,基于Zookeeper的分布式消息流平台,它同时也是一款开源的基于发布订阅模式的消息引擎系统。
消息队列目前主要2种模式,分别为“点对点模式”和“发布/订阅模式”。
执行异步任务时,比如需要处理10W个订单,如果是PHP,我们一般会配置一个定时任务,然后该定时任务就会在单机上执行;如果是GO或者JAVA,我们也需要使用相应的策略,保证该任务只在单机上执行,比如分布式锁。可能有同学会问,我直接在多机上执行同一个任务不行么,我只想说,你胆子真大,当多机同时处理一条数据,你会死的很惨的。
目前etcd主要经历了3个大的版本,分别为etcd 0.4版本、etcd 2.0版本和etcd 3.0版本。
前面的文章都是理论知识,写多了头有点大,突然想写点实战方面的内容,刚好最近公司在做异步任务迁移,用到了分布式锁和任务分片,所以打算写2篇实战方面的文章,分别介绍分布式锁和任务分片的实现方式,这个在实际项目中,应该会经常用到,今天这篇文章就先讲解分布式锁的实现方式。
以MAC系统为例,讲述2种按照方法,第一种很简单,是Mac自带的
脑裂情况其实只是异常情况的一种,当Leader通知Follower更新日志、Leader提交更新时,都存在各种异常情况导致的问题,这个我就不再详述了,具体可以参考《云原生分布式存储基石-etcd深入解析》书中的“1.4.3 异常情况”这一章,里面讲述的比较清楚。
etcd是一个Go言编写的分布式、高可用的一致性键值存储系统,用于提供可靠的分布式键值存储、配置共享和服务发现等功能
最近做的项目需要对系统设计并发控制和流控,刚好趁这个时间,把Go的并发控制和限流策略整体梳理一下,因为篇幅原因,本章只整理限流方面的内容,后面再整理Go的并发控制内容。
对于该手册里面的很多内容,我是直接将不同地方的知识直接Copy过来,然后加上自己的理解,所以里面很多知识并非原创,但是这些重要知识,散落在不同的地方,我就把它们整体汇聚起来,当大家发现里面的相关知识是你之前看过的某篇文章,这个千万不要感到奇怪。最后,对于这个手册,希望学习Go的同学都可以看看,特别是刚工作不久的同学,应该会对你们有很大帮助。
pool在掌握基础用法的同时,需要知道Get和Push方法的实现逻辑,其中最重要的一点,是需要将pool和GMP的调度原理结合起来,其中两者的P的原理其实是一样的,只是对于资源抢占这一块,GMP抢占的是G,pool抢占的是pool数据,对于这块,其实是自己个人的理解,如果理解的不对,还请大家帮忙指出。
我们今天主要讨论的是context包中的函数和Context类型,该包中的函数都是用于产生新的Context类型值的,Context类型是一个可以帮助我们实现多goroutine 协作流程的同步工具,不但如此,我们还可以通过此类型的值传达撤销信号或传递数据。
原子值类型的优势很明显,但它的使用规则也更多一些。首先,在首次真正使用后,原子值就不应该再被复制了。其次,原子值的Store方法对其参数值(也就是被存储值)有两个强制的约束。一个约束是参数值不能为nil。另一个约束是,参数值的类型不能与首个被存储值的类型不同。也就是说,一旦一个原子值存储了某个类型的值,那它以后就只能存储这个类型的值了。最后在扩展知识中,提出了几条使用建议,包括:不要对外暴露原子变量、不要传递原子值及其指针值、尽量不要在原子值中存储引用类型的值等。
本章的内容不多,主要需要注意互斥锁和读写锁的几条注意事项,读写锁其实就是更细粒度的锁划分,为了能让程序更好并发,上面已经讲述的非常清楚,这里就不再啰嗦。唯一再强调的一点,无论是互斥锁还是读写锁,我们都不要试图去解锁未锁定的锁,因为这样会引发不可恢复的 panic。
WaitGroup是开箱即用和并发安全的,可以通过它很方便地实现一对多goroutine协作流程,即:一个分发子任务的goroutine,和多个执行子任务的goroutine,共同来完成一个较大的任务。在使用WaitGroup值的时候,我们一定要注意,千万不要让其中的计数器的值小于0,否则就会引发 panic。另外,我们最好用“先统一Add,再并发Done,最后Wait”这种标准方式,来使用WaitGroup值, 尤其不要在调用Wait方法的同时,并发地通过调用Add方法去增加其计数器的值,因为这也有可能引发 panic。
本章基本都是干货,上面总结的比较全面,这里就不再重复了,如果你能回答我提的这些问题,你应该就掌握了本章的内容: • 发送和接收时,分别有哪些情况会导致channel阻塞呢? • 对于发送和关闭channel,有哪些情况会导致panic呢? • 当channel关闭后,继续读取里面的数据,能读取到么?如何保证数据读取完毕呢? • 对于生产者和消费者模型,如何才能优雅关闭channel,避免写channel导致的panic呢? • for-range读取channel数据,对于channel关闭和未关闭的情况,是如何处理的呢?会存在阻塞情况么? • 使用select时,有哪些注意事项呢?你知道se
协程跟线程是有区别的,线程由CPU调度是抢占式的,协程由用户态调度是协作式的,一个协程让出CPU后,才执行下一个协程。
一个接口类型定义了一套方法,如果一个具体类型要实现该接口,那么必须实现接口类型定义中的所有方法。
对于这一章内容,“匿名字段”用的非常多,它是其声明中只有类型而没有名称的字段,可以以一种很自然的方式为被嵌入的类型带来新的属性和能力。不过,我们需要小心可能产生“屏蔽”现象的地方,尤其是当存在多个嵌入字段或者多层嵌入的时候,“屏蔽”现象可能会让你的实际引用与你的预期不符。另外,你一定要梳理清楚值方法和指针方法的不同之处,包括这两种方法各自能做什么、不能做什么以及会影响到其所属类型的哪些方面。这涉及值的修改、方法集合和接口实现。
昨天和同事聊Redis,他问我Redis学的怎么样,我说学的还行,然后他突然问一句“你知道Redis现在已经支持多线程了吗?”,我当时愣了一下,Redis不是一直是单线程么,怎么突然支持多线程了?瞬间感觉被秒,赶紧回来查阅一下相关资料,要不然以后都不敢说自己会Redis了
对于map的使用,大家肯定都会,所以基础的知识讲解的不多,主要是对map的底层结构进行了详细的讲解,正所谓知其然,必知其所以然!对于map的底层结构设计,感觉有些意思,特别是对于它的hash方式(取前N位和后M位),再结合它的扩容和缩容,其实可以从中提炼一些共性的东西。然后对于Rehash,这个和Redis的Rehash原因一样,这块应该是业内的通用设计方法,感兴趣的同学可以看看redis的字典结构和它rehash的方法。
数组初始化方式常用的有3种,至于其它的用的很少,就不用管了
ASCII是英文“American Standard Code for Information Interchange”的缩写,中文译为美国信息交换标准代码,它是由美国国家标准学会(ANSI)制定的单字节字符编码方案,它使用单个字节(byte)的二进制数来编码一个字符。