0%

背景

工作中遇到一些类似责任链试的全链路测试场景,总是得临时写一些测试脚本,刚好觉得这种场景和「junit」的代码编写类似,于是考虑用「python」开发支持下

细节说明

主体代码

代码量很小,直接贴出来:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
import sys
import traceback
import time
import inspect
from functools import wraps

AUTO_TEST_PREFIX = "autotest"
SPLIT = "_"


def test(message=""):
def decorate(func):
@wraps(func)
def wrapper(*args, **kwargs):
print("-" * 80)
start = time.time()
print("start testing, api: %s" % func.__name__)
print("detail message: ", message)
print("=" * 20 + "body start" + "=" * 20)
res = func(*args, **kwargs)
print("=" * 20 + "body end" + "=" * 20)
print("run cost: %fs" % (time.time() - start))
return res

return wrapper

return decorate


def start(name):
mod = sys.modules[name]
if mod:
def func_filter(func):
return SPLIT in func.__name__ and func.__name__.startswith(AUTO_TEST_PREFIX)

def func_sort(func):
pairs = func.__name__.split(SPLIT)
if len(pairs) == 2:
return int(pairs[1])
return 0

funcs = inspect.getmembers(mod, inspect.isfunction)
funcs = [func[1] for func in funcs if func_filter(func[1])]
for func in sorted(funcs, key=func_sort):
try:
res = func()
if type(res) is bool:
if not res:
print("error: api %s run failed!" % func.__name__)
break
else:
print("info: api %s run success!" % func.__name__)
elif not res:
print("warn: api %s with no return, you may need to check." % func.__name__)
else:
print("info: api %s run with result:%s" % (func.__name__, str(res)))
except Exception:
traceback.print_exc()
break
finally:
print("\n\n")
阅读全文 »

缘起

最近的「github」访问速度奇慢,导致「blog」也受了很大影响,页面完全刷新居然要30+s!虽然博客只是我个人记录的地方,但这个访问速度着实影响心情,是时候得优化一下了…

分析

先开启「chrome」,分析加载慢的原因

  1. 图片慢,要20s,只是一张300k的头像+
  2. js慢,这个文件也比较多,不过大多都是几k而已
  3. 字体文件慢,一个75k的文件
阅读全文 »

前言

一直借口各种「忙」,突然想起来自己的犄角旮旯里还有个博客在吃灰,最近工作积累了不少存货,好记性不如烂笔头,就记在这里吧

博客迁移

由于博客的项目在电脑回收的时候一同丢失了,首先要把原来的文章先恢复下

  1. 确保之前的博客开启了「rss」
  2. hexo migrate rss <source> 进行迁移
阅读全文 »

开题

设定有如下需求:
现要从hbase中导出2016年整年的,大约10w只股票行情数据,数据总量约100t
导出成如下格式:

2016-01-01/facebook.txt linkedin.txt amazon.txt google.txt...
...
2016-12-31/facebook.txt linkedin.txt amazon.txt google.txt...
阅读全文 »

开题

大家都知道java使用自带的序列化的时候对象需要实现Serializable接口,然后根据你业务需求,决定是否要自定义readObjectwriteObject,其中其实会有一个类属性serialVersionUID,你可以不写,序列化后系统会给你生成好,在反序列化的时候比对校验,都建议说最好给每个序列化类配上一个固定的,那么如果没配呢?

阅读全文 »

背景

c++正在开发一个二方包,其中依赖了thrift,但是thrift又依赖了boost,libevent,这对于用户来说是不可接受的,所以那只能自己将网络及协议部分实现一下,本片仅分析协议部分。

flume thrift协议描述文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
namespace java org.apache.flume.thrift
struct ThriftFlumeEvent {
1: required map <string, string> headers,
2: required binary body,
}
enum Status {
OK,
FAILED,
ERROR,
UNKNOWN
}
service ThriftSourceProtocol {
Status append(1: ThriftFlumeEvent event),
Status appendBatch(1: list<ThriftFlumeEvent> events),
}
阅读全文 »

工作中由于临时有个数据库数据同步的需求,上海+深圳同步,更多的是保证数据一致,tps和qps都很低。于是简单配置一个主从同步是一个稳妥的方案

配置步骤

  1. 修改my.cnf,一定要开启binlog
  2. master配置同步账号
  3. master调用show master status \G命令,记录binlog及position
  4. slave设置读取master的binlog及position,start slave,通过调用show slave status \G,观察配置结果
阅读全文 »

开题

很多情况下会要求事务的特性支持,比如数据库操作,比如消息处理
好在代码上如果需要处理事物的话其实还比较简单

代码

提取接口

事务常见的用法即:begin,commit,rollback,close,那么就提取这样的接口出来:

1
2
3
4
5
6
7
8
9
public interface Transaction {
void begin();
void commit();
void rollback();
void close();
}
阅读全文 »

引子

不知不觉已经工作3年多,看看刚校招进来的94小鲜肉,不禁感叹:自己真的老了
在工作的这些日子,自己经历了好几种状态,简单来说有以下几种

状态统计

学习阶段

刚进入一个新的环境,对于一切都感到很好奇,无论给了你什么任务你都心甘情愿的接收并且干的津津有味,虽然这很可能是别人一点都不愿意干的活儿,但对于自己而言,无疑是收获满满的。
毫无疑问,这是新环境的学习阶段,这个阶段往往是最累的,但恰恰是你收回最快的阶段,如果熬过去,你会发现你真的学到了很多东西。

阅读全文 »

开题

工作中遇到了一种场景,需要使用多语言版本客户端,而其中java的版本使用到了flume的二方包,考虑到其他语言开发的便捷性,准备移除flume二方包依赖

改造

其实很多场景下使用flume二方包仅仅是为了连接flume并且往里面灌点数据,没有太多复杂的用法,那么需要解决的核心问题就是通信了。

要支持多语言,有很多方案可以选择:jsonxmlprotobufthrift等。考虑到性能及易用,这里使用的是thrift

阅读全文 »