beanstalkd 源码剖析

beanstalkd是一个使用还算广泛的开源消息队列,由c语言编写。因为本身功能简单,代码也不多,所以阅读可以帮助我快速复习一下网络编程,并且麻雀虽小,五脏俱全,一个c语言项目的方方面面它也都包含了。 ---入口 万事先从main函数开始: int main(int argc, char **argv) { //用来存储服务端生成的socket的fd int r; //job的链表 struct job list = {}; //程序名字 progname = argv[0]; //设置为行buffer模式,具体参见man手册,遇到换行即发送到目标 setlinebuf(stdout); //解析输入参数

中间件与责任链模式

前段时间前同事找我看了这么一段代码: (new Pipeline($this->container)) ->send($passable) ->through($middleware) ->then($destination); 是laravel框架里看起来很直观的一段调用逻辑,把container注入到Pipeline对象,然后将passable(其实一般是$request对象)发送通过一连串的中间件,最后到达目的地(最终的processHandler之类的函数)。 看起来很不错是不是,再看看laravel内部的实现,代码在Illuminate\Pipeline下: class Pipeline implements PipelineContract { protected $container; /** * The

Elasticsearch环境搭建和river数据导入(四)

其实有了那篇服务开发总结,这篇看起来没什么必要了,不过作为纯技术的总结还是发出来吧。 在前几篇中说到了es的jdbc工具,这个工具确实挺好,可以满足一些不想要开发量的小公司的要求。 但从我们使用的过程中也看出了这个工具的一些缺陷: 1.方案强依赖于数据库表的时间戳。 不靠谱,你不能要求你的业务RD或者老的遗留系统能够满足你的这些规范方面的要求(刚从dc出来的时候感觉很多规范方面的事情是应该做的,但根据工作经历来看,设计技术方案最好还是要考虑到最坏的情况)。 2.这个工具每一个脚本只能执行一条sql语句。 这是一个比较重大的缺陷,因为工具本身是java写的,这就意味着每个脚本都是在独立的jvm里跑。而jvm,你懂的。基本一台64GB的机器跑个七八个脚本,再加上es本身,内存就快要爆掉了。而实际上这件事情本身不应该需要这么大的硬件成本。 3.读写分离问题导致的数据延迟问题。 这条其实是1衍生出来的,同样考虑最坏的情况,主从延迟如果到了一定程度,那么在脚本运行期间内会导致时间戳前进之后,有旧数据入到从库。那么脚本的逻辑就会产生数据丢失。

elasticsearch服务开发总结

前几天在公司做了一次分享,其实是类似于工作汇报的东西。。。顺便记了一些东西,整理一下吧: 这个服务完成了的事情 1).独立的es集群 目前线上正在运行的版本是1.7.3 三台机器,总数据量大概在100G左右(算上分片的冗余) 集群上安装有head、bigdesk、ik分词器等插件 存在的问题: es版本其实已经有点老了。。官方在2.1和2.2又加入了一些新特性,这些特性在老版本里我们享受不到,当然现在的接入功能也比较简单,也不一定用得到。但不升级自然就享受不到官方版本升级带来的红利:新功能,新bug 2).在es之前封装了一层web服务 用golang的web框架gin > https://github.com/

一致性哈希-虚拟结点生成

在上次的一致性哈希讲解中,提到了虚拟结点的生成算法。说得不怎么明白,本文将会对常用的两种虚拟结点生成算法进行一些简单的解析。 我们以Google的groupcache和经典应用memcached来做例子进行说明。 首先是groupcache,在groupcache中生成虚拟结点的算法代码如下: func (m *Map) Add(keys ...string) { for _, key := range keys { for i := 0; i < m.replicas; i++ { hash := int(m.hash([]byte(strconv.Itoa(i) + key)