摘要:
本文是effective go的摘要笔记,主要包括go语言一些习惯用法和要点。 阅读全文
摘要:
本文包含作者工作中常用到的一些命令,用于诊断网络、磁盘占满、fd泄漏等问题。命令包括ping、fping、tcpdump、lsof、netstat、/proc/$pid/fd、du、grep、traceroute、dig。 阅读全文
摘要:
本文详细介绍了curl命令基础和高级用法,包括跳过https的证书验证,详细追踪整个交互过程,可用于调用网络后端接口,诊断http和https网络服务故障。 阅读全文
摘要:
linux常用进程通信方式包括管道(pipe)、有名管道(FIFO)、信号(signal)、消息队列、共享内存、信号量、套接字(socket)。管道用于具有亲缘关系的进程间通信,有名管道的每个管道具有名字,使没有亲缘关系的进程间也可以通信。信号是比较复杂的通信方式,用于通知接受进程有某种事件发生,除了用于进程间通信外,进程还可以发送信号给进程本身。消息队列是消息的链接表,消息队列克服了信号承载信息量少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。共享内存使得多个进程可以访问同一块内存空间,是最快的可用IPC形式,针对其他通信机制运行效率较低而设计的。往往与其它通信机制,如信号量结合使用,来达到进程间的同步及互斥。信号量(semaphore)主要作为进程间以及同一进程不同线程之间的同步手段。套接口(Socket)更为一般的进程间通信机制,可用于不同机器之间的进程间通信。 阅读全文
摘要:
zookeeper作为分布式协调组件,在开源社区有着广泛应用,比如作为dubbo的注册中心,本文详细介绍zookeeper集群搭建和zookeeper的基本概念、数据模型,并研究zookeeper的常用场景,给出实现代码,包括分布式锁、分布式队列及leader选举等。 阅读全文
摘要:
网络IO模型包括阻塞、非阻塞、IO复用、信号驱动IO和异步IO五种类型。阻塞IO无法应对多个连接的情形,单个socket操作阻塞会导致服务端无法接受其他连接,虽然可以用多线程、多进程的方式,将不同的连接放在不同的线程中和客户端交互,并利用线程池和连接池进行优化。但创建进程和线程会占用系统资源,当面对大规模连接时,系统资源浪费严重,系统响应效率不高。
非阻塞模型当socket读写操作未就绪时会立即返回,而不会阻塞等待,可以利用轮询的方式来进行读写操作,但当内核收到数据报到应用进程感知并处理会有时延。
利用IO复用,将监控socket读写操作是否就绪和进行读写操作分开,且IO复用可监控socket集合,IO复用包含select、poll、epoll三种模型。
select模型存在如下三种缺点:
1) 每次都需要将fd_set拷贝到内核空间,当fd_set较大时开销很大
2) 每次都需要在内核中遍历fd加入到等待队列,fd较多开销较大
3) select支持的文件描述符太小,默认为1024。
poll模型可同时监控的socket没有上线限制,取决于系统资源, 阅读全文
摘要:
spark学习笔记,主要包括spark core的内容RDD弹性分布式数据集和广播变量及累计器.Spark Sql的内容Sql、Dataset和DataFeame. 阅读全文
摘要:
cap理论是分布式系统的基础理论,任何一个分布式系统不可能同时满足强一致性、可用性和分区容错性,而只能在三者之间权衡。为了提高系统的写入性能,一般系统只需满足最终一致性,最终一致性有几下几种常见变种:因果一致性、读已之所写、会话一致性、单调读一致性和单调写一致性。cap理论演化出Base理论,是工业界对分布式系统实践的总结,其核心思想是即使无法达到强一致性,也要保证满足最终一致性。 阅读全文
摘要:
大部分人在用开源软件的时候,并不知道一个优秀的开源软件内部是如何启动起来的,本文通过分析redis启动过程的源码,来学习优秀软件的启动过程 阅读全文
摘要:
Redis常用数据类型有字符串String、字典disct、列表List、集合Set、有序集合SortedSet,List常用于获取最新topN条新闻等类似问题和生产者消费者模式,集合set可以求对象的共同标签,而有序集合SortedSet用于游戏中的分数排名,SortedSet底层采用压缩列表ziplist及跳表skiplist实现,本文会对ziplist和skiplist的概念及优点进行详细介绍,并通过剖析redis源码来深入理解。 阅读全文
摘要:
Linux性能观测工具按类别可分为系统级别和进程级别,系统级别对整个系统的性能做统计,而进程级别则具体到进程,为每个进程维护统计信息。
按实现原理分,可分为基于计数器和跟踪以及剖析。含义如下:
计数器:内核维护的统计数据,通常为无符号整型,用于对发生的事件计数,比如,网络包接收计数器,磁盘IO计数器等。
跟踪:跟踪会收集每一个事件的具体数据,由于跟踪捕获事件数据需要消耗CPU且需要较大的存储空间储存收集数据,默认不开启。日志就是一种低频率的跟踪,会记录事件数据。
剖析:对目标采样或快照来归纳目标特征,如:CPU使用率,通过对程序计数器采样(一种寄存器,用于指示下一条指令的地址),跟踪栈找到消耗CPU周期的代码路径。剖析也可以通过非计时的硬件事件,如CPU硬件缓存未命中或总线活动,这类信息可以帮助开发人员针对系统资源的使用来优化自己的代码。
本文会对基于计数器原理的系统级linux性能工具做介绍,详细说明其用法及数据来源,后续会对进程级及基于其它原理的工具做介绍。 阅读全文
摘要:
迭代器模式及其在python中的实现 阅读全文
摘要:
当进行网络请求失败时,需要进行重试,而最好的重试逻辑应该与业务逻辑分离,实现代码的无侵入,本文给出python第三方库重试库retrying的用法,并深入分析retrying的源码,来领略其思想。 阅读全文
摘要:
python实践中经常出现编码相关的异常,大多网上找资料而没有理解原理,导致一次次重复错误。本文对常用Unicode、UTF-8、GB2312编码的原理进行介绍,接着介绍了python字符类型unicode和str以及常见编解码错误UnicodeEncodeError和UnicodeDEcodeError,并详细说明了出现这类异常的原因,从而达到庖丁解牛的效果。 阅读全文
摘要:
Go 出于通用性的考量,提供了反射这一功能。借助反射功能,我们可以实现通用性更强的函数,传入任意的参数,在函数内通过反射动态调用参数对象的方法并访问它的属性。本文将深入探讨Golang反射包reflect的功能和原理。同时,我们学习某种东西,一方面是为了实践运用,另一方面则是出于功利性面试的目的。所以,本文还会为大家介绍反射的典型应用以及高频面试题。 阅读全文
摘要:
Go语言为了方便使用者,提供了简单、安全的协程数据同步和通信机制,channel。那我们知道channel底层是如何实现的吗?今天k哥就来聊聊channel的底层实现原理。同时,为了验证我们是否掌握了channel的实现原理,本文也收集了channel的高频面试题,理解了原理,面试题自然不在话下。 阅读全文
摘要:
本文将深入探讨Golang中unsafe包的功能和原理。同时,我们学习某种东西,一方面是为了实践运用,另一方面则是出于功利性面试的目的。所以,本文还会为大家介绍unsafe 包的典型应用以及高频面试题。 阅读全文
摘要:
你是否在职场打拼多年,却始终原地踏步,为升职无望而焦虑?你是否在风云变幻的环境中,整日提心吊胆,不知道何时会被裁员?你是否正步入 35+的行列,面临年龄危机,心生恐惧?如果你正被这些问题所困扰,又苦无对策,那么不妨尝试写作吧。 阅读全文
摘要:
在程序员的日常工作中,关于技术重要性的争论从未停歇。有的人觉得技术不重要,认为技术只是工具和手段;而另一些人则坚信技术的重要性,认为它是推动项目成功和个人职业发展的关键。在这样的争论中,笔者尝试着去探讨出现这两种论调的原因,并提出自己的观点。 阅读全文
摘要:
刚做开发时,觉得自己要好好学习技术,对业务不上心,公司让我做什么就用自认为极其优雅的编码方式解决,但对为什么要做这个事,做了对业务有什么影响,做完了有没有达到业务目标,并没有很关心。后续观察了身边的一些同学,整体上业务与技术链接比较好的同学职场上更容易脱颖而出,也促使我最近一直在思考到底什么是业务,怎么样才算较为全面的了解了业务,在此记录下来,希望能给对业务理解存在一些问题的同学带来少许启发。 阅读全文
摘要:
身在职场的你,是否遇到下面的学习困境:
年复一年,工作原地踏步,不知道该学什么进一步突破自己。
日复一日,这也学,那也学,仿佛知识没有尽头,学得身心俱疲。
你可能以为是自己太懒,不够努力,其实并不是,出现这种困境的原因是你没有构建个人知识体系。 阅读全文
摘要:
在工作中,我们经常会遇到以下问题:
* 在周报/总结中,罗列了一大堆做的事情,别人也看不出来你做得怎么样,有没有风险。
* 在向TL汇报工作进展时,TL常常听不出你想要阐释的重点,你的汇报进程总是被打断或者被提出很多挑战。
* 做技术分享写作时,写着写着连自己都不清楚在写什么。
你可能以为是自己表达能力不够好,其实并不是,原因是你没有掌握表达的底层逻辑---结构化表达。而表达的有效结构是---金字塔结构。 阅读全文
摘要:
你是否在解决问题时,常常觉得脑子很乱,很多零散的信息迸发出来,但就是无法形成解决方案。
之所以这样,原因就在于,我们的大脑处理不了太多零散而复杂的信息。人类大脑在处理信息的时候,有两个规律:第一,不能一次太多,太多信息会让我们的大脑觉得负荷过大;第二,喜欢有规律的信息。
如果我们在解决问题时,能够找到一个结构,将所有的碎片信息放进去,就能够大大减轻大脑的负担,更容易地解决问题。而这,就是所谓的“结构化思维”。 阅读全文