• 博客(28)
  • 收藏
  • 关注

原创 如何系统性地学习分布式系统

本文的缘起是回答知乎圆桌会议「分布式系统之美」的问题「如何系统性地学习分布式系统?」,后面稍微整理了一下,形成了这一篇文章(知乎 ID:kylin)。前言学习一个知识之前,我觉得比较好的方式是先理解它的来龙去脉:即这个知识产生的过程,它解决了什么问题,它是怎么样解决的,还有它引入了哪些新的问题(没有银弹),这样我们才能比较好的抓到它的脉络和关键点,不会一开始就迷失在细节中。所以,在学习分布式系统之前,我们需要解决的第一个问题是:分布式系统解决了什么问题?分布式系统解决了什么问题?第一.

2020-09-13 12:41:19 1269 1

原创 职业发展的迷茫与困境:你真的了解职级体系吗?

引言各大知名互联网公司都自己的职级体系,现在越来多的公司开始意识到建设职级体系是一件重要的事情,那么作为一家公司我们应该怎样建设自己的职级体系?是直接在网络上找 Google、Facebook、百度或者阿里的职级体系,稍微修改一下变成公司的职级体系,还是根据公司的情况重新设计一份职级体系?我觉得这个问题的答案不在问题本身,需要要深入这个问题的本质去寻找答案,那就是职级体系是干什么的,它能给公司带来什么价值?如果能回答这个问题,那我们对怎么建设自己公司的职级体系将不再有疑惑了。下面我们通过伴鱼对职

2020-08-03 14:57:34 701 1

原创 我们为什么放弃 MongoDB 和 MySQL,选择 TiDB

写在前面的话技术选型是由技术方向和业务场景 trade-off 决定的,脱离业务场景来说技术选型是没有任何意义的,所以本文只是阐述了伴鱼技术团队数据库选型的过程,这并不是 MySQL、MongoDB 和 TiDB 之间直接的比较,只能说明 TiDB 更适合伴鱼的业务场景和技术规划,另外由于 TiDB 是非常新的数据库技术,所以这也能体现出伴鱼技术团队对新技术的态度、技术后发优势的理解、成本与效率的衡权和技术生态与红利的思考。为什么放弃 MongoDB伴鱼是 2015 年成立的,那个时候 NoSQ

2020-07-28 10:41:36 2682 1

原创 源自 Google 的招聘哲学:你真的了解招聘吗?

引言随着科技的快速发展,企业之间的竞争已经变成人才的竞争,因而各大公司都将招聘工作视为最重要的工作之一,但是大家对于招聘本身的研究却不够,有的公司或许有一些招聘标准,然而从招聘理论和方法论的层面去研究招聘的却不多见,很多面试官也是按自己的直觉来评价候选人,这样客观性和公正性就很难保证,如果招聘到不合适的候选人,对候选人和公司都是一个双输的局面。本文从与候选人沟通的氛围开始,到客观评价人才的方法和岗位胜任力与能力的关系,层次递进地分享伴鱼对招聘的研究与理解。我们认为科学评价人才是招聘过程中对人才最大的

2020-06-25 11:45:52 667

原创 开源手册

一、我们为什么要开源1、我们享受了开源软件巨大的福利在今天,几乎不可能找到一家没有从开源社区中以某种方式获益过的公司。在伴鱼的发展过程中,我们更是深刻感受到如果没有开源软件的帮助,一个初创公司几乎是没有成功的可能,只有站在linux,tidb,mysql,mongodb,kafka,etcd,nginx,es等伟大的开源软件的肩膀上,我们才能快速搭建好系统,快速向用户提供服务并且快速验证我们的想法,不然这一切将是无法想象的。站在互联网行业来看,我们更会发现如果没有开源软件,创业成本和创业周期都将大幅提

2020-05-27 12:39:47 571

原创 招聘手册

一、愉快交流1、候选人和面试官是平等的关系通常我们会认为面试官是强势的一方,可以决定候选人能否通过面试,但是如果我们跳出面试环节,站在整个招聘流程的角度来看的话,那就未必了,候选人可以在投递简历、面试邀约和接受offer等环节决定是否选择我们,只是这一部分的压力完全被HR承担了,面试官没有感觉到而已。特别地,伴鱼的人才策略是打造面向未来的精英团队,越优秀的候选人可供选择的机会越多,导致这个情况会更加被放大。因此,面试官一定要站在整个招聘流程的角度来对待面试环节,平等地对待每一个候选人,给予候选人足够的尊

2020-05-27 11:46:21 702

原创 WebP插件修改

一、背景介绍目前公司的Android项目都使用了WebP插件进行图片的优化。该插件主要是在线上打包系统进行build时才会进行的一个图片优化的动作。通过将PNG图片转换成webp格式减少包体积大小。目前最新的插件版本是1.0.4二、当前WebP插件的实现插件的实现机制比较简单,主要是通过三个Gradle Task来完成:DownloadLibTask从https://storage.googleapis.com/downloads.webmproject.org/releases/webp/下载

2020-05-27 09:49:25 914

翻译 Time, Clocks, and the Ordering of Events in a Distributed System (1978)

简介本文是分布式系统理论的开山鼻祖、2013 年图灵奖获得者 Lamport 的成名作,也是分布式计算领域杰出论文最佳影响力奖 Dijkstra Prize 的第一篇论文,高达 11692 的引用量(截至 2019/12/08)足以证明其广泛的影响力:本文主要讨论 3 个话题:分布式系统中的事件偏序利用逻辑时钟实现事件偏序利用逻辑时钟实现事件全序事件顺序生活中的事件顺序生活中,当两个事件 A 和 B 发生时,我们可以利用其发生的时刻来确定它们的先后关系,如:A:2019-1...

2020-05-27 09:45:15 388

原创 TIDB在伴鱼的实践

一、背景介绍伴鱼少儿英语是目前飞速成长的互联网在线英语教育品牌之一,旗下包括伴鱼绘本、伴鱼少儿英语、伴鱼自然拼读和伴鱼精读课等系列产品。伴鱼使用的数据库种类有Tidb,MongoDB,MySQL,Codis。在伴鱼,目前生产环境共有11套Tidb集群,服务于在线教学、绘本、消息、交易和少儿等众多核心业务。目前线上Tidb部署版本统一为2.1.15。Tidb server和PD混部,机器配置:64C64G500G SAS;Tikv单独部署,机器配置:64C64G1.5T NVME下面从伴鱼为何选择T

2020-05-27 09:41:24 1159

原创 The Evolution of Prometheus Storage Layer

Prometheus 是当下最流行的监控平台之一,它的主要职责是从各个目标节点中采集监控数据,后持久化到本地的时序数据库中,并向外部提供便捷的查询接口。本文尝试探讨 Prometheus 存储层的演进过程,信息源主要来自于 Prometheus 团队在历届 PromConf 上的分享。时序数据库是 Promtheus 监控平台的一部分,在了解其存储层的演化过程之前,我们需要先了解时序数据库及其要解决的根本问题。TSDB时序数据库 (Time Series Database, TSDB) 是数据库大家庭

2020-05-27 09:39:48 503

原创 报警平台的匹配器演进

简介本文介绍伴鱼内部服务报警平台中匹配器模块的演进,及其利用 Lex 和 Yacc 同类工具构建 DSL 编译器的过程。背景报警平台是伴鱼内部各端、应用、基础设施等服务异常状态信息的集散中心。整体流程如下图所示:信息源将信息投递给报警平台,后者将这些信息最终通过邮件、即时消息、电话呼叫的形式路由给理应关心它的人。总体而言,路由的需求可以分为以下几种:路由给服务的负责人及其团队路由给服务依赖方人员及其团队路由给所有值班人员所在的即时消息群为了满足这样的需求,报警平台采用树状结构组织路由

2020-05-27 09:28:50 489

原创 永远招聘

一、 只招聘成年人1、 成年人是指职业素养成熟的人职业素养成熟的人,会遵守基本的规章制度,严格履行自己的承诺,是对自己有高要求的人。如果对于某些规章制度觉得不太合理,欢迎提出挑战,一起去推动规章制度的优化,在规章制度未修改之前,我们依然需要遵守它;我们对他人的承诺,一定要严格履行,如果因为种种原因确实无法完成,那么应该提前沟通,让对方了解不能完成的原因,并且争取对方的理解,做到凡事有交代,件件有着落,事事有回音;对自己有高要求,是自我成长的原始动力,我们只有事事提高要求,才能得到完美的结果,自己才能不断

2020-05-27 09:24:08 683

原创 如何在React中组织代码以复用逻辑

我们知道组件和自顶向下的单向数据流帮我们将大型 UI 组织成小的、独立的、可复用的部分。然而,由于逻辑是有状态的,不能提取到函数或其他组件,我们通常无法进一步分解复杂组件。这些情况非常常见,包括动画、表单处理、异步请求数据等,以及我们希望从组件中完成的许多其他事情。 当我们试图单独使用组件来解决这些用例时,我们通常会得到:难以重构和测试的大型组件(我们已经制造了很多这种组件)不同组件和生命周期方法之间的重复逻辑(各种场景都很常见)发明了很多复杂的模式,比如 Mixins、 Render porp

2020-05-27 09:23:25 725

原创 Jetpack 中 MVVM 架构实战分析

一、背景介绍UI程序模块内部代码架构一直都是围绕着数据(Model)、逻辑(Logic)、视图(View)的分层和解耦不断发展进化。从最初的MVC到MVP,再到现在本文要讲的MVVM架构,三层结构没有发生根本变化,不同的是各层之间的交互方式及其产生的解耦程度的变化。本文所讲主要内容是Google在Jetpack中提供的MVVM架构方案。MVVM的基础架构图- View层负责UI展示和UI逻辑,不直接持有和操作数据。业务逻辑在ViewModel层实现,View层持有ViewModel对象,V

2020-05-26 22:27:46 2460

原创 O(1) 复杂度的 LFU 实现

本文源自 2010 年的一篇论文 An O(1) algorithm for implementing the LFU cache eviction scheme简介缓存置换算法 (Cache Eviction Algorithm) 在操作系统、数据库以及其它系统中被广泛用于缓存置换模块,当缓存空间不足时,它利用局部性原理 (Principle of Locality) 预测未来数据的使用模式,将最不可能被访问的数据清出从而提高缓存命中率。目前已经存在的缓存置换算法包括 MRU (Most Rece..

2020-05-26 20:53:21 761

原创 音标字母对齐算法

背景介绍在发音评测中,如果一个单词中某个音素读错了,比如apple[ˈæpl]中的p读错了,我们怎么反馈给用户,一般是在其对应的字母里标红如apple,这就引出了一个问题已知一个单词和它对应的音标,如何得到每个音标对应的字母。如apple[ˈæpl] 中a:æ pp:p l:l e不发音算法介绍算法路线深度搜索多序列对齐问题深度搜索深度搜索思路:找到48个元音和辅音对应的常用的字母组合,将音标依次按常用的字母组合展开,当完全展开成单词或者剩余为e的情况停止算法示例...

2020-05-26 20:50:19 1007

原创 kubernetes容器网络

在kubernetes中要保证容器之间网络互通,网络至关重要。而kubernetes本身并没有自己实现容器网络,而是通过插件化的方式自由接入进来。在容器网络接入进来需要满足如下基本原则:pod无论运行在任何节点都可以互相直接通信,而不需要借助NAT地址转换实现。node与pod可以互相通信,在不限制的前提下,pod可以访问任意网络。pod拥有独立的网络栈,pod看到自己的地址和外部看见的地址应该是一样的,并且同个pod内所有的容器共享同个网络栈。容器网络基础一个Linux容器的网络栈是被隔离在

2020-05-26 20:45:56 782

原创 数据库隔离级别剖析

前言在线应用业务中,数据库是一个非常重要的组成部分,特别是现在的微服务架构为了获得水平扩展能力,我们倾向于将状态都存储在数据库中,这要求数据库能够正确、高性能处理请求,但这是一个几乎不可能达到的要求,所以数据库的设计者们定义了隔离级别这一个概念,在高性能与正确性之间提供了一个缓冲地带,明确地告诉使用者,我们提供正确性差一点但是性能好一点的模式和正确性好一点但是性能差一点的模式,使用者可以按照你们的业务场景来选择使用。本质从本质上讲,隔离级别是定义数据库并发控制的。在应用程序的开发中,我们通常利用锁进行

2020-05-26 20:37:58 391

原创 golang context的一些思考

前言因为goroutine,go的并发非常方便,但是这也带来了另外一个问题,当我们进行一个耗时的异步操作时,如何在约定的时间内终止该操作并返回一个自定义的结果?这也是大家常说的我们如何去终止一个goroutine(因为goroutine不同于os线程,没有主动interrupt机制),这里就轮到今天的主角context登场了。context源于google,于1.7版本加入标准库,按照官方文档的说法,它是一个请求的全局上下文,携带了截止时间、手动取消等信号,并包含一个并发安全的map用于携带数据。con

2020-05-26 20:34:44 1108

原创 绝对坦诚

一、当面沟通,高节奏沟通1、选择最高效的沟通方式口头沟通短期效率高但是长期效率低,文字沟通则正好相反。对于规范、流程等长期价值高的知识和经验,鼓励大家通过文档等文字沟通的形式来进行,而对于日常临时、突然等长期价值低的问题,鼓励大家通过当面口头沟通的形式,高效率沟通。日常的工作内容,口头沟通的效率是高于通过钉钉和微信等软件沟通的,直接找到负责人的横向沟通的效率是高于向上汇报的纵向沟通的。非常推荐大家碰到临时、突发并且预计几分钟可以解决的问题时,找到事情的直接负责人,当面进行一个临时的站立会议,快速通过口

2020-05-26 20:33:33 662

翻译 Scaling Memcache at Facebook (2013)

本文介绍 FB 基于 memcached 构建统一缓存层的最佳实践。全文递进式地讲述 单集群 (Single Front-end Cluster)、多集群 (Multiple Front-end Clusters)、多区域 (Multiple Regions) 环境下遇到的问题和相应的解决方案。尽管整个解决方案以 memcached 为基本单元,但我们可以任意地将 memcached 替换成 redis、boltDB、levelDB 等其它服务作为缓存单元。在下文中,需要注意两个词语的区别:memca

2020-05-26 20:30:50 1551

原创 Distributed Locking

提到分布式锁,很多人也许会脱口而出 “redis”,可见利用 redis 实现分布式锁已被认为是最佳实践。这两天有个同事问我一个问题:“如果某个服务拿着分布式锁的时候,redis 实例挂了怎么办?重启以后锁丢了怎么办?利用主从可以吗?加 fsync 可以吗?”因此我决定深究这个话题。备注:本文中,因为信息源使用的术语不同,Correctness 与 Safety 分别翻译成正确性和安全性,实际上二者在分布式锁话题的范畴中意思相同。Efficiency & Correctness如果想让单机/

2020-05-26 20:08:13 564

翻译 Dapper, a Large-Scale Distributed Systems Tracing Infrastructure (2010)

早在 2008 年,Google 就已开始分布式调用链追踪的工作,经过两年的打磨后,Dapper 系统问世,并通过这篇文章将其设计公之于众。遗憾的是,Dapper 并不是开源项目,但它的设计理念依然深刻影响到后来的 Jaeger、Zipkin 等开源分布式追踪项目,以及相关的标准 Opentracing、OpenTelemetry。本文不是原文的精准翻译,而是一次重述和简述,旨在记录分布式调用链追踪要解决的核心问题和潜在解决方案。Why & Design Goals云原生环境中,一次请求的处理

2020-05-26 19:56:19 736

原创 缓存与存储的一致性策略:从 CPU 到分布式系统

在计算机系统设计实践中,我们常常会遇到下图所示架构:为了解决单个存储器读吞吐无法满足要求的问题,常常需要在存储器上面增加一个或多个缓存。但由于相同的数据被复制到一个或多个地方,就容易引发数据一致性问题。不一致的数据可能出现在同级 Cache 之间 (Cache Coherence) 和上下级 Cache 之间。解决这些数据一致性问题的方案可以统称为 Cache Policies。从本质上看,所有 Cache Policies 的设计目的都可以概括为:在增加一级缓存之后,系统看起来和没加缓存的行为一致,但

2020-05-26 19:41:56 1040

原创 业务优先

一、理解公司业务1、技术支撑业务的发展,业务成就技术的价值技术中台聚集的是一群Geek,我们相信技术可以改变世界。但是一项技术的伟大,总是通过它的杀手级应用来体现;一家公司的伟大,总是因为做出了伟大的业务。不能支撑好业务的技术,依然有技术本身的价值,但这个价值会被局限,几乎很难释放出来。所以技术一定要服务好业务,做好业务的发动机,彼此配合才能相互成就。技术中台最坏的状况是技术能力太差,不能支撑业务的发展,其次是技术脱离业务,不能服务业务的发展。前者是能力问题,后者是意识问题,伴鱼的技术中台一定是能力与

2020-05-26 19:13:07 803

原创 Babel6升级到Babel7中遇到的问题及处理方式

现在我们直接使用官方推荐的 Babel升级工具 来升级现有项目试试1. 使用Babel升级工具# 不安装,直接使用npx来执行npx babel-upgrade --write# 或是安裝 babel-upgrade 在 global 並執行yarn global add babel-upgradebabel-upgrade --write至此我们可以看到 package.json 中移除了旧版本的依赖,自动新增了新版名称,.babelrc 文件的配置也会自动修改,但是不会删除已有的插件,

2020-05-26 19:11:12 5659

原创 AB 测试平台的设计与实现

AB 测试(以下称为「试验」),本质是把选择权交给用户,让用户决定什么是最好的。我们给参与试验的不同用户,分配不同的方案,收集用户数据并加以分析,最终确定最优方案。试验方案的分配可抽象为一个哈希函数,它将一个用户映射为一个试验方案。用户数据一般通过用户行为隐式收集,比如点击、购买、停留时长等。数据的分析则需要依据统计学的假设检验,确保结论的合理性。需求,从简到繁这里涉及的概念有「试验」(experiment)和「用户」(user),而逻辑则有「分配方案」、「收集数据」和「分析并得出结论」等。我们从最简

2020-05-26 19:08:30 2264

原创 你真的理解计算机时间吗?

前言对于计算机系统中的时间,如果你曾经思考过下面的问题,但是没有结论,那么通过本文将给你详细的解答:闰秒是怎么产生的,在2012年6月30日UTC插入一个闰秒后,大量linux服务器宕机的原因是什么?计算机系统是怎么保证自己的时间是准确的?计算机系统我们经常使用微妙甚至纳秒,它怎么来提供这么高精度的时间?计算机系统是没有时间概念的机器,那么它是怎么来计算与管理时间的?背景时间是一个非常抽象的问题,吸引着许多伟大的神学家、哲学家和物理学家花毕生精力去解释时间的本质是什么,然而依然没有定论。幸

2020-05-26 19:06:29 889

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除