- 博客(208)
- 资源 (46)
- 收藏
- 关注
原创 架构设计总结
1.常见的架构设计面试题总结 - 知乎2.一口气说出9种分布式ID生成方式,面试官有点懵了 - 知乎3.架构设计面试题 (史上最全、持续更新、吐血推荐)_架构师-尼恩的博客-CSDN博客_架构设计面试题...
2022-03-27 21:55:21
867
原创 Kafka消费组重平衡的流程
前面说过了重平衡,它的作用是让组内所有的消费者实例就消费哪些主题分区达成一致。重平衡需要借助KafkaBroker 端的 Coordinator 组件,在Coordinator 的帮助下完成整个消费者组的分区重分配。在给我们带来的便利和一些问题。这篇来分析一下重平衡的整个流程。1.触发条件大体的触发条件有下面三个1. 组成员数量发生变化。2. 订阅主题数量发生变化。3. 订阅主题的分区数发生变化。1 2 3上一篇文章也提到过这些。一般对于生产环境来说订阅主题数量发生变化和订阅分区..
2022-03-16 22:59:10
502
原创 图解Golang垃圾回收机制
Go1.3使用的是标记清除法,分下面四步进行进行STW(stop the worl即暂停程序业务逻辑),然后从main函数开始找到不可达的内存占用和可达的内存占用 开始标记,程序找出可达内存占用并做标记 标记结束清除未标记的内存占用 结束STW停止暂停,让程序继续运行,循环该过程直到main生命周期结束 一开始的做法是将垃圾清理结束时才停止STW,后来优化了方案将清理垃圾放到了STW之后,与程序运行同时进行,这样做减小了STW的时长。但是STW会暂停用户逻辑对程序的性能影响是非常大的.
2022-03-15 00:08:17
350
原创 Golang Sync.Pool浅析(有错漏,待更新)
sync pool使用来存放临时变量的一个缓冲区,但是这个缓冲区并不可靠,每次gc的时候,都会首先清除缓冲区,所以,假如一个slice仅仅存放在 Pool 中,而没有其他地方引用,则会被当成垃圾清理掉。概念A Pool is a set of temporary objects that may be individually saved and retrieved.Any item stored in the Pool may be removed automatically at any ti
2022-01-30 14:56:48
667
原创 Golang sync.Mutex源码分析
sync.Mutex是一个不可重入的排他锁。 这点和Java不同,golang里面的排它锁是不可重入的。当一个 goroutine 获得了这个锁的拥有权后, 其它请求锁的 goroutine 就会阻塞在 Lock 方法的调用上,直到锁被释放。数据结构与状态机 sync.Mutex由两个字段 state 和 sema 组成。其中 state 表示当前互斥锁的状态,而 sema 是用于控制锁状态的信号量。type Mutex struct { state int32 sem...
2022-01-30 00:07:00
778
原创 sync.map原理分析
一、疑惑开篇#有了map为什么还要搞个sync.map 呢?它们之间有什么区别?答:重要的一点是,map并发不是安全的。在Go 1.6之前, 内置的map类型是部分goroutine安全的,并发的读没有问题,并发的写可能有问题。自go 1.6之后, 并发地读写map会报错,这在一些知名的开源库中都存在这个问题,所以go 1.9之前的解决方案是额外绑定一个锁,封装成一个新的struct或者单独使用锁都可以。go version go1.13.9 windows/amd64测试一波#
2022-01-29 23:13:59
793
原创 深度解密Go语言之unsafe
目录指针类型 什么是 unsafe 为什么有 unsafe unsafe 实现原理 unsafe 如何使用 获取 slice 长度 获取 map 长度 map 源码中的应用 Offsetof 获取成员偏移量 string 和 slice 的相互转换 总结 参考资料指针类型在正式介绍 unsafe 包之前,需要着重介绍 Go 语言中的指针类型。我本科开始学编程的时候,第一门语言就是 C。之后又陆续学过 C++,Java,Python,这些语言都挺强大的,但是没了
2022-01-28 15:50:37
481
原创 golang中的reflect(反射)
一、概述在golang中,reflect是一个比较高级的话题,本文将尽可能简单而又清楚的介绍相关内容。本文将从如下几个方面进行阐述:- 什么是reflection ?- 如何检查一个变量var 并获得其真实类型- golang中的reflect包1.1 reflect.Type 和 reflect.Value1.2 reflect.Kind1.3 NumField() 和 Field()1.4 Int() 和 String()- 完整实例- 如何使用reflection二、什么
2022-01-26 16:32:19
4348
1
原创 深入理解Golang之context
context是Go并发编程中常用到一种编程模式。本文将从为什么需要context,深入了解context的实现原理,以了解如何使用context。前言这篇文章将介绍Golang并发编程中常用到一种编程模式:context。本文将从为什么需要context出发,深入了解context的实现原理,以及了解如何使用context。为什么需要context在并发程序中,由于超时、取消操作或者一些异常情况,往往需要进行抢占操作或者中断后续操作。熟悉channel的朋友应该都见过使用done chan
2021-11-14 01:46:58
726
原创 golang的defer机制详解
defer概述 defer用来声明一个延迟函数,把这个函数放入到一个栈上,当外部的包含方法return之前,返回参数到调用方法之前调用,也可以说是运行到最外层方法体时调用。我们经常用他来做一些资源的释放,比如关闭io操作。 defer是golang的一个特色功能,被称为“延迟调用函数”。当外部函数返回后执行defer。类似于其他语言的 try… catch … finally… 中的finally,当然差别还是明显的。在使用defer之前我们应该多了解defer的特性,这样才能避免使用上的...
2021-11-13 19:08:21
10627
1
原创 深入理解Golang Channel
Golang使用Groutine和channels实现了CSP(Communicating Sequential Processes)模型,channles在goroutine的通信和同步中承担着重要的角色。在GopherCon 2017中,Golang专家Kavya深入介绍了 Go Channels 的内部机制,以及运行时调度器和内存管理系统是如何支持Channel的,本文根据Kavya的ppt学习和分析一下go channels的原理,希望能够对以后正确高效使用golang的并发带来一些启发。以..
2021-10-25 20:20:34
207
原创 Golang 协程调度
一、线程模型N:1模型,N个用户空间线程在1个内核空间线程上运行。优势是上下文切换非常快但是无法利用多核系统的优点。 1:1模型,1个内核空间线程运行一个用户空间线程。这种充分利用了多核系统的优势但是上下文切换非常慢,因为每一次调度都会在用户态和内核态之间切换。(POSIX线程模型(pthread),Java) M:N模型, 每个用户线程对应多个内核空间线程,同时也可以一个内核空间线程对应多个用户空间线程。Go打算采用这种模型,使用任意个内核模型管理任意个goroutine。这样结合了以上两种模型的
2021-10-25 19:09:41
467
原创 Golang调度机制
首先golang中协程golang是用户线程与系统线程的对应关系是多对多,既能利用多核cpu资源,也能尽可能减少上下文切换成本,代价是go需要实现复杂的goroutine调度机制。N:1,所有用户线程对应1个系统线程,无法利用多核cpu;1:1,1个用户线程对应一个系统线程,上下文切换成本高。调度逻辑四个结构体M:Machine,操作系统线程。一个M被创建后会在P空闲队列中获取P进行绑定,未绑定则进入阻塞状态。P:Process,调度器的核心处理器。通常表示执行上下文,P用于绑定
2021-10-25 19:08:57
329
原创 图示Golang垃圾回收机制
垃圾回收概念程序创建对象等引用类型实体时会在虚拟内存中分配给它们一块内存空间,如果该内存空间不再被任何引用变量引用时就成为需要被回收的垃圾。操作系统会记录一个进程运行时的所占用的内存、CPU和寄存器等资源,当进程结束后便由操作系统能够自动回收资源。但是对于一个运行较长时间的程序,如果使用完内存资源后没有及时释放就会造成内存泄漏甚至系统错误。以不支持自动垃圾回收的C++为例:void foo(){ char *p = new char[128]; // 对指针的使用 delet..
2021-10-22 01:38:29
466
原创 图解Go语言内存分配
Go语言内置运行时(就是runtime),抛弃了传统的内存分配方式,改为自主管理。这样可以自主地实现更好的内存使用模式,比如内存池、预分配等等。这样,不会每次内存分配都需要进行系统调用。Golang运行时的内存分配算法主要源自 Google 为 C 语言开发的TCMalloc算法,全称Thread-Caching Malloc。核心思想就是把内存分为多级管理,从而降低锁的粒度。它将可用的堆内存采用二级分配的方式进行管理:每个线程都会自行维护一个独立的内存池,进行内存分配时优先从该内存池中分配,当内存..
2021-10-09 00:44:31
271
原创 一文详解微服务架构
一文详解微服务架构本文将介绍微服务架构和相关的组件,介绍他们是什么以及为什么要使用微服务架构和这些组件。本文侧重于简明地表达微服务架构的全局图景,因此不会涉及具体如何使用组件等细节。为了防止不提供原网址的转载,特在这里加上原文链接:https://www.cnblogs.com/skabyy/p/11396571.html要理解微服务,首先要先理解不是微服务的那些。通常跟微服务相对的是单体应用,即将所有功能都打包成在一个独立单元的应用程序。从单体应用到微服务并不是一蹴而就的,这是一个逐渐演变
2021-05-10 23:54:19
354
1
原创 Kafka体系架构详细分解
基本概念Kafka 体系架构Kafka 体系架构包括若干 Producer、若干 Broker、若干 Consumer,以及一个 ZooKeeper 集群。在 Kafka 中还有两个特别重要的概念—主题(Topic)与分区(Partition)。Kafka 中的消息以主题为单位进行归类,生产者负责将消息发送到特定的主题(发送到 Kafka 集群中的每一条消息都要指定一个主题),而消费者负责订阅主题并进行消费。主题是一个逻辑上的概念,它还可以细分为多个分区,一个分区只属于单个主题,很多
2021-05-09 14:09:50
239
原创 深入理解Kafka必知必会(3)
Kafka中的事务是怎么实现的?Kafka中的事务可以使应用程序将消费消息、生产消息、提交消费位移当作原子操作来处理,同时成功或失败,即使该生产或消费会跨多个分区。生产者必须提供唯一的transactionalId,启动后请求事务协调器获取一个PID,transactionalId与PID一一对应。每次发送数据给<Topic, Partition>前,需要先向事务协调器发送AddPartitionsToTxnRequest,事务协调器会将该<Transaction, Topic
2021-05-09 14:07:26
344
原创 深入理解Kafka必知必会(2)
Kafka目前有哪些内部topic,它们都有什么特征?各自的作用又是什么?__consumer_offsets:作用是保存 Kafka 消费者的位移信息__transaction_state:用来存储事务日志消息优先副本是什么?它有什么特殊的作用?所谓的优先副本是指在AR集合列表中的第一个副本。理想情况下,优先副本就是该分区的leader 副本,所以也可以称之为 preferred leader。Kafka 要确保所有主题的优先副本在 Kafka 集群中均匀分布,这样就保证了所有分区的 le
2021-05-09 14:05:59
303
原创 深入理解Kafka必知必会(1)
Kafka的用途有哪些?使用场景如何? 消息系统: Kafka 和传统的消息系统(也称作消息中间件)都具备系统解耦、冗余存储、流量削峰、缓冲、异步通信、扩展性、可恢复性等功能。与此同时,Kafka 还提供了大多数消息系统难以实现的消息顺序性保障及回溯消费的功能。 存储系统: Kafka 把消息持久化到磁盘,相比于其他基于内存存储的系统而言,有效地降低了数据丢失的风险。也正是得益于 Kafka 的消息持久化功能和多副本机制,我们可以把 Kafka 作为长期的数据存储系统来使用,只需要把对应的数
2021-05-09 14:04:10
193
原创 Mysql Explain 详解
Mysql Explain 详解一.语法explain < table_name >例如: explain select * from t3 where id=3952602;二.explain输出解释+----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+| id | select_type | table | type| possibl..
2021-04-03 22:00:25
103
原创 架构设计之防止或缓解雪崩效应
熔断当某个服务调用慢或者有大量超时现象(过载),系统停止后续针对该服务的调用而直接返回,直至情况好转才恢复调用。这通常是为防止造成整个系统故障而采取的一种保护措施,也称过载保护。很多时候刚开始,可能只是出现了局部小规模系统故障,但后来故障影响的范围越来越大,最终导致了全局性的后果。限流对某个服务调用设置最高QPS阈值,高于阈值的请求放弃调用直接返回。这种模式不能解决服务依赖的问题,只能解决系统整体资源分配问题,因为没有被限流的请求依然有可能造成雪崩效应。限流处理方案:限制最大并发数.
2021-02-22 22:11:50
211
2
原创 Nginx 原理和架构
Nginx 是一个免费的,开源的,高性能的 HTTP 服务器和反向代理,以及 IMAP / POP3 代理服务器。Nginx 以其高性能,稳定性,丰富的功能,简单的配置和低资源消耗而闻名。Nginx 的整体架构Nginx 里有一个 master 进程和多个 worker 进程。master 进程并不处理网络请求,主要负责调度工作进程:加载配置、启动工作进程及非停升级。worker 进程负责处理网络请求与响应。master进程主要用来管理worker进程,具体包括如下4个主要功能:接收来自
2021-02-02 12:36:54
113
原创 Redis缓存设计及常见问题
Redis缓存设计及常见问题 缓存能够有效地加速应用的读写速度,同时也可以降低后端负载,对日常应用的开发至关重要。下面会介绍缓存使用技巧和设计方案,包含如下内容:缓存的收益和成本分析、缓存更新策略的选择和使用场景、缓存粒度控制法、穿透问题优化、无底洞问题优化、雪崩问题优化、热点key重建优化。缓存的收益和成本分析 下图左侧为客户端直接调用存储层的架构,右侧为比较典型的缓存层+存储层架构。缓存加入后带来的收益和成本。收益:①加速读写:因为缓存通常都是全内存的,而存储层通常读写性能不
2021-01-16 16:12:43
162
原创 Redis面试题
1.Redis 是一个基于内存的高性能key-value数据库。2.Redis相比memcached有哪些优势:memcached所有的值均是简单的字符串,redis作为其替代者,支持更为丰富的数据类型 redis的速度比memcached快很多 redis可以持久化其数据3.Redis是单线程redis利用队列技术将并发访问变为串行访问,消除了传统数据库串行控制的开销4.Reids常用5种数据类型string,list,set,sorted set,hash6.Reids6种淘
2021-01-12 21:36:14
149
原创 正确地使用Redis的SETNX实现锁机制
setNX,是set if not exists 的缩写,也就是只有不存在的时候才设置, 设置成功时返回 1 , 设置失败时返回 0 。可以利用它来实现锁的效果,但是很多人在使用的过程中都有一些问题没有考虑到。例如某个查询数据库的接口因为请求量比较大所以加了缓存,并设定缓存过期后刷新。当并发量比较大并且缓存过期的瞬间,大量并发请求会直接查询数据库导致雪崩。如果使用锁机制来控制只有一个请求去更新缓存就能避免雪崩的问题。下面是很多人下意识想到的加锁方法 1 2 3 4
2021-01-12 00:04:43
517
原创 Redis的高并发和快速原因
1.redis是基于内存的,内存的读写速度非常快;2.redis是单线程的,省去了很多上下文切换线程的时间;3.redis使用多路复用技术,可以处理并发的连接。非阻塞IO 内部实现采用epoll,采用了epoll+自己实现的简单的事件框架。epoll中的读、写、关闭、连接都转化成了事件,然后利用epoll的多路复用特性,绝不在io上浪费一点时间。下面重点介绍单线程设计和IO多路复用核心设计快的原因。为什么Redis是单线程的1.官方答案因为Redis是基于内存的操作,CPU.
2021-01-02 17:39:20
178
1
原创 NSQ源码分析(五)——Channel
Channel相关的代码主要位于nsqd/channel.go, nsqd/nsqd.go中。Channel是消费者订阅特定Topic的一种抽象。对于发往Topic的消息,nsqd向该Topic下的所有Channel投递消息,而同一个Channel只投递一次,Channel下如果存在多个消费者,则随机选择一个消费者做投递。这种投递方式可以被用作消费者负载均衡。Channel会将消息进行排列,如果没有消费者读取消息,消息首先会在内存中排队,当量太大时就会被保存到磁盘中。一、Channel的创建和.
2020-11-30 21:48:58
2041
2
原创 NSQ源码分析(四)——inFlightPqueue和PriorityQueue优先级队列
在Channel结构体中用到了两种优先级队列pqueue.PriorityQueue和inFlightPqueue。deferredMessages map[MessageID]*pqueue.ItemdeferredPQ pqueue.PriorityQueuedeferredMutex sync.Mutex inFlightMessages map[MessageID]*MessageinFlightPQ inFlightPqueueinFlightMut
2020-11-30 21:17:25
246
原创 NSQ源码分析(三)——disQueue
disQueue是Topic以及Channel中的内存消息满了以后,消息存放的实现方法,diskQueue实现了文件系统支持的FIFO队列,disQueue也是BackendQueue接口的实现,diskQueue在文件读写给我们提供了很好的学习示例。BackendQueue接口// BackendQueue represents the behavior for the secondary message storage systemtype BackendQueue interface {
2020-11-24 21:55:43
146
原创 NSQ源码分析(二)—— Topic
Topic是NSQ非常重要的概念,本次主要讲述Topic的获取、新建、Topic中消息的轮询、Topic中消息的来源、Topic的删除和退出以及Topic的暂停和取消暂停topic的相关操作主要在nsq/nsqd/topic.go中首先看下Topic结构体type Topic struct {// 64bit atomic vars need to be first for proper alignment on 32bit platformsmessageCount uint64 /
2020-11-24 21:39:52
154
原创 nsq整体架构
一、介绍 NSQ是Go语言编写的,开源的分布式消息队列中间件,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模生成环境下应用的产品。它基于MIT开源协议发布,由bitly公司开源出来的一款简单易用的消息中间件。特点:1. NSQ提供了分布式的,去中心化,且没有单点故障的拓扑结构,稳定的消息传输发布保障,能够具有高容错和HA(高可用)特性。2....
2020-11-23 22:19:31
266
1
原创 实模式和保护模式区别及寻址方式
4KB-4GB-64TB? 我记得大学的汇编课程、组成原理课里老师讲过实模式和保护模式的区别,在很多书本上也有谈及,无奈本人理解和感悟能力实在太差,在很长一段时间里都没真正的明白它们的内含,更别说为什么实模式下最大寻址空间为1MB?段的最大长度不超过64KB?而保护模式下为啥最大寻址能力就变成了64TB?每个段最大也达4GB?更甚者分段和分页这两个高深的概念像我这种菜鸟怎么也理解不了啊...
2019-03-19 22:47:54
214
转载 存储过程和函数具体的区别:
本质上没区别。只是函数有如:只能返回一个变量的限制。而存储过程可以返回多个。而函数是可以嵌入在sql中使用的,可以在select中调用,而存储过程不行。执行的本质都一样。 函数限制比较多,比如不能用临时表,只能用表变量.还有一些函数都不可用等等.而存储过程的限制相对就比较少 1. 一般来说,存储过程实现的功能要复杂一点,而函数的实现的功能针对性比较强。 2...
2019-01-02 22:01:17
1258
1
转载 Apache和Nginx的区别
Nginx 轻量级,采用 C 进行编写,同样的 web 服务,会占用更少的内存及资源 抗并发,nginx 以 epoll and kqueue 作为开发模型,处理请求是异步非阻塞的,负载能力比 apache 高很多,而 apache 则是阻塞型的。在高并发下 nginx 能保持低资源低消耗高性能 ,而 apache 在 PHP 处理慢或者前端压力很大的情况下,很容易出现进程数...
2018-12-18 21:07:39
193
转载 Linux 进程通信(共享内存区)
共享内存是由内核出于在多个进程间交换信息的目的而留出的一块内存区(段)。如果段的权限设置恰当,每个要访问该段内存的进程都可以把它映像到自己的私有地址空间中。如果一个进程更新了段中的数据,其他进程也立即会看到更新。由一个进程创建的段,也可以由另一个进程读写。每个进程都把它自己对共享内存的映像放入自己的地址空间。创建共享内存区int shmget(key_t key,size_t...
2018-07-26 23:28:39
182
转载 C++ 单例模式的几种实现研究
都是从网上学得,整理下自己的理解。 单例模式有两种实现模式:1)懒汉模式: 就是说当你第一次使用时才创建一个唯一的实例对象,从而实现延迟加载的效果。2)饿汉模式: 就是说不管你将来用不用,程序启动时就创建一个唯一的实例对象。 所以,从实现手法上看, 懒汉模式是在第一次使用单例对象时才完成初始化工作。因为此时可能存在多线程竞态环境,如不加锁限制会导致重复构造或构造不完全问...
2018-07-25 20:26:11
408
转载 linux内核中异步通知机制--信号处理机制
http://blog.csdn.net/yusiguyuan/article/details/23168363 什么是异步通知:很简单,一旦设备准备好,就主动通知应用程序,这种情况下应用程序就不需要查询设备状态, 特像硬件上常提的“中断的概念”。 比较准确的说法其实应该叫做“信号驱动的异步I/O”,信号是在软件层次上对中断机制的一种模拟。阻塞I/O意味着一直等待设备可访问再访问,非阻塞I/O意...
2018-07-11 14:23:01
379
转载 socket在什么情况下可读可写
一、 下列四个条件中的任何一个满足时,socket准备好读: 1.socket接收缓冲区中已经接收的数据的字节数大于等于socket接收缓冲区低潮限度的当前值;对这样的socket的读操作不会阻塞,并返回一个大于0的值(即:准备好读入的数据的字节数).我们可以用socket选项SO_RCVLOWAT来设置此低潮限度,对于TCP和UDPsocket,其缺省值为1; 2.连接的读这一半关闭(即:接...
2018-07-09 13:52:36
2635
《TCP IP详解》全三卷 中文有书签 不分割
2014-07-07
提高C++性能的编程技术.pdf
2014-04-09
改变未来的九大算法,完整扫描版
2014-04-08
JavaScript、Css2.0、Css3.0、Jquery、html5等各种中文手册打包放送
2014-04-04
项目管理七杯茶,完整扫描版
2014-04-03
W3School离线手册(2014.3.24)
2014-04-03
DELPHI XE5 UP2 破解
2014-04-03
Google官方下拉刷新组件SwipeRefreshLayout
2014-04-03
软件管理沉思录:SEI的项目管理、人际沟通和团队协作要诀,完整扫描版
2014-04-03
控制台小游戏之《推箱子》及关卡地图编辑器
2014-04-03
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人