免费的编程中文书籍索引
很久以前整理的,一直在更新。
github地址: https://github.com/justjavac/free-programming-books-zh_CN
目录
来源:http://www.v2ex.com/t/143671
我在github上fork了一个分支:https://github.com/raywill/free-programming-books-zh_CN
很久以前整理的,一直在更新。
github地址: https://github.com/justjavac/free-programming-books-zh_CN
来源:http://www.v2ex.com/t/143671
我在github上fork了一个分支:https://github.com/raywill/free-programming-books-zh_CN
在OceanBase0.5开源版本中,RPC其实是有一个层次的。自底向上,分别是:
Network Framework — libeasy,负责底层网络框架,packet级别
Client Manager — 负责跟libeasy交互,封装了回调逻辑、异步/同步逻辑
Rpc Stub — 封装了请求的序列化、反序列化逻辑,是应用代码与网络代码的粘合剂
应用代码直接使用Rpc Stub来使用网络最方便,跟调用本地函数区别不大。不需要关心序列化、反序列化过程中的内存问题。但是,应用层如果希望获得一些更为复杂的网络交互逻辑时Rpc Stub则不能提供。比如,希望在A函数post一个请求,然后希望在B函数里wait这个请求的返回值,rpc stub无能为力。
应用代码也可以直接用Client Manager,可以获得很大的灵活性。上一个例子中Rpc Stub搞不定的情况,Client Manager可以搞定。但是直接使用Client Manager会增加一些代码复杂度,例如:需要自己分配DataBuffer,如果追求高性能,还需要自己管理Thread Specific Buffer。
当业务逻辑的对网络需求的复杂度超过Client Manager能力范围时,可以直接用libeasy来解决问题。这是终极方案。在0.5中的SQL模块里用到了该方法,但使用经验证明这种方法可维护性很差,必须对其进行一定的封装。
思考是技术进步的阶梯
A向B机器发送一个plan执行的时候,随着plan本身还需要发送哪些结构?
分析:
OB0.5开源版中发送了SimpleScanParam,但这个参数并不是单独发送的,而是包装在了一个ObHuskTabletScan运算符中,在CS端根据运算符中的参数重新构造子Plan。
答案:
只需要发送plan本身即可。其余要发送的内容都应该封装到operator内部。
进一步发问:
operator内部要封装什么呢?
答案:
比如,读数据超时时间。在运行时用户可以通过命令修改读超时时间,需要将新的时间让plan知晓,以便序列化到B端。
再比如,读数据的版本号。随着时间流逝plan被反复执行,plan需要携带的版本号应该要随时间变化。
这些内容的变化,都应该封装到operator内部。具体做法可以是设置一个IParamProvider()给operator,operator可以随时通过IParamProvider获得最新的数据。IParamProvider的实现比较简单,它持有整个SQL Plan运行时环境的引用,可以随时从中获得最新的参数提供给operator。这个细节不需要scheduler关心。
结论:
最近在做OceanBase RootServer重构后的测试,主要测试工具是用我们牛逼QA开发出的obtest神器。
测试结果总是不太稳定,各种细节错误且不完全复现,很耗人。导致积极性下降。
调整策略:测试期间给自己安排一些优化/重构的活儿,穿插着做事情。
写了两年半的OceanBase,知识体系却依然没有完善,思考原因:缺乏实践。OceanBase中大家都是螺丝钉,各自负责一亩三分地,别人地里种了什么虽然能看个大致,比如施的什么肥,打的什么桩,搭的什么架子,种的哪种秧,但若问为何是这种肥,怎么非得打个桩,架子斜着搭,却又种南瓜秧,则是问着我了。知其然,不知其所以然,是学习OceanBase的最大的难题。
企图从分析源码的角度来体会作者意图的方式失败了。总是不得要领,收益甚浅。
还是祭出老办法:好记性不如烂笔头。动手写码,写一个简单一些的NoSQL系统出来。俗话说,麻雀虽小五脏俱全,只要这个系统能完整做下来,一定会受益甚丰。
于是,MacrayKV诞生。取这个名字是因为这个项目带上了Macduan学弟一起做,我的id是Raywill,俩名字一凑,macray,读起来还蛮上口的。KV则表示key-value存储的意思。就这样了。
没多少天就发现,自主做事最精彩!创新的激情在自主做事的情况下能得到最大激发。比如今天:
基于tcmalloc写了一个线程安全的全局内存分配器,写完之后必须测试一下。为了测试线程安全的特性,必须使用多线程编程。淘宝多隆写的tbsys系统库提供了比较好的多线程封装,用起来已经比较方便了,但在测试代码中多处用多线程时则会发现有大量的冗余代码。每一个需要并发的代码片段都需要创建一个类和一个回调方法,把并发的代码填在回调方法里面。这么做有两个坏处:(1)打乱了测试代码的连贯性。 (2)代码冗余不易维护。(3)还得记忆多线程封装库的用法,我记性太差,每次都要查。
今天早上突发奇想,能不能有一种类似intel #progrm parallel这样的directive呢?这种想法很大程度上是受了前不久coolshell上《数据即代码:元驱动编程》这篇文章的影响。摸索了三十分钟,一个C++的宏方案出台,相当好用:
TEST_F(ObTCFactoryTest, mt_basic_test)
{
// 第一次并发测试
BEGIN_THREAD_CODE(my_run, 50)
{
for (int i = 0; i < 1000000; ++i)
{
Base *b1 = base_tc_factory_t::get_instance()->get(0);
ASSERT_TRUE(NULL != b1);
}
base_tc_factory_t::get_instance()->stat();
} END_THREAD_CODE(my_run);
// 一些同步测试代码
// put your code here
// 第二次并发测试
BEGIN_THREAD_CODE(my_run2, 50)
{
for (int i = 0; i < 1000000; ++i)
{
Base *b1 = base_tc_factory_t::get_instance()->get(0);
ASSERT_TRUE(NULL != b1);
}
base_tc_factory_t::get_instance()->stat();
} END_THREAD_CODE(my_run2);
}
其实现也是极简的:
#define BEGIN_THREAD_CODE(class_name, thread_count) \ class _##class_name : public tbsys::CDefaultRunnable \ { \ public: \ _##class_name() { _threadCount = thread_count; } \ void run(tbsys::CThread *thread, void *arg) { \ UNUSED(thread); UNUSED(arg); \ #define END_THREAD_CODE(class_name) \ }};\ _##class_name my_##class_name; \ my_##class_name.start(); my_##class_name.wait();
然后,我就把这个方案移植到了OceanBase,得到了@郁白 的大力赞扬。OceanBase UpdateServer模块的单元测试对于并发测试的需求非常旺盛,希望以后能在代码中处处看到它的使用。
希望自己坚持下去,马上做,做精彩。
在TMT沙龙邮件组上无意看到一个叫做“多贝”的网络课堂,为所有人提供了一个在线的学习交流环境。一直和Jasimin说要试水一下在线教育,何不参与一把呢?正好YangJie同学希望学习OceanBase的编码规范,不如我就在这里开一次在线课程吧。跟YangJie说了一下,他十分乐意,那就干吧!
开课时间最初定在8点,因为下班迟了,改成了8:20。
8:20开课,YangJie同学还给我另喊了一个学员过来。一堂只有2个学生的课开始了。
说一下对这个平台的感受。
缺点:
1. 讲起来很不习惯,因为没有交互,我只对着一个白板说呀说呀。感觉像是给空气讲课。
2. 平台对pdf的支持很不好,字太小了。
3. 旁边的聊天窗口太简单了,对于编程授课,希望加入一个实时代码同步编辑窗口(还记得google wave吗?),有利于同步演示。
优点:
1. 课件展示的同步功能很赞
2. 画笔功能很赞
个人/产品可以改进的点:
1. 习惯对着白板讲课
2. 素材要准备好
3. 当一次听众,感受一下
4. 讲课的过程也是录制的过程,就好了