- 博客(5)
- 收藏
- 关注
原创 分布式链路追踪(OpenTracing标准)和 Jaeger 实现
OpenTracing 简介OpenTracing 是一个中立的(厂商无关、平台无关)分布式追踪的 API 规范,提供了统一接口方便开发者在自己的服务中集成一种或者多种分布式追踪的实现。OpenTracing 诞生的背景开发和工程团队因为系统组件水平扩展、开发团队小型化、敏捷开发、CD(持续集成)、解耦等各种需求,开始使用微服务的架构取代以前好的单机系统。 也就是说,当一个生产系统面对真正的高并发,或者解耦成大量微服务时,以前很容易实现的重点任务变得困难了。过程中需要面临一系列问题:用户体验优化、后台
2021-03-29 22:43:44
2141
原创 Go 中 map 实现原理与源码解析
全文四万多字,包含了对 map 的相关原理还有源码的深度解析,文中的图片大都来自文末的参考文章,如果有哪个地方写的不对,欢迎批评指正!!!Go 中的 map 使用的是链地址法解决哈希冲突,但是它的实现并不是对冲突的元素采用链表存储,而是采用了数组的形式。哈希表相关概念哈希表是计算机科学中的最重要数据结构之一,这不仅因为它 O(1) 的读写性能非常优秀,还因为它提供了键值之间的映射。想要实现一个性能优异的哈希表,需要注意两个关键点 —— 哈希函数和冲突解决方法。哈希函数哈希函数(常被称为散列函数.
2020-12-31 14:11:44
1775
3
原创 Go 内存管理与垃圾回收
Go 语言抛弃了 C/C++ 中的开发者管理内存的方式:主动申请与主动释放,增加了逃逸分析和 GC,这样开发者就能从内存管理中释放出来,有更多的精力去关注软件设计,而不是底层的内存问题。这是 Go 语言成为高生产力语言的原因之一。从非常宏观的角度讲,Go的内存管理是下图这个样子:程序中的数据和变量都会被分配到程序所在的虚拟内存中,内存空间包含两个重要区域 — 栈区(Stack)和堆区(Heap)。函数调用的参数、返回值以及局部变量大都会被分配到栈上,这部分内存会由编译器进行管理;不同编程语言使用不同
2020-12-22 00:51:45
1695
2
原创 goroutine 调度器原理详解
goroutine 调度器的概念说到“调度”,首先会想到操作系统对进程、线程的调度。操作系统调度器会将系统中的多个线程按照一定算法调度到物理 CPU 上去运行。传统的编程语言比如 C、C++ 等的并发实现实际上就是基于操作系统调度的,即程序负责创建线程,操作系统负责调度。尽管线程的调度方式相对于进程来说,线程运行所需要资源比较少,在同一进程中进行线程切换效率会高很多,但实际上多线程开发设计会变得更加复杂,要考虑很多同步竞争等问题,如锁、竞争冲突等。线程是操作系统调度时的最基本单元,而 Linux 在
2020-12-08 00:36:09
2217
原创 Elasticsearch 倒排索引原理
Elasticsearch 倒排索引原理倒排索引也是索引的一种。索引,本质上就是为了快速检索我们存储的数据。每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。对于 MySQL 来说,使用 B+ tree 索引是为了优化已有数据的存储结构,对于不需要快速更新的时候,采用预先排序等方式换取更小的存储空间,更快的检索速度,但同时,由于每次更新都需要对 B+ 树进行调整,导致更新比较慢。Elasticsea
2020-12-03 00:25:31
2252
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人