自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

Sunface撩技术

大道至简,技术如歌,欢迎来到Sunface的博客,https://im.dev

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

转载 高可用高伸缩系统剖析

分布式系统是目前整个互联网行业百谈不厌的话题,无论是已经拥有海量用户的巨头公司,或是需要应用未来用户快速增长的初创团队,以及要靠高性能、可伸缩的系统特性来为广大开发者提供第三方服务的解决方案提供商,在进行服务端架构设计时,都无疑会使用分布式的部署方案。 分布式架构解决的主要问题现阶段,分布式架构能够解决很多确实存在的问题。第一个就是高可用。举一个简单的单机房高可用的例子,你肯定不希望因为一个磁盘损

2016-03-27 22:31:33 2177

转载 从C10K到C10M高性能网络的探索与实践

在高性能网络的场景下,C10K是一个具有里程碑意义的场景,15年前它给互联网领域带来了很大的挑战。发展至今,我们已经进入C10M的场景进行网络性能优化。这期间有怎样的发展和趋势?围绕着各类指标分别有哪些探索和实践? C10K时代的问题与优化手段首先带大家回顾一下当年C10K场景中遇到的问题以及为了解决我们单机下高并发的承载能力所做的改进。在当时的年代,国内互联网的普及程度相对较低,C10K并没有给

2016-03-27 22:23:36 2370 2

转载 电商搜索引擎实践(工程篇)

随着互联网数据规模的爆炸式增长, 如何从海量的历史, 实时数据中快速获取有用的信息, 变得越来越有挑战性. 一个中等的电商平台, 每天都要产生百万条原始数据, 上亿条用户行为数据. 一般来说, 电商数据一般有3种主要类型的数据系统:关系型数据库, 大多数互联网公司会选用mysql作为关数据库的主选, 用于存储商品, 用户信息等数据. 关系型数据库对于事务性非常高的OLTP操作(比如订单, 结算等)

2016-03-27 22:16:32 8830

原创 几种软负载均衡策略分析

公司去年上了F5,好用是好用,但是费用太高昂了,所以最近一直在研究软负载均衡这一块儿,恰巧今年年初谷歌开源了seesaw,让自己可以绕过很多弯路。特此总结下之前了解的负载均衡策略。 -Sunface在分布式系统中,负载均衡是非常重要的环节,通过负载均衡将请求派发到网络中的一个或多个节点上进行处理。通常来说,负载均衡分为硬件负载均衡及软件负载均衡。硬件负载均衡,顾名思义,在服务器节点之间安装专门的硬

2016-03-27 21:58:45 27859 6

原创 硬盘、数据库查找算法

B~树               1.前言:动态查找树主要有:二叉查找树(Binary Search Tree),平衡二叉查找树(Balanced Binary Search Tree),红黑树 (Red-Black Tree ),B-tree/B+-tree/ B*-tree (B~Tree)。前三者是典型的二叉查找树结构,其查找的时间复杂度O(log2N)与树的深度相关,那么降低树的深度自然

2016-03-27 18:40:43 5324 1

翻译 甜品店切蛋糕问题(动态规划,Go语言实现)

问题重现:小Y最近在甜品店工作,其工作是切蛋糕。现在有n个顾客来购买蛋糕,并且每个顾客有一个到达的时间,以及需要买的蛋糕的长度ai。由于小Y每次只能服务一个顾客,【问题严谨性补充:而顾客如果进店没有服务员立刻为他服务,他将离开】所以对于相冲突的顾客没有办法提供服务。问小Y最多能为多少位顾客提供服务。小Y能够决定是否卖蛋糕给某个顾客。如果答应顾客要买长度为ai的切糕,那么小Y还要将蛋糕切成单位长度给

2016-03-26 01:38:43 3373

原创 Go语言核心之美 3.4-Struct结构体

struct结构体也是一种聚合的数据类型,结构体中可以有零个或多个任意类型的值-结构体的成员。用来演示struct的一个经典案例就是公司的员工信息,每条员工信息都包含:员工编号,姓名,住址,出生日期,工作岗位,薪资,直属领导等。所有的信息都可以存在一个struct中,该struct可以作为完整的单元可以被复制,或者作为函数的参数、返回值,或者被存到数组、切片中,等等。 下面声明了Employee

2016-03-25 17:46:56 20928 3

原创 Go语言核心之美 3.3-Map

哈希表是一种非常好用、适用很广的数据结构,它是key-value对的无序集合,其中key是唯一的,通过key可以在常数复杂度时间内进行查询、更新或删除,无论表有多大。 Go语言的map就是对哈希表的引用,表示为map[Key]Value。map中所有的key都是相同的类型,所有的value也是相同的类型,不过key和value可以是不同的类型。能做key的数据类型,必须支持==和!=运算符,这样m

2016-03-23 18:50:55 4207 3

原创 Go语言核心之美 3.2-slice切片

Slice是长度可变的元素序列(数组不可变),每个元素都有相同的类型。slice类型写作[]T,其中T代表slice中的元素类型;slice和数组写法很像,只是没有指定长度。 数组和slice之间的联系非常紧密。slice是非常轻量的数据结构,它是引用类型,指向底层的一个数组,该数组被称之为slice的底层数组,slice可以访问底层数组的某个子序列,也可以访问整个数组。一个slice由三个部分组

2016-03-23 13:21:52 6548 3

原创 Go语言核心之美 3.1-数组

上一章中深入学习了基本数据类型,它们是构建复杂数据类型的基础,是Go语言世界中的原子。本章,我们将学习复合类型:通过不同的方式将基本类型组合起来。主要有四种复合类型--数组,切片(slice),map,结构体(struct),在本章末尾,我们将展示如何通过struct来进行JSON编解码,同时配合template模板来生成HTML页面。 数组和结构体都是聚合类型:数组是由元素组成,结构体由字段组成

2016-03-22 17:42:45 3336

原创 Go语言核心之美 2.6-常量

在Go语言中,常量表达式是在编译器求值的,因此在程序运行时是没有性能损耗的。常量的底层类型是前面提过的基本类型:布尔值,字符串,数值变量。 常量的声明方式和变量很相似,但是常量的值是不可变的,因此在运行期是不可以对常量进行修改的。例如,对于π这种数学常数,常量显然比变量更适合,因为我们不允许这个值发生任何变化:const pi = 3.14159 // approximately; math.Pi

2016-03-22 14:01:54 3671 2

原创 大型网站Mysql的演变史

写在最前:本文主要描述在网站的不同的并发访问量级下,Mysql架构的演变可扩展性架构的可扩展性往往和并发是息息相关,没有并发的增长,也就没有必要做高可扩展性的架构,这里对可扩展性进行简单介绍一下,常用的扩展手段有以下两种Scale-up :  纵向扩展,通过替换为更好的机器和资源来实现伸缩,提升服务能力Scale-out : 横向扩展,  通过加节点(机器)来实现伸缩,提升服务能力对于互联网的高并

2016-03-18 12:45:17 8164 2

原创 Go语言核心之美 2.5-字符串

字符串是不可变的字节序列,可以包含任意数据,包括0这个字节,不过通常是用来包含可读性较强的文本。文本字符串通常采用UTF-8编码,由Unicode码点(rune)组成。 内置的len函数会返回字符串的所有字节数(注意不是rune的数目!!一个rune可能包含多个字节),下标操作s[i]可以获取字符串的第i 个字节(从0开始),   其中i >= 0 && i s := "hello, world"

2016-03-17 18:06:20 8454 2

原创 Go语言核心之美 2.4-布尔值

布尔值有两种:true和false。if和for语句中的条件都是布尔值,比较运算符== 、 布尔值可以结合&&(AND) 、|| (OR)一起使用,这两个操作符都有短路特性,如果操作符的左边表达式就能决定结果了,那操作符右边的表达式不会求值:s != "" && s[0] == 'x' 如果s是空字符串,那s[0]会panic,但是因为s为""的时候,&&左边的表达式是false,因此根据短路规则

2016-03-16 18:32:01 4919

原创 Go语言核心之美 2.3-复数

Go提供了两种size的复数类型:complex64和complex128,分别由float32和float64组成。内置函数complex从实部和虚部构建复数,内置函数real和imag用来获取复数的实部和虚部:var x complex128 = complex(1, 2) // 1+2ivar y complex128 = complex(3, 4) // 3+4ifmt.Println

2016-03-16 17:50:33 5905 1

原创 Go语言核心之美 2.2-浮点数

Go提供了两种size的浮点数,float32和float64。它们的算术规范是由IEEE754国际标准定义,现代CPU都实现了这个规范。 浮点数能够表示的范围可以从很小到很巨大,浮点数的取值范围可以在math包中获取,math.MaxFloat32表示float32的最大值,大约是3.4e38,math.MaxFloat64大概是1.8e308。两个类型最小的非负值大概是1.4e-45和4.9e

2016-03-16 16:51:53 8409 1

原创 Go语言核心之美 2.1-整数

第二章 序 在计算机底层,一切都是比特位。然而计算机一般都操作固定大小的数,称之为字(word)。字会被解释为整数、浮点数、比特位数组、内存地址等,这些字又可以进一步聚合成数据包(packet)、像素点、作品集、是个或者其它任何对象。Go语言提供了多样化的数据组织方式,这些数据类型能提供硬件层面的兼容性,也能让程序员方便的组合成更复杂的数据类型。 Go语言的数据类型分为四大类:基本类型,复合类型

2016-03-16 13:44:02 6061

原创 Go语言核心之美 1.5-作用域

变量的作用域是指程序代码中可以有效使用这个变量的范围。不要将作用域和生命期混在一起。作用域是代码中的一块区域,是一个编译期的属性;生命期是程序运行期间变量存活的时间段,在此时间段内,变量可以被程序的其它部分所引用,是运行期的概念。 语法块是包含在花括号内的一系列语句,例如函数体或者循环体。语法块内部声明的变量是无法被语法块外部代码访问的。我们可以扩展局部语法块的概念,在某些场景下,是不需要花括号的

2016-03-15 20:59:30 4586

原创 Go语言核心之美 1.4-包和文件

Go语言中的包(Package)就像其它语言的库(Library)或模块(Module)一样,支持模块化,封装性,可重用性,单独编译等特点。包的源码是由数个.go文件组成,这些文件所在的目录名是import路径的最后一个词,例如github.com/sunface/corego包的所有文件都存储在$GOPATH/src/github.com/sunface/corego底下。 每个包都有独立的命名

2016-03-15 17:39:02 4227

原创 Go语言核心之美 1.3-赋值及类型声明篇

四、赋值(Assignment) 变量的值可以通过赋值操作来更新, v = 10。x = 1 // 具名变量x*p = true // 指针变量person.name = "bob" // 结构体struct的字段count[x] = count[x] * scale // 数组、切片或者map的

2016-03-15 13:16:54 3728

原创 Go语言核心之美 1.2-变量及声明篇

三.变量 1.用var关键字可以创建一个指定类型的变量。 var i int = 0 var i = 0 var i int 以上三个表达式都是合法的,其中第三个表达式会初始化i为int的零值;如果是bool类型,则为false;float64是0.0;string为"";interface为nil;引用类型也为nil;如果是struct,则是将struct的所有字段初始化为对应类型的零值

2016-03-14 21:37:12 3669 3

原创 Go语言核心之美-必读

Go语言核心技术系列文章都是我原创、或从国外的书籍和博客中收集优秀的文章进行翻译的,因此转载时请注明转载出处,不胜感激。 欢迎大家加入Go语言核心技术QQ群894864,里面热心大神很多哦!

2016-03-14 13:34:45 5490 1

原创 Go语言核心之美 1.1-命名篇

一.命名篇 1.Go的函数、变量、常量、自定义类型、包(Package)的命名方式遵循以下规则: 1)首字符可以是任意的Unicode字符或者下划线 2)剩余字符可以是Unicode字符、下划线、数字    3)字符长度不限 2.Go只有25个关键字 break default func interface selectcase

2016-03-14 13:28:04 7994

原创 通过一个大型项目来学习分布式算法(6)

图7:三个策略的分区和key的位置。甲,乙,丙描述三个独立的节点,形成keyk1在一致性哈希环上的首选列表(N=3)。阴影部分表示节点A,B和C形式的首选列表负责的keyrangee。黑色箭头标明各节点的Token的位置。策略3:每个节点Q/S个Token,大小相等的分区:类似策略2,这一策略空间划分成同样大小为Q的散列分区,以及分区布局(placement of partition)与划分方法(

2016-03-11 17:07:48 2563 1

原创 通过一个大型项目来学习分布式算法(5)

这也引入了一个耐用性漏洞(vulnerability)窗口:即使它只是在少数几个节点上持久化了但写入请求成功返回到客户端。传统的观点认为,耐用性和可用性关系总是非常紧密(hand-in-hand手牵手^-^)。但是,这并不一定总是真的。例如,耐用性漏洞窗口可以通过增加W来减少,但这将增加请求被拒绝的机率(从而减少可用性),因为为处理一个写请求需要更多的存储主机需要活着。被好几个Dynamo实例采用

2016-03-11 17:06:25 2050

原创 通过一个大型项目来学习分布式算法(4)

使用暗示移交,Dynamo确保读取和写入操作不会因为节点临时或网络故障而失败。需要最高级别的可用性的应用程序可以设置W为1,这确保了只要系统中有一个节点将key已经持久化到本地存储 , 一个写是可以接受(即一个写操作完成即意味着成功)。因此,只有系统中的所有节点都无法使用时写操作才会被拒绝。然而,在实践中,大多数Amazon生产服务设置了更高的W来满足耐久性极别的要求。对N, R和W的更详细的配置

2016-03-11 17:05:42 2330

原创 通过一个大型项目来学习分布式算法(3)

图2:Dynamo的划分和键的复制。一个负责存储一个特定的键的节点列表被称为首选列表(preference list)。该系统的设计,如将4.8节中解释,让系统中每一个节点可以决定对于任意key哪些节点应该在这个清单中。出于对节点故障的考虑,首选清单可以包含起过N个节点。请注意,因使用虚拟节点,对于一个特定的key的第一个N个后继位置可能属于少于N个物理所节点(即节点可以持有多个第一个N个位置)。

2016-03-11 17:03:44 2135

原创 通过一个大型项目来学习分布式算法(2)

对称性:每个Dynamo节点应该与它的对等节点(peers)有一样的责任;不应该存在有区别的节点或采取特殊的角色或额外的责任的节。根据我们的经验,对称性(symmetry)简化了系统的配置和维护。去中心化:是对对称性的延伸,设计应采用有利于去中心化而不是集中控制的技术。在过去,集中控制的设计造成系统中断(outages),而本目标是尽可能避免它。这最终造就一个更简单,更具扩展性,更可用的系统。异质

2016-03-11 17:01:34 4349

原创 通过一个大型项目来学习分布式算法(1)

Dynamo:Amazon的高可用性的键-值存储系统摘要 巨大规模系统的可靠性是我们在Amazon.com,这个世界上最大的电子商务公司之一,面对最大的挑战之一,即使最轻微的系统中断都有显着的经济后果并且影响到客户的信赖。Amazon.com平台,它为全球许多网站服务,是实现在位于世界各地的许多数据中心中的成千上万的服务器和网络基础设施之上。在这一规模中,各种大大小小的部件故障持续不断发生,管理持

2016-03-11 16:59:37 4656

原创 轻松学会分布式事务算法

当我们在生产线上用一台服务器来提供数据服务的时候,我会遇到如下的两个问题:1)一台服务器的性能不足以提供足够的能力服务于所有的网络请求。2)我们总是害怕我们的这台服务器停机,造成服务不可用或是数据丢失。于是我们不得不对我们的服务器进行扩展,加入更多的机器来分担性能上的问题,以及来解决单点故障问题。 通常,我们会通过两种手段来扩展我们的数据服务:1)数据分区:就是把数据分块放在不同的服务器上(如:u

2016-03-11 16:55:05 3568

原创 多版本并发控制(MVCC)在实际项目中的应用

最近项目中遇到了一个分布式系统的并发控制问题。该问题可以抽象为:某分布式系统由一个数据中心D和若干业务处理中心L1,L2 … Ln组成;D本质上是一个key-value存储,它对外提供基于HTTP协议的CRUD操作接口。L的业务逻辑可以抽象为下面3个步骤:read: 根据keySet {k1, … kn}从D获取keyValueSet {k1:v1, … kn:vn}do: 根据keyValueS

2016-03-11 16:52:30 6093 1

转载 [Erlang]系统内部监控工具

系统级别perf top, dstat -tam, vtune 都能很好分析beam 瓶颈,本文主要erlang 级别排查:1. 反编译   确认线上运行代码是否正确,reltools没掌握好,升级偶尔出现问题decompile(Mod) -> {ok,{_,[{abstract_code,{_,AC}}]}} = beam_lib:chunks(code:which(Mod), [abs

2016-01-05 16:28:53 2551 1

转载 erlangCPU异常波动debug过程

转载自:http://www.cnblogs.com/lulu/p/3872206.html新服务上线后观察到,CPU在10 ~ 70%间波动严重,但从每秒业务计数器看业务处理速度很平均。  接下来是排查步骤:  1. dstat -tam    大概每10s一个周期,网络流量开始变得很小,随后突然增大,CPU也激增。  网络流量变化和从性能计数器结果上并不符合,服务相关业务较为复杂,先找出那个业

2016-01-05 15:33:46 1653

转载 erlang消息推送单台1500K长连接实战

转自http://www.cnblogs.com/lulu/p/4132278.htmlWhatsapp已经使用Erlang在生产环境跑到96GB内存单机 3M长连接,参加:WhatsApp的Erlang世界。毕竟业务级别能达到Whatsapp那样极少,现在只有千万级,单机太多挂一台影响太大,再者就是没有多线接入,每个机房都得扔那么几台机器吧,所以1M就能满足要求。Erlang 作为长连接网关有着

2016-01-05 13:50:20 2574

翻译 轻松掌握一致性哈希算法

一致性哈希算法在1997年由麻省理工学院提出的一种分布式哈希(DHT)实现算法,设计目标是为了解决因特网中的热点(Hot spot)问题,初衷和CARP十分类似。一致性哈希修正了CARP使用的简 单哈希算法带来的问题,使得分布式哈希(DHT)可以在P2P环境中真正得到应用。     一致性hash算法提出了在动态变化的Cache环境中,判定哈希算法好坏的四个定义:1、平衡性(Balance):平衡

2016-01-05 11:25:42 1967

转载 [Golang]OS系统调用浅析

上回讲Goroutine状态变换的时候,遗留了一部分关于Syscall处理的内容,这次打算把Go语言对Syscall的处理机制系统的总结一下,放在今天这篇文章中。Go 语言库对Syscall的封装我们知道Go是一门面向系统级开发的Native编程语言,与C/C++ 类似,Go的编译器会直接将程序编译、链接成本地可执行文件。理论上,它可以完成任何C/C++语言能完成的。作为支撑该特性的重要方面,Go

2015-12-11 15:26:32 8072

转载 Golang和Erlang消息传递机制对比

上一篇文章介绍了 Go 和 Erlang 在调度器的实现,本文将简要介绍这两种并发语言的消息传递机制简要对比Erlang和Go虽然在实现及功能上差异较大,但是都支持高并发的轻量级用户任务(Erlang的轻量进程,Go的Goroutine), 并且都采用了消息传递的方式作为任务间交互的方式。在Erlang中,采用了一种比较纯粹的消息传递机制,进程间几乎没有任何形式的数据共享,只能通过彼此间发送消息进

2015-12-11 15:25:22 5769 1

转载 Golang和Erlang的IO调度浅析

之前关于调度器的对比分析的文章,在结束时遗留了一些问题:当系统出现高并发的IO访问时,如一个网络服务器通常要并发处理成百上千的链接,每个链接可能都是由一个用户任务执行的,那么将会出现大量阻塞的IO操作,如果为每个阻塞操作都单独分配一个OS线程,那么系统很容易就会退化成多OS线程的系统,轻量任务的优势将无从谈起。本文试图回答这个问题,通过分析Go和Erlang对于IO、特别是网络IO的优化机制,了解

2015-12-11 15:24:17 3358

转载 Golang和Erlang的并发调度浅析

Go 语言和 Erlang 都是面向并发应用的语言,都采用轻量级线程和消息传递模型。尽管Go在语法上也支持共享,但必须以通信的方式同步方能保证其正确性。Erlang则是完全不支持进程间的共享,状态信息完全需要依靠消息彼此传递。从底层来看,在 Google 官方编译器中,Go 语言的 Goroutine 是一种类似协程的结构,由于采用了定制的C编译器来构建,因此其上下文切换的效率要高于C库的 cor

2015-12-11 15:23:06 6870

原创 [Erlang]通用的erlang优化设置

设置是我在多个项目中通用的,不过根据应用场景的不同,还会有其它细调,就不在这一一说明了。  - Sunface    +K true 开启epoll调度,在linux中开启epoll,会大大增加调度的效率+A 100        异步线程池,为某些port调用服务+P 1024000 最大进程数+Q 65535 最大port数+sbt db 绑定调度器,绑定后调度器的任务队列不会在各个CPU线程

2015-12-10 15:11:32 6855

空空如也

空空如也

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

TA关注的人

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