并发编程小结

并发编程

1.线程安全容器

1.1 同步容器类:使用synchronized

1.1.1 vector

  • Fail-Fast机制在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
  • 对比ArrayList
    • ArrayList不可以设置扩展的容量,默认1.5倍
    • Vector可以设置扩展的容量,如果没有设置,默认2倍
    • ArrayList的无参构造方法中初始容量为0(初次调用add()会更新为10)
    • Vector的无参构造方法中初始容量为10
    • Vector线程安全
    • ArrayList线程不安全()

1.1.2 hashtable

实现原理:使用一个数组来存储多个单链表,index=(hash & 0x7FFFFFFF) % tab.length , hashMap (h ...

ellasticsearch使用

Elasticsearch 使用总结

背景:使用容器平台,看日志不方便.使用logstash 收集所有日志 elasticsearch作为搜索引擎.在云平台中可以归集所有应用的日志。研究不够深入随着日志量打不断增大,查询日志出现大量超时时间,另外不希望看日志的人员随意操作云平台的其他功能,需要做严格的权限控制.

  • 首先最紧要的问题,查询超时问题.在了解了整个日志系统的运行流程后,发现平台使用的是logstash默认打建索引规则,即按照日期,每天一个索引: logstash-2017.01.02 由于平台有几十个运行的应用,一天的日志量为30G,全部放在一个索引里,固然搜索速度会很慢.所以从创建索引入手解决 查询超时问题是一个好的切入点.
  • 第二,需要有严格的权限控制,或者是说查询日志的人员就不应该进入到云平台的管理界面.在elasticsearch官网了解到,kibana就是一个很好的解决方案。它只是用于日志查询 且有权限控制,用户体系,安全插件,滚动日志插件等.

整个系统的架构依然是最为流行的 shipper--> redis --> indexer --> elasticsearch 这种架构.即 由logstash(后期用filebeats替代)在各个宿主机收集日志缓存到redis里,由indexer读取redis数据并解析处理再存储到elasticsearch里。

系统结构

1.换行问题

...

程序员科学上网

一个程序员的科学上网之路

这里做一个自己常用镜像汇总,免得到时候换环境时又要导出搜索.作为一个新程序员还是到处要特别感谢aliyun提供各自各种镜像.

1.一个稳定的hosts发布github

一个稳定的hosts发布github

2.docker MIRROR

这里需要登录aliyun console获取自己的镜像地址,然后修改/etc/docker/daemon.json

{ "registry-mirrors":["https://zi3aaitc.mirror.aliyuncs.com","http://31623a4b.m.daocloud.io"] }

3.maven mirror

修改 $MAVEN_HOME/conf/settings.xml

<mirror> <id>nexus-aliyun</id> <mirrorOf>*</mirrorOf> <name>Nexus aliyun</name> <url>http://maven.aliyun.com/nexus/content/groups/public</url> ...

    

kubernetes-controller源码分析

kubernetes-controller源码分析

controller比起scheduler来更容易理解,最为关键的2个模式,infomer/workqueue.controller拆分成了 多个组件(daemon/endpoint....等)的controller.这样的controller设计的模式都类似,都是利用前面 提到的informer模式监控收集相关数据,然后放入到一个缓存队列中去,然后再循环出队一个个处理这些缓存数据 处理出错的会再次入队列(这时入队时会采用令牌桶算法控制速率,延迟入队的做法).整体架构和主要模式知道后 接下来需要关注的就是具体的实现

1.informer

和之前的一样,监听一系列信息的变化,将信息存入limitrateworkqueue中

2.limitrateworkqueue

监听到变化的信息直接存入queue缓存中,controller处理失败后采用延迟入queue的方式缓存 延迟缓存依据令牌算法处理,默认使用的是10qps,100tikect 令牌算法

关键类图结构

3.具体的业务处理

3.1 certificates

3.2 daemon

...

golang调用hbase自定义coprocessor客户端实现

最近在使用golang改造,java操作hbase项目时,用到开源项目github.com/tsuna/gohbase,但是该项目没有调用自定义coprocessor的功能,只能自己扩展源码实现这个功能.这里贴出扩展代码,希望可以帮助到有同样需求的同学.

# 实现过程

从代码实现的角度来看可以把coprocessor理解为加强版的scan - 整体来说在做扩展的时候完全可以沿用scan的实现方式 - 通过.proto 文件来看与和scan不同的是,scan的request,response都是已经定义好的,而coprocessor的request,response都是一个[]byte数组 通过以上2点来确定总的实现思路,具体实现还需要深入代码去实现,不仅要理解github.com/tsuna/gohbase的实现:如何包装proto数据包,scan如何实现所有regionserver的数据遍历,也要理解java版的hbase-client,coprocessor数据包methodName是什么,[]byte数据如何组装,如何解码

# 实现源码

I have extended the source code so that it is easy to request ...

kubernetes scheduler源码阅读

scheduler

k8s 的分配器,给pod分配node.主要目的是通过阅读源码了解pod的分配"规则"/"优先级",以及如何自己定制 的开发自己的"规则"/"优先级";理解其运行原理及数据流;以及类之间的关系理解其设计,学习其架构 .阅读时有几个关键点 controller模式/podQueue,schedulerCache作用/pod状态变化 (init/assumed/add) /"规则","优先级".

1.程序主流程

1.1.入口

程序入口在plugin/cmd的scheduler.go,进入run方法后会有如下代码,

 //创建k8s客户端 kubecli, err := createClient(s) if err != nil { return fmt.Errorf("unable to create kube ...