最终一致性
最终一致性
引用自 分布式系统原理九:CAP理论和BASE理论 作者:frank
BASE理论BASE是 Basically Available(基本可用)、Soft state(软状态)和Eventually consistent(最终一致性)三个短语的简写。
BASE是对CAP中一致性和可用性权衡的结果,其来源于对大规模互联网系统分布式实践的总结,是基于CAP定理逐步演化而来的,其核心思想是即使无法做到强一致性,但每个应用都可以根据自身的业务特点,采用适当的方法来使系统达到最终一致性。接下来,我们着重对BASE中的三要素进行讲解。
基本可用基本可用是指分布式系统在出现不可预知故障的时候,允许损失部分可用性——但请注意,这绝不等价于系统不可用。以下就是两个“基本可用”的例子。
响应时间上的损失:正常情况下,一个在线搜索引擎需要在0.5秒之内返回给用户相应的查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询结果的响应时间增加到了1~2秒。
功能上的损失:正常情况下,在一个电子商务网站(比如淘宝)上购物,消费者几乎能够顺利地完成每一笔订单。但在一些节日大促购物高峰 ...
Dockerfile指令
Dockerfile指令
引用自《Docker系列教程07-Dockerfile指令详解》- 周立
Dockerfile有十多个指令。本节我们来系统讲解这些指令,指令的一般格式为 指令名称 参数。
ADD 复制文件ADD指令用于复制文件,格式为:
ADD <src>... <dest>
ADD ["<src>",... "<dest>"]
从src目录复制文件到容器的dest。其中src可以是Dockerfile所在目录的相对路径,也可以是一个URL,还可以是一个压缩包
注意:
① src必须在构建的上下文内,不能使用例如:ADD ../somethine /something 这样的命令,因为 docker build 命令首先会将上下文路径和其子目录发送到docker daemon。
② 如果src是一个URL,同时dest不以斜杠结尾,dest将会被视为文件,src对应内容文件将会被下载到dest。
③ 如果src是一个URL,同时dest以斜杠结尾,dest将被视为目录,src对应内容 ...
CAP理论
CAP理论
引用自 分布式系统的CAP理论
1998年,加州大学的计算机科学家 Eric Brewer 提出,分布式系统有三个指标。
Consistency
Availability
Partition tolerance它们的第一个字母分别是 C、A、P。
Eric Brewer 说,这三个指标不可能同时做到。这个结论就叫做 CAP 定理。
无论你是一个系统架构师,还是一个普通开发,当你开发或者设计一个分布式系统的时候,CAP理论是无论如何也绕不过去的。本文就来介绍一下到底什么是CAP理论,如何证明CAP理论,以及CAP的权衡问题。
CAP理论概述CAP理论:一个分布式系统最多只能同时满足一致性(Consistency)、可用性(Availability)和分区容错性(Partition tolerance)这三项中的两项。
读者需要注意的是,CAP理论中的CA和数据库事务中ACID的CA并不完全是一回事。两者中的C都是一致性(Consistency)。CAP中的A值得是可用性(Availability),而ACID中的A指的是原子性(Atomicity),切勿混为一谈 ...
Docker容器命令
Docker容器命令
引用自《Docker系列教程05-容器常用命令》- 周立
本节我们来讨论Docker容器的常用命令。
新建并启动容器[重要]使用以下 docker run 命令即可新建并启动一个容器。该命令是我们最常用的命令了,它有很多选项,下面笔者列举一些常用的选项。
① -d选项:表示后台运行
② -P选项:随机端口映射
③ -p选项:指定端口映射,有以下四种格式。
ip:hostPort:containerPort
ip::containerPort
hostPort:containerPort
containerPort
④ –network选项:指定网络模式,该选项有以下可选参数:
–network=bridge: 默认选项,表示连接到默认的网桥。
–network=host:容器使用宿主机的网络。
–network=container:NAME_or_ID:告诉Docker让新建的容器使用已有容器的网络配置。
–network=none:不配置该容器的网络,用户可自定义网络配置。
示例1:
1docker run java / ...
docker-compose.yml命令
docker-compose.yml命令
引用自《Docker系列教程22-docker-compose.yml常用命令》- 周立
docker-compose.yml是Compose的默认模板文件。该文件有多种写法,例如Version 1 file format、Version 2 file format、Version 2.1 file format、Version 3 file format等。其中,Version 1 file format将逐步被被弃用;Version 2.x及Version 3.x基本兼容,是未来的趋势。考虑到目前业界的使用情况,本节只讨论Version 2 file format下的常用命令。
(1) build配置构建时的选项,Compose会利用它自动构建镜像。build的值可以是一个路径,例如:
1build: ./dir
也可以是一个对象,用于指定Dockerfile和参数,例如:
12345build: context: ./dir dockerfile: Dockerfile-alternate args: buildno: 1 ...
docker-compose命令
docker-compose命令
引用自《Docker系列教程23-docker-compose常用命令》- 周立
和docker命令一样,docker-compose命令也有很多选项。下面我们来详细探讨docker-compose的常用命令。
build构建或重新构建服务。服务被构建后将会以project_service 的形式标记,例如:composetest_db 。
help查看指定命令的帮助文档,该命令非常实用。docker-compose所有命令的帮助文档都可通过该命令查看。
1docker-compose help COMMAND
示例:
1docker-compose help build # 查看docker-compose build的帮助
kill通过发送SIGKILL 信号停止指定服务的容器。示例:
1docker-compose kill eureka
该命令也支持通过参数来指定发送的信号,例如:
1docker-compose kill -s SIGINT
logs查看服务的日志输出。
port打印绑定的公共端口。示例:
1docker-comp ...
Docker镜像命令
Docker镜像命令
引用自《Docker系列教程04-Docker镜像常用命令》- 周立
搜索镜像可使用 docker search 命令搜索存放在Docker Hub中的镜像。
命令格式:
1docker search [OPTIONS] TERM
参数:
名称,缩写
默认值
描述
–automated
false
只列出自动构建的镜像
–filter, -f
根据指定条件过滤结果
–limit
25
搜索结果的最大条数
–no-trunc
false
不截断输出,显示完整的输出
–stars, -s
0
只展示Star不低于该数值的结果
示例1:
1docker search java
执行该命令后,Docker就会在Docker Hub中搜索含有“java”这个关键词的镜像仓库。执行该命令后,可看到类似于如下的表格:
1234567NAME DESCRIPTION STARS OFFICIAL AUTOMATEDjava ...
安装Docker
安装Docker
引用自《Docker系列教程02-Docker安装》- 周立
Ubuntu系统要求
Docker支持以下版本的Ubuntu,要求64位。
Bionic Beaver 18.04 (LTS)
Zesty 17.04
Xenial 16.04 (LTS)
Trusty 14.04 (LTS)
支持运行的平台:x86_64、armhf、s390x(IBM Z)。其中,如选择IBM Z,那么只支持Ubuntu Xenial以及Zesty。
本文使用Ubuntu 16.04 LTS,下载地址:http://cn.ubuntu.com/download/
安装步骤
卸载老版本Docker
在Ubuntu中,老版本的软件包名称是 docker 或者 docker-engine ,而Docker CE的软件包名称是 docker-ce。因此,如已安装过老版本的Docker,需要先卸载掉。执行以下命令,即可卸载老版本的Docker及其依赖。
1sudo apt-get remove docker docker-engine docker.io
需要注意的是,执行该命令 ...
ORM框架gorm使用手册
项目地址:https://github.com/jinzhu/gorm
gorm文档
GORM 中文文档http://gorm.book.jasperxu.com/
Golang写的,开发人员友好的ORM库。
概述
全功能ORM(几乎)
关联(包含一个,包含多个,属于,多对多,多种包含)
Callbacks(创建/保存/更新/删除/查找之前/之后)
预加载(急加载)
事务
复合主键
SQL Builder
自动迁移
日志
可扩展,编写基于GORM回调的插件
每个功能都有测试
开发人员友好
安装1go get -u github.com/jinzhu/gorm
升级到V1.0
更新日志
快速开始12345678910111213141516171819202122232425262728293031323334353637package mainimport ( "github.com/jinzhu/gorm" _ "github.com/jinzhu/gorm/dialects/sq ...
web框架Gin使用手册
项目地址:https://github.com/gin-gonic/gin
安装要安装Gin软件包,您需要先安装Go并设置Go工作区。
下载并安装
1$ go get -u github.com/gin-gonic/gin
导入gin
1import "github.com/gin-gonic/gin"
(可选)导入 net/http。可以使用 http.StatusOK 之类的一些常量
1import "net/http"
快速开始12# assume the following codes in example.go file$ cat example.go
12345678910111213package mainimport "github.com/gin-gonic/gin"func main() { r := gin.Default() r.GET("/ping", func(c *gin.Context) { c.JSON(200, gin.H ...
爬虫框架go_spider
项目地址:https://github.com/hu17889/go_spider
go-spider文档
常见问题与功能说明
中文文档简介本项目基于golang开发,是一个开放的垂直领域的爬虫框架,框架中将各个功能模块区分开,方便使用者重新实现子模块,进而构建自己垂直方方向的爬虫。
本项目将爬虫的各个功能流程区分成Spider模块(主控),Downloader模块(下载器),PageProcesser模块(页面分析),Scheduler模块(任务队列),Pipeline模块(结果输出);
执行过程简述:
Spider模块从Scheduler模块中获取包含待抓取url的Request对象,启动一个协程,一个协程执行一次爬取过程,此处我们把协程也看成Spider,Spider把Request对象传入Downloader,Downloader下载该Request对象中url所对应的页面或者其他类型的数据,生成Page对象;
Spider调用PageProcesser模块解析Page对象中的页面数据,并存入Page对象中的PageItems中(以Key-Value对的形式保存) ...
跨平台GUI工具fyne
敬请期待……
搭建基于 Aria2 的下载机
搭建基于 Aria2 的下载机
参考:树莓派3B+ 远程下载服务器(Aria2)
安装 Aria2使用以下命令安装 Aria2:
1sudo apt install aria2
编辑 Aria2 配置文件创建文件夹 mkdir -p ~/.config/aria2。
添加一个 Aria2 配置文件 vim ~/.config/aria2/aria2.config。
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354#后台运行daemon=true#用户名#rpc-user=user#密码#rpc-passwd=passwd#设置加密的密钥rpc-secret=secret#允许rpcenable-rpc=true#允许所有来源,web界面跨域权限需要设置rpc-allow-origin-all=true#是否启用https加密,启用之后要设置公钥、私钥的文件路径#rpc-secure=true#启用加密设置公钥#rpc-certific ...
树莓派运行情况监控
树莓派运行情况监控项目地址:go-pi-monitor
go-pi-monitor 是在 gopsutil 的基础上挑选部分 metric 信息进行监控可视化。
编译部署在 Raspbian 上安装 GoLang 1.12.5 版本的脚本如下:
12345678910#install_go_pi.shcd $HOMEFileName='go1.12.5.linux-armv6l.tar.gz'wget https://dl.google.com/go/$FileNamesudo tar -C /usr/local -xvf $FileNamecat >> ~/.bashrc << 'EOF'export GOPATH=$HOME/goexport PATH=/usr/local/go/bin:$PATH:$GOPATH/binEOFsource ~/.bashrc
参考 Install Go Lang 1.12.5 on Raspberry Pi 3 B+。
下载 go-pi-monitor 并进行编译运行:
12345 ...
Tech与Team — Leader 的自我修养
原文地址:https://kymjs.com/manager/2019/07/13/01 转载
招人那些事最近一直在招人,一直在面试,见了很多人,遇过很多事。
总的来说,在我面试别人的时候,能方便他人都会尽量去方便,面试过程中,尽量营造一个轻松的气氛,比如聊一些别人的强项,总是抓住别人薄弱点不放,把气氛搞得很尴尬,我觉得真的没意义。
可即便是这样,我发现最多的情况是,几乎所有人都不知道自己的强项在哪里——没有自我认知。
开放性问题问开放性问题可以很容易了解一个人,对于技术好的人可以很容易表现自己,对于技术不好的,一定会支支吾吾,因为根本就没有答案可背。比如通常有两个开放性的问题,是我一定会问的:
你在这家公司做的,你觉得最牛逼的事情是什么?
你做了几年 Android 开发,你觉得哪个开源项目让你学习到的最多。
其实这两个问题通常我都是希望从宏观和细节的角度,去尝试了解你对自己项目的认知和理解。
第一个问题,我得到的答案通常是一个很小的技术点。有两三个人,都是之前做互联网金融的(可见前两年互金的泡沫多可怕)说自己做的最牛逼的是是做了一套 hybrid 框架,可以高性能浏览 ...
“跟进”的正确方式
原文地址:“跟进”的正确方式 转载
工作中,我们常常会提到一个词叫做“跟进”,但是其实很多人并不懂得如何“跟进”,或者不知道怎么做好“跟进”。
有个问题抛出来,然后埋头苦干,一味只顾自己干,这不叫跟进。
跟进的“跟”,核心是沟通,沟通什么?沟通“进度”!
首先要跟需求方沟通,说明问题原因、解决方案、解决时间和计划。
其实要跟执行人沟通,安排什么人去处理,要沟通好,如果是自己处理,要排好优先级。
最后要跟关注的人汇报,阶段性汇报,开始、关键过程、结束,都要汇报,不要跟到一半就不管了。
优秀的人一定要懂得,一件事情既然做了,就值得我们去做好它。日常工作中,超过一半以上的事情都是需要我们跟别人一起协作的过程,所以平时多思考自己的做事方式,不单单是提升了自己,还会提高整个团队的效率。互联网中有个共识叫做“既定事实”,优秀不是被说出来的,而是我们认真做到了,大家就一定能看到!
谨以此共勉!
一套摆脱疲劳的自救指南
原文地址:一套摆脱疲劳的自救指南 转载
最近和朋友聊天,大家都有这么一个感触:
随着年龄增长,一方面,身体开始出现小问题。以前深夜工作是家常便饭,现在稍微睡得晚一点,第二天一定会头痛。
另一方面,精神状态也开始走下坡路。经常会时不时走神,忘了在做什么,一天下来总会精疲力尽。有时明明有大把时间,却什么都不想做,对什么事都提不起兴趣,就想静静瘫着,让时间给「消磨」掉……
知乎有一个经典的问题,叫做:为什么那么多人开车回家,到楼下了不下车还要在车里坐好久?
下面的回答参差百态。有描述中年男人生活压力的,有嗟叹柴米油盐、家长里短的,有倾诉家庭主妇每日忙碌烦琐的,也有身在不同行业、对目标和生涯的焦虑感……总而言之,就是一个字:累。
这似乎已经成为我们这一代人的共同感受。
无论收入高低,无论工作是否满意,家庭是否和睦,似乎很少有人,能够逃脱生活的疲劳感。
它就像一只虫子,无孔不入,蚕食着我们的效率和幸福感。
我很喜欢一个比喻:生活就像一场抛接球的杂耍。这些球,有的叫做家庭,有的叫做工作,有的叫做事业,有的叫做健康……
你要做的,就是尽量让它们,不要落地。
这当然很不容易。一开始,你很容易手 ...
从 0 到 200 人团队,我的成长经历分享
原文地址:从 0 到 200 人团队,我的成长经历分享 转载
序前段时间,我写了一个《职业成长》的系列,文章发布后有很多人加了我微信,不少人在问:
你在 UC 是怎么走上管理这条路的?从自己一个人到带 200 多人的团队,中间是怎么走过来的?能不能分享一下你这 4 年的职业成长经历?
今天这篇文章,算是我的一个正式回答。
0 ~ 5 人:需求管理 & 文化雏形2013 年 5 月,我放弃了刚刚到手的晋升机会,从工作了 6 年的爱立信裸辞,以高级工程师的身份加入 UC 。
进入 UC 的第一个正式挑战,是团购导航产品。
接下来的一个月,我和另外一个小伙伴几乎没有一天是在晚上 11 点前下班的,好几次加班到凌晨 3 点,回家睡5、6个小时,早上起来匆匆吃完饭又继续上班。整个人就像打了鸡血一样。
可老天爷并没有因为我们不要命的加班,就眷顾我们。
项目上线后不到 2 个月,我就收到了『噩耗』:产品下线!连产品经理也静悄悄地离职了,那个时候我还在做着大卖的白日梦。
这个事情对我的打击是巨大的,我不甘心,千方百计询问原因,得到的答案是:产品需求分析没做好,很多地方没想清楚,数据很 ...
从这四点出发,不做 “ 空心 ” 程序员
原文地址:从这四点出发,不做 “ 空心 ” 程序员 转载
01 注重原理性知识现在的互联网环境下,注重原理性知识学习的程序员越来越少,特别是在这种培训机构大爆炸的环境下,在网上你会经常看到类似三个月从入门到精通高并发、分布式的广告,我相信培训机构有这套技术的能力,但是我不相信一个初学者有这么好的接收能力。甚至某个培训机构的讲师里,有一个1997年出生的架构师,20岁出头就当上了架构师,真的是后生可畏呀。在我的思维里,架构师不是学出来的,架构师是通过项目喂出来的。好了,我们还是言归正传吧。
为什么要注重原理型知识呢?因为原理性知识是我们的根,我列举了三个例子,对这个观点进行说明。
1、你懂设计模式,无论你是做系统架构设计还是阅读开源项目源码,你会发现,最终他们都绕不开设计模式。
2、你懂数据结构和算法,在高并发这种分秒必争、时间就是金钱的场景下,你知道List、Map 该如何取舍。
3、你懂网络通信的原理,在我们做系统架构、问题排除时都会有很大的帮助。
可以这么说,原理性知识决定了程序员的下限,原理性知识强的程序员,下限不会太低,相反,原理性知识不强的程序员,我相信上限也不会高到哪 ...
优秀工程师必备的一项技能,你解锁了吗?
原文地址:优秀工程师必备的一项技能,你解锁了吗? 转载
阿里妹导读:很多程序员在工作一段时间后会遇到迷茫期,虽有技术傍身,也难免会产生焦虑,反复思考怎样才能快速成长。关于如何提高自己的思考力,运用思考的力量推动能力提升,以此实现技术成长,阿里巴巴盒马产品技术部的岩动总结了一套思考方法,分享给每个正在成长的程序员。(本篇文章较长,阅读时间约30分钟,建议收藏后,找一个合适的时间慢慢品读哦)
引言我们来看一下几类在程序员成长、发展的常见问题,如果你或多或少存在一些,那么恭喜你,这篇文章值得你仔细往下看了:
你自认为付出了跟别人同样的努力,但是你的成长确实更慢一些,比如学得比别人慢,排查问题比别人慢,出方案老是有漏洞等等;
你觉得你只是在疲于应付需求,自己做的事情完全没有技术含量(很多人觉得自己做的业务开发就是没有技术含量,但我认为每个领域都有自己的技术含量,只是你有没有get到);
你发现总是在犯同样的错误,或者做的事情不断地在同一个水平循环;
每次要晋升的时候,你发现根本讲不出来(很多人会认为是表达能力问题,但是我认为不是);
当你换到一个新的领域,你发现自己的经验好像用不上 ...