最新

平滑重启

限制并发量

源码 今天调试了一下golang编译工具,发现了一个很有"奇怪"的地方 简化问题 假设有1000个任务,1000个并发协程,设置n(cpu核数)个物理处理器(task)并发完成,每个协程只要完成了当前任务采取完成下一个 代码 原始代码,go作者无所畏惧的使用协程 func parseFiles(filenames []string) uint { var noders []*noder // Limit the number of simultaneously open files. sem := make(chan struct{}, runtime.GOMAXPROCS(0)+10) for _, filename := range filenames { go func(filename string)

By chainhelen
巴厘岛旅游

巴厘岛旅游

饮食 当地的大部分油炸(包括炒饭、炒菜)都有一种当地特色的油味道,我一般是吃不惯 当地特色餐,脏鸭餐、猪排饭 都是可以尝尝的 小费 通常房间打扫 需要放 10000 卢比(约5元人民币) 大部分本土人都比较nice(宗教信仰比较多),隔壁岛的一些人不是很友好(可能会发生排华) 出行 最好是包车,当地出租车比较贵,公交车很难排到,本土人大部分都是各家都有自己的摩托车 所以当地都是盛行摩的,没有红绿灯,没有交警,过马路需要很小心 最好不要租摩的,警察会抓罚款 不建议一人独自来度假,最好成群结伴 语言沟通 大部分本地人都会一些英文、中文,实在不行可以用google翻译 货币 稍微正规、规模稍大的超市、餐厅都是支持支付宝、微信 3%的华人占据40%的经济 可以玩的点 太多了,自己去查,大多都是景点拍照,懒得讲细节;

By chainhelen
nsq 支持分布式事务

go

nsq 支持分布式事务

原意 对于微服务架构来说,当数据垂直拆分到各个服务之后,通常通过调用接口的方式(或者异步消息)来保证数据一致性,但是如果出现被调用服务暂时性宕机(或者非平滑发布),那么两边数据就不一致了。 ps : 我认为还有一种情况,由于互联网人员流动性比较高,许多非核心业务中转好几个产品经理手,最后在新业务与旧业务联动的时候,会有遗漏一些业务异常情况,我暂时称之为"数据联动性",目前我除了规范业务流程,没有更好的方案;而本文所要解决的场景,称之为"分布式事务一致性" dt协议 对于A、B两个服务之间某个请求有分布式事务关联,使用如下方式,将分布式事务转化成单表事务 其中 send preapred 和 A服务的单表sql 顺序是可以随意的 实现这里需要修改一下nsq的代码,每一个client连接到nsqd都需要做一个协商(IDENTIFY)协议的版本号,通过magic字段来协商,目前nsq支持的是 V1和V2两个版本 所以我们需要添加一个文件protocol_dt.go,里面的内容主要是照搬protocol_v2.go,

By chainhelen

吐槽

流程规范 我认为流程规范是为了将不同程度技能点的人员拉到统一水平线上,以此来控制项目进度中人力工作量的风险。好处是将次等人(不针对人,只针对某方面业务能力)提升到普通水平线,坏处是限制了优等人(不针对人,只针对某方面业务能力)发挥空间。所以在一些特殊需求场景(非规范流程)下,会延申出双标。而对于双标来说,好处是极大提升了团队的工作效率,坏处是容易造成不务实之风、资源分配不均匀、关系处理不当容易造成崩盘等现象。 双标人群 如何区别心中的双标人群。我认为最直接有效的手段是,工作中初次合作,利用压迫式方式令对方产生负面情绪,直接刺探心理,重点反映出来的是心理承受能力、高压处理能力、逻辑思维能力。依据这三部分区分双标人群。 手段 那么什么是最佳手段,目前我也不清楚最佳方式是什么。很多管理者采取手段是掩藏,几乎隐藏了一切情绪。对于这些管理者,给我直观感受的是一种深不可测(我认为越聪明的打工者越能感觉到恐惧感),工作用战战兢兢、如履薄冰等词形容也不为过。你可能永远也不知道什么时候踩到TL的心理底线,所谓伴君入伴虎大概如此吧。 我认为双标方式的最高明方式并不是掩藏,而是故意卖

By chainhelen
tracing

tracing

tracing

tracing方案 我们基本方案,是基于service mesh (envoy打脸最终并没有) 和 jaeger 来实现的 环境安装 关于jaeger的搭建,主要参考官方文档 jaeger-k8s 来的 ,其中注意关于 五个组件的区分 端口号协议组件功能 5775UDPagent通过thrift的compact协议接收zipkin.thrift数据6831UDPagent通过thrift的compact协议接收jaeger.thrift数据6832UDPagent通过thrift的二进制协议接收jaeger.thrift数据5778HTTPagent用于配置接口16686HTTPquery用于UI界面14268HTTPcollector直接接受客户端直连的jaeger.thrift14250HTTPcollector接受model.proto9411HTTPcollector兼容zipkin的http端点   其中 agent 和 collector 是放在 公用服务的k8s环境里面的(a01),而 jaeger web ui 是可以放在管理环境(a

By chainhelen

mysql 踩坑记录

数字、字符串 如果mysql 里面 有数字字符串 的字段(并且该字段是索引),客户端不要直接传数字,一定要加引号 这个也就是为什么orm库喜欢在格式化时候,默认加上` 索引 索引的问题非常多,通常出现的慢查询都是由于查询语句命中索引不正确导致的 甚至表中的数据量都会影响mysql命中索引的规则 组合索引 组合索引是最左建立多个索引 in会命中索引,not in 会导致索引失效 排序最好主要范围语句会导致组合索引后续的索引失效(主要是 > < 等) 索引最终还是会回归到主键上,所以如果没有分区的情况下,是按照主键顺序返回的(InnoDB),这样基本也是利用来排序的 count 当然count要命中索引,这个不用说,剩余的就是 count(1) 不需要读太多数据,count(*)则不行 而count(column) 是需要筛选出不为 NULL 的字段 想到其他再更新

By chainhelen

旧服务优化思路

高可用 讲互联网的技术,不能不说高可用; 从某些书上面写的,主要通过“冗余+自动故障转”来实现的; 对于以下分层,每一层上面都使用上面两种方式: (1)【客户端层】到【反向代理层】 (2)【反向代理层】到【站点层】 (3)【站点层】到【服务层】 (4)【服务层】到【缓存层】 (5)【服务层】到【数据库读】 (6)【服务层】到【数据库写】 具体事例 记录一下具体实际工作中遇到一些烂项目,如何让它有基础的保障 下面的事例中主要是服务层、缓存层、数据库,其中几处分类是有一定的重叠的 1. 监控 服务本身除了提供基本的 api 延迟、qps、状态码统计,还需要加上对于依赖的监控 主要核心的监控数据包含以下

By chainhelen

dlv

dlv 源码阅读

一. 目录介绍 1._fixtures 这个文件夹下面主要放一些用于测试的应用程序源码 2.assets 存放了4个代表delve的图标 3.cmd 这个是server/client的命令行入口 主要从commands.go这个文件体现,主要使用spf13/cobra来做命令行工具(相信喜欢使用vim的人都应该听过spf13) 主要命令有debug、trace、attach等,但是这些命令核心都是在使用gobuild、execute,所以基本看这两个函数即可 gobuild 主要是对需要调试源码的进行编译 execute 主要是对已经编译好的二进制进行运行、attach,用于调试(已经运行的进程,就直接attach) 4.Documentation 主要放dlv的文档,另外关于cmd的文档都是通过script/gen-usage-docs.go生成的 就是说大部分都是cmd目录的help注释 5.service service入口是/service/rpccommon/server.go,主要是由cmd来调用server的Run()、Close(

By chainhelen