首页
学习
活动
专区
工具
TVP
发布

高性能分布式系统设计

专栏作者
31
文章
36875
阅读量
28
订阅数
闭包是更好的对象---从Reload配置说起
如果项目中,到处用了一个全局对象的指针,那一定是很糟糕的. 我们假设这个对象就是Conf,也就是全局配置. 现在要改进代码,实现Reload Conf. 建议以下的改法:
Linker
2019-03-12
3730
一个值得关注的js项目:js-ipfs
未来能在浏览器内,实现大部分IPFS的功能,对于IPFS的推广有很大的好处。尤其是可以用于CDN领域。
Linker
2018-11-15
1.1K0
如何把Go调用C的性能提升10倍?
目前,当Go需要和C/C++代码集成的时候,大家最先想到的肯定是CGO。毕竟是官方的解决方案,而且简单。 但是CGO是非常慢的。因为CGO其实一个桥接器,通过自动生成代码,CGO在保留了C/C++运行时的情况下,搭建了一个桥来沟通C/C++世界和Go的世界。这就意味着,兼容性很好,但是对C的函数的调用,必须先把当前的goroutine挂起,并切换执行栈到当前的线程M的主栈(大小2MB)。如果不做这个操作,那么只能在goroutine的栈上执行C函数调用,可是,goroutine的栈一般都很小,很容易就导致了
Linker
2018-04-13
2.2K0
从历史看未来,大规模微服务系统的困境----基于消息的架构的回归
在大规模分布式系统的架构上,微服务系统是现在很多大型互联网公司的架构方向。 这是一个务实的很好的方向,相对于旧的宏服务来说。 然而,像淘宝这种规模的系统,微服务很容易陷入一个困境,就是 聚合层的扇入扇
Linker
2018-04-13
9810
Go的defer和方法修饰符的一个小坑
先看代码: https://play.golang.org/p/GlM23bSW6zf 可见: 1. for 循环变量只有一份  2. 单行的defer和go都是在当前时刻求值。     如果方法的修
Linker
2018-04-13
6010
Go的PCRE包装在启用JIT的时候遇到的问题和解决方案
用CGO包装C的库, 如果启用了JIT的话,会有一些问题. 例如pcre用了JIT动态生成代码并JIT代码引用里自己线程的JIT Stack数据. 这时会有一个问题, JIT代码的线程并不会刚好是后续Goroutine执行的线程, 当这件事发生的时候, 内存异常不可能避免. 解决方案有两个: 1. 针对每个库特别的优化, 把JIT引用的数据复制到Go的堆中,并修改指针; 例如这个Commit; 2. 使用 go 的pthread包装,在 pthread中使用 该C库;
Linker
2018-04-13
8600
避免Goroutine频繁创建来提高性能
频繁的创建和销毁goroutine带来的开销不仅仅是goroutine创建和销毁本身. 更大的开销是由于goroutine的Stack一开始只有2KB, 而大部分复杂的业务都需要更多的Stack. 新创建goroutine, 还需要付出频繁扩展Stack的成本. 这个成本是巨大的. 如果最终需要128KB的栈,那么要扩6次stack. 期间需要复制和检查Stack当中的数据, 开销巨大. 以下的代码,可以把创建goroutine改成一个简单的入chan操作, 同时也避免的扩展Stack的操作, 成本就降低了
Linker
2018-04-13
1.8K1
Go的nanomsg实现 mangos
mangos nanomsg是一个消息协议SP ("Scalable Protocols")的c语言实现,而mangos用golang实现了SP ("Scalable Protocols")。 消息协议不同于通常我们说的消息队列,是指一个简单的传输会话协议。 mangos重点也是替代直接手写TCP,实现各种场合的通讯范式。 推荐 http://bravenewgeek.com/fast-scalable-networking-in-go-with-mangos/ 那么mangos、nanomsg有何优点么?
Linker
2018-04-13
1.7K0
Go语言可用几种消息通讯方案
mangos  基于SP/nanomsg 协议,比较难用。 ProtoActor 类似Erlang的实现,比较新,完备度较低,但是性能还不错。 最近又多了一个选择,vice 以channel为抽象的跨机器的消息层。支持NSQ/Redis等消息队列/组件。目前vice的实现还非常简单,功能和前面两者还不能比。
Linker
2018-04-13
6130
【GO语言】合理配置GOMAXPROCS提升一倍以上的性能
GOMAXPROCS 用默认的,就是CPU的硬件线程数目, 对于大部分File IO密集的应用是不合适的。 至少应该配置到硬件线程数目的5倍以上, 最大1024。 具体参见。 这是为什么呢? 我们来复
Linker
2018-04-13
1.6K0
基于 CSP 的设计思想和 OOP 设计思想的异同
Go语言推崇的CSP编程模型和设计思想,并没有引起很多Go开发者包括Go标准库作者的重视。标准库的很多设计保留了很浓的OOP的味道。本篇Blog想比较下从设计的角度看,CSP和OOP到底有什么区别。 下面,我们来看一个例子,如果我们有一个项目,需要做一个TCP连接中继器(请原谅我的用词)。我们先按照OOP来设计下: 系统的结构:需要有一个客户端和一个服务器端。分两个进程分别跑在不同机器上。 系统对象关系拆分(这里有所简化,E-R图等省略):连接中继器类--系统的主类、config类--描述配置的类、conn
Linker
2018-04-13
1.2K0
从设计上规避Go语言的 interface{} == nil 判断容易出错的简单办法
Go语言的interface{} 本质上是一个结构,含有一个type字段,一个pointer字段。 很多初学者会拿一个已经在某种情况下被赋予类型的interface{}和nil比较,然后惊讶的发现两者
Linker
2018-04-13
6230
让Atom的go plus插件兼容govendor
目前,go plus插件不会在项目的vendor目录搜索, 有人提了issue,被残忍的关闭了. 解决方案: 在go path里面建立一个目录叫 vendor,在该目录建立一个软链接 src -> /项/目/目/录/vendor export GOPATH=$GOPATH:/Users/xxxxxxxx/go/vendor 然后重启Atom. 即可.
Linker
2018-04-13
8920
Pandas 简介
Pandas 是Python的数据处理包,全名:Python Data Analysis Library 是连接 SciPy 和 NumPy 的一种工具。特色是: 1)支持多种数据格式,甚至包括excel和SQL数据库。 2)数据对齐,缺失数据处理,数据排序等常规数据整理操作。 3)基于标签的数据集操作,包括切片和采样等。 4)高性能的merge和join操作。 5)支持时序数据操作。 6)超高性能,核心代码基于C,实测性能远远超过等价的Java实现。 7)免费。
Linker
2018-04-13
6150
干掉支付宝留在Mac OS X里的进程
AlipayDispatcherService 是支付宝留在拦截TCP流量的进程。 耗电且不安全。不但每时每刻都会消耗系统的电力,还会拦截所有的TCP流量,这本身在安全性上就是一个漏洞。 要删除只很简
Linker
2018-04-13
1.5K0
proxychains 一个好用的终端用代理拦截器
很多技术网站在国内不能很好的访问,需要借助一些工具。 但是,在终端里面,这些代理不一定起作用。 比如git curl wget就不会理睬mac系统的代理配置。 proxychains就可以解决这个问题。 安装好proxychains以后,配置一个短名字 pc4 pc4 brew install luajit 就可以很快安装好luajit了。 至于怎么装,请自行Google,如果你用不了Google,那么上面说的都是废话。
Linker
2018-04-13
6990
Maven配置socks5代理
export MAVEN_OPTS="-DsocksProxyHost=127.0.0.1 -DsocksProxyPort=1080" 或者在settings.xml里面配置: <proxies> <proxy>       <id>ss</id>       <active>true</active>       <protocol>socks5</protocol>       <username></username>       <password></password>       <host>
Linker
2018-04-13
3.4K0
写了一个Java like的ExecutorService的Go语言实现
练习下刚刚学的Go语言。GoExecutors 主要用法可以看main.go文件。 主要是想用Java处理并发的ExecutorService系列工具类的模式,在Go语言中重写,体验下两种语言的异同。 其中,第一个版本用了一个共享的map,后来改成现在这样子,用闭包来绑定数据到Callable上。 体会就是,Go语言还是尽量用goroutine和chan比较好。 --------------- 更新了下,增加了对错误和panic的处理。
Linker
2018-04-13
5360
从一个WaitGroup的例子看Go语言的Upvalue的传递
Go语言的闭包捕获的外部变量,我还是习惯以Lua的叫法,称之为Upvalue,毕竟Go借鉴了很多Lua的特性。 让我们首先看五个几乎一样的代码片段。 package main import ( "log" "sync" ) func main() { wg := sync.WaitGroup{} for i := 0; i < 5; i++ { wg.Add(1) go func(wg sync.WaitGroup, i int) { log.Printf("i:%d", i)
Linker
2018-04-13
8900
Jython设置默认编码
Jython项目对非ascii编码的支持不是很好,尤其是在windows环境。 但是需要用Jython做一些和Java配合的工作,又必须要能够在Windows环境工作。经过一番研究终于发现两个可行的方法。 在Win7命令行直接运行Jython 2.7a2是不行的,因为Jython默认是ascii编码,而Win7默认是GBK编码,更加悲剧的是JVM又不支持在Console使用GBK. 一个简单的解决方法: jython -C "utf-8" 看看默认编码: >>> import sys
Linker
2018-04-13
3.3K0
点击加载更多
社区活动
腾讯技术创作狂欢月
“码”上创作 21 天,分 10000 元奖品池!
Python精品学习库
代码在线跑,知识轻松学
博客搬家 | 分享价值百万资源包
自行/邀约他人一键搬运博客,速成社区影响力并领取好礼
技术创作特训营·精选知识专栏
往期视频·千货材料·成员作品 最新动态
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档