09
2020
04

Etcd怎么实现分布式锁?

首先思考下Etcd是什么?可能很多人第一反应可能是一个键值存储仓库,却没有重视官方定义的后半句,用于配置共享和服务发现。A highly-available key value store for shared configuration and service discovery.实际上,etcd 作为一个受到 ZooKeeper 与 doozer 启发而催生的项目,除了拥有与之类似的功能外,更专注于以下四点。简单:基于 HTTP+JSON 的 API 让你用 curl 就可以轻松使用。安全:
09
2020
04

分布式锁实现原理,用过吗?

在分析分布式锁的三种实现方式之前,先了解一下分布式锁应该具备哪些条件:在分布式系统环境下,一个方法在同一时间只能被一个机器的一个线程执行;高可用的获取锁与释放锁;高性能的获取锁与释放锁;具备可重入特性;具备锁失效机制,防止死锁;具备非阻塞锁特性,即没有获取到锁将直接返回获取锁失败。分布式的CAP理论告诉我们“任何一个分布式系统都无法同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance),最多只能同时满足两项。”所以,很多
09
2020
04

微服务架构是什么样子的?

通常传统的项目体积庞大,需求、设计、开发、测试、部署流程固定。新功能需要在原项目上做修改。但是微服务可以看做是对大项目的拆分,是在快速迭代更新上线的需求下产生的。新的功能模块会发布成新的服务组件,与其他已发布的服务组件一同协作。 服务内部有多个生产者和消费者,通常以http rest的方式调用,服务总体以一个(或几个)服务的形式呈现给客户使用。微服务架构是一种思想对微服务架构我们没有一个明确的定义,但简单来说微服务架构是:采用一组服务的方式来构建一个应用,服务独立部署在不同的进程中,不同服务通过
09
2020
04

LVS相关了解.

LVS是 Linux Virtual Server 的简称,也就是Linux虚拟服务器。这是一个由章文嵩博士发起的一个开源项目,它的官方网站是LinuxVirtualServer现在 LVS 已经是 Linux 内核标准的一部分。使用 LVS 可以达到的技术目标是:通过 LVS 达到的负载均衡技术和 Linux 操作系统实现一个高性能高可用的 Linux 服务器集群,它具有良好的可靠性、可扩展性和可操作性。 从而以低廉的成本实现最优的性能。LVS 是一个实现负载均衡集群的开源软件项目,LVS架构
09
2020
04

负载均衡原理是什么?

负载均衡Load Balance)是高可用网络基础架构的关键组件,通常用于将工作负载分布到多个服务器来提高网站、应用、数据库或其他服务的性能和可靠性。负载均衡,其核心就是网络流量分发,分很多维度。负载均衡(Load Balance)通常是分摊到多个操作单元上进行执行,例如Web服务器、FTP服务器、企业关键应用服务器和其它关键任务服务器等,从而共同完成工作任务。负载均衡是建立在现有网络结构之上,它提供了一种廉价有效透明的方法扩展网络设备和服务器的带宽、增加吞吐量、加强网络数据处理能力、提高网络的
09
2020
04

并发编程概念是什么?

并行是指两个或者多个事件在同一时刻发生;并发是指两个或多个事件在同一时间间隔发生。并行是在不同实体上的多个事件,并发是在同一实体上的多个事件。在一台处理器上“同时”处理多个任务,在多台处理器上同时处理多个任务。如hadoop分布式集群并发偏重于多个任务交替执行,而多个任务之间有可能还是串行的。而并行是真正意义上的“同时执行”。并发编程是指在一台处理器上“同时”处理多个任务。并发是在同一实体上的多个事件。多个事件在同一时间间隔发生。并发编程的目标是充分的利用处理器的每一个核,以达到最高的处理性能。
09
2020
04

Golang 中 Goroutine 如何调度?

goroutine是Golang语言中最经典的设计,也是其魅力所在,goroutine的本质是协程,是实现并行计算的核心。 goroutine使用方式非常的简单,只需使用go关键字即可启动一个协程,并且它是处于异步方式运行,你不需要等它运行完成以后在执行以后的代码。go func()//通过go关键字启动一个协程来运行函数协程:协程拥有自己的寄存器上下文和栈。协程调度切换时,将寄存器上下文和栈保存到其他地方,在切回来的时候,恢复先前保存的寄存器上下文和栈。 因此,协程能保留上一次调用时的状态(即
09
2020
04

Golang GC 时会发生什么?

首先我们先来了解下垃圾回收.什么是垃圾回收?内存管理是程序员开发应用的一大难题。传统的系统级编程语言(主要指C/C++)中,程序开发者必须对内存小心的进行管理操作,控制内存的申请及释放。因为稍有不慎,就可能产生内存泄露问题,这种问题不易发现并且难以定位,一直成为困扰程序开发者的噩梦。如何解决这个头疼的问题呢?过去一般采用两种办法:内存泄露检测工具。这种工具的原理一般是静态代码扫描,通过扫描程序检测可能出现内存泄露的代码段。然而检测工具难免有疏漏和不足,只能起到辅助作用。智能指针。这是 c++ 中
09
2020
04

Epoll原理.

开发高性能网络程序时,windows开发者们言必称Iocp,linux开发者们则言必称Epoll。大家都明白Epoll是一种IO多路复用技术,可以非常高效的处理数以百万计的Socket句柄,比起以前的Select和Poll效率提高了很多。先简单了解下如何使用C库封装的3个epoll系统调用。int epoll_create(int size);  int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event); &n
09
2020
04

什么是channel,为什么它可以做到线程安全?

Channel是Go中的一个核心类型,可以把它看成一个管道,通过它并发核心单元就可以发送或者接收数据进行通讯(communication),Channel也可以理解是一个先进先出的队列,通过管道进行通信。Golang的Channel,发送一个数据到Channel 和 从Channel接收一个数据 都是 原子性的。而且Go的设计思想就是:不要通过共享内存来通信,而是通过通信来共享内存,前者就是传统的加锁,后者就是Channel。也就是说,设计Channel的主要目的就是在多任务间传递数据的,这当然
09
2020
04

Data Race问题怎么解决?能不能不加锁解决这个问题?

同步访问共享数据是处理数据竞争的一种有效的方法.golang在1.1之后引入了竞争检测机制,可以使用 go run -race 或者 go build -race来进行静态检测。 其在内部的实现是,开启多个协程执行同一个命令, 并且记录下每个变量的状态.竞争检测器基于C/C++的ThreadSanitizer 运行时库,该库在Google内部代码基地和Chromium找到许多错误。这个技术在2012年九月集成到Go中,从那时开始,它已经在标准库中检测到42个竞争条件。现在,它已经是我们持续构建过
09
2020
04

Golang的内存模型,为什么小对象多了会造成gc压力。

通常小对象过多会导致GC三色法消耗过多的GPU。优化思路是,减少对象分配.
09
2020
04

互斥锁,读写锁,死锁问题是怎么解决。

互斥锁互斥锁就是互斥变量mutex,用来锁住临界区的.条件锁就是条件变量,当进程的某些资源要求不满足时就进入休眠,也就是锁住了。当资源被分配到了,条件锁打开,进程继续运行;读写锁,也类似,用于缓冲区等临界资源能互斥访问的。读写锁通常有些公共数据修改的机会很少,但其读的机会很多。并且在读的过程中会伴随着查找,给这种代码加锁会降低我们的程序效率。读写锁可以解决这个问题。注意:写独占,读共享,写锁优先级高死锁一般情况下,如果同一个线程先后两次调用lock,在第二次调用时,由于锁已经被占用,该线程会挂起
09
2020
04

协程,线程,进程的区别。

进程进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。每个进程都有自己的独立内存空间,不同进程通过进程间通信来通信。由于进程比较重量,占据独立的内存,所以上下文进程间的切换开销(栈、寄存器、虚拟内存、文件句柄等)比较大,但相对比较稳定安全。线程线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位.线程自己基本上不拥有系统资源,只拥有一点在运行中必不可少的资源(如程序计数器,一组寄存器和栈),但是它可与同属
09
2020
04

JSON 标准库对 nil slice 和 空 slice 的处理是一致的吗? 

首先JSON 标准库对 nil slice 和 空 slice 的处理是不一致.通常错误的用法,会报数组越界的错误,因为只是声明了slice,却没有给实例化的对象。var slice []intslice[1] = 0此时slice的值是nil,这种情况可以用于需要返回slice的函数,当函数出现异常的时候,保证函数依然会有nil的返回值。empty slice 是指slice不为nil,但是slice没有值,slice的底层的空间是空的,此时的定义如下:slice := make([]int,
09
2020
04

Golang 中常用的并发模型?

Golang 中常用的并发模型有三种:通过channel通知实现并发控制无缓冲的通道指的是通道的大小为0,也就是说,这种类型的通道在接收前没有能力保存任何值,它要求发送 goroutine 和接收 goroutine 同时准备好,才可以完成发送和接收操作。从上面无缓冲的通道定义来看,发送 goroutine 和接收 gouroutine 必须是同步的,同时准备后,如果没有同时准备好的话,先执行的操作就会阻塞等待,直到另一个相对应的操作准备好为止。这种无缓冲的通道我们也称之为同步通道。func m
09
2020
04

go语言的并发机制以及它所使用的CSP并发模型.

CSP模型是上个世纪七十年代提出的,不同于传统的多线程通过共享内存来通信,CSP讲究的是“以通信的方式来共享内存”。用于描述两个独立的并发实体通过共享的通讯 channel(管道)进行通信的并发模型。 CSP中channel是第一类对象,它不关注发送消息的实体,而关注与发送消息时使用的channel。Golang中channel 是被单独创建并且可以在进程之间传递,它的通信模式类似于 boss-worker 模式的,一个实体通过将消息发送到channel 中,然后又监听这个 channel 的实
09
2020
04

无缓冲 Chan 的发送和接收是否同步?

ch := make(chan int)    无缓冲的channel由于没有缓冲发送和接收需要同步.ch := make(chan int, 2) 有缓冲channel不要求发送和接收操作同步. channel无缓冲时,发送阻塞直到数据被接收,接收阻塞直到读到数据。channel有缓冲时,当缓冲满时发送阻塞,当缓冲空时接收阻塞。
09
2020
04

go 实现消息队列

使用切片加锁可以实现
09
2020
04

go set的实现

用map 的 key不重复, type Set struct { m map[类型]Empty } 
09
2020
04

函数体 多次 defer 或 go defer执行顺序

defer是golang的一个特色功能,被称为“延迟调用函数”。当外部函数返回后执行defer。  执行顺序 先进后出 (类似 栈)
09
2020
04

go struct能不能比较

因为是强类型语言,所以不同类型的结构不能作比较,但是同一类型的实例值是可以比较的,实例不可以比较,因为是指针类型
09
2020
04

goroutine的调度

 goroutine的本质是协程,是实现并行计算的核心。使用go关键字启动一个异步工作的协程,协程相对线程更加轻量化,协程运行在一个或多个线程上。各个协程之间的调度则有程序底层完成(线程和进程的操作是由程序触发系统接口,最后的执行者是系统)。协程拥有自己的寄存器上下文和栈,协程调度切换时 将寄存器和栈保存到其他地方,切换回来时再将寄存器上下文和栈恢复,这样 协程能保留上一次调用时的状态(即所有局部状态的一个特定组合)
08
2020
04

Golang中除了加Mutex锁以外还有哪些方式安全读写共享变量?

Golang中Goroutine 可以通过 Channel 进行安全读写共享变量。