
源码分析-Beanstalkd研究
研究Beanstalkd的原理,源码实现,使用和使用问题解决。
一 铭
公众号:大数据架构师修行之路
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Beanstalkd源码分析—事件超时的处理
概述在多路复用的网络编程中,比如select,epoll,poll等,往往会等待一定的时间,来允许读,写,异常的事件发生。当超时还没有事件发生时,会完成一定的处理任务。而超时处理的任务也非常重要。 本文介绍beanstalkd的超时处理部分的实现原理。进入超时处理在beanstalkd中,事件超时的处理在prottick函数中完成。前面的文章分析过命令处理流程,我们再来看一下事件...原创 2018-09-02 14:14:14 · 674 阅读 · 0 评论 -
Beanstalkd架构设计优缺点分析
概述本文从系统设计角度分析beanstalkd的优缺点,对beanstalkd的设计进行总结。优点的总结beanstalkd是基于内存的任务队列,性能较高。每个job有多种状态,状态之间可以相互转换。这些状态为job的使用者提供了使用的方便。在网络事件驱动方面,使用异步,高效的epoll作为事件驱动框架,但使用的是单线程模式。类似于数据库,beanstalkd把job保存在t...原创 2018-09-02 14:16:01 · 1966 阅读 · 0 评论 -
Beanstalkd源码分析—peek命令的实现
概述本文描述了beanstalkd中peek命令的实现原理。peek命令的说明该命令让client在系统中检查job,若存在则返回该job结构体,否则返回NOT_FOUND。 有四种形式的命令,其中第一种形式的指令是针对当前使用的tube格式。peek <id>\r\n 返回id对应的jobpeek-ready\r\n 返回下一个ready jobpee...原创 2018-08-31 06:14:18 · 747 阅读 · 0 评论 -
Beanstalkd源码分析—delete命令的实现
概述本文讲述delete命令的实现原理。delete命令介绍delete命令是:从队列中删除一个job。其命令格式如下:delete <id>\r\nid:为job id 响应 DELETED\r\n 删除成功 NOT_FOUND\r\n job不存在时,或者job的状态不为ready和buried(这种情况是在job执行超时之前,client发送...原创 2018-08-31 22:12:14 · 606 阅读 · 0 评论 -
Beanstalkd源码分析—release命令的实现
概述本文分析了beanstalkd的release命令的实现原理。release命令的说明功能说明release命令将一个reserved的job放回ready堆中。它通常在job执行失败时使用。命令行说明release <id> <pri> <delay>\r\nid:为job idpri:为job的优先级de...原创 2018-08-29 10:29:19 · 649 阅读 · 0 评论 -
Beanstalkd源码分析—touch命令的实现
概述本文讲述beanstalkd touch命令的实现原理。touch命令说明该命令允许消费者(worker)请求更多的时间执行job,当需要预留更多的时间来执行该jog是,该命令很有用。消费者(worker)可用周期的告诉服务器它仍然在执行job。touch命令的格式如下:touch <id>\r\n参数说明 id:为job id 响应 T...原创 2018-08-29 13:02:39 · 455 阅读 · 0 评论 -
Beanstalkd源码分析—bury和kick命令的实现
概述本文分析了beanstalkd的bury命令和kick命令的实现原理。bury和kick指令原理bury和kick是一组相反操作的指令。当我们暂时不想再关注一个job时,可以把它bury掉。这样任何人就无法订阅(reserve)到该job了。直到有人发送了kick指令,此时该job又回到了READY状态,可以被订阅。bury和kick指令的格式bury指令说...原创 2018-08-26 10:26:58 · 841 阅读 · 0 评论 -
Beanstalkd源码分析—reserve命令实现
概述本文分析了beanstalkd的reserve命令的实现原理。 reserve命令是由消费者发起的命令,消费者通过该命令来获取tube中的job。消费者也可以为该命令设置超时时间。实现原理分析reserve命令是由消费者端发起的,该指令会从使用的tube的ready堆中取出一个job,返回给消费者。若没有准备好的job,消费者会阻塞,直到有准备好的job为止。 reserv...原创 2018-08-23 19:39:44 · 910 阅读 · 0 评论 -
Beanstalk源码分析--数据结构设计
概述beanstalk是多年前使用过的一个分布式任务队列,通过C实现,十分高效。和Redis(默认)的事件驱动框架一样,都是通过异步的epoll来实现,所以,能够高效的处理大量请求。 但不知什么原因,作者几年前已经不再维护其代码了。但我发现国内还是有一些人在使用该软件,为了能够更好的理解其运行机制,几年前对其代码进行了一些研究。先把分析的几篇发出来。 另外,我对其代码进行了fork,若有问...原创 2018-07-31 07:17:51 · 823 阅读 · 1 评论 -
Beanstalkd源码分析—watch命令的实现
概述本文描述了beanstalkd中的watch命令的作用和实现原理。watch命令说明在beanstalkd中,watch命令影响的是reserve操作。我们可以用watch命令来添加一个被监控的tube,通过ingore来取消watch的tube。 watch的tube可以是多个,每watch一个就会添加到watch队列中,只要其中有一个tube有数据,reserve就会返回...原创 2018-08-22 13:09:22 · 696 阅读 · 0 评论 -
Beanstalkd源码分析--use命令的实现
概述本文讲述了beanstalkd中use命令和list_used命令的实现原理。分析了保存tube的存储结构,和查询tube时的具体操作。并分析了这样实现的优缺点。引子前面已经讲解过命令的处理流程,本章直接进入use命令的实现部分。 就像数据库,在使用时需要先选择一个数据库的名字。在beanstalkd中也需要指定一个tube的名字。具体的指定操作是通过use命令来实现的。要注...原创 2018-08-21 14:50:41 · 477 阅读 · 0 评论 -
Beanstalk源码分析--系统初始化
概述本文接上文,继续分析和探讨beanstalk的实现原理。本文对beanstalk的启动过程做一个分析,这样可以对其运行框架有一个总体上的把握。 beanstalkd是使用epoll作为事件处理框架,为什么epoll如此高效,可以参考我以前写的一篇对其实现代码分析的文章。源码分析软件入口beanstalkd的初始化流程代码非常简洁。主要完成各种数据结构的初始化,创建服务器监听s...原创 2018-07-31 07:28:04 · 466 阅读 · 0 评论 -
beanstalkd源码分析--事件处理机制
概述本文接着讲述beanstalkd的事件处理机制,这其实也是大多数服务器要实现的步骤。我们且看beanstalkd是如何实现的。源码分析接受客户端连接在主服务函数:void srvserve(Server *s)中初始化时,会把sock.f设置成srvaccept。 该函数主要是用来接受来自客户端的连接请求。voidsrvserve(Server *s){ ...原创 2018-07-31 07:37:04 · 459 阅读 · 0 评论 -
beanstalkd源码分析--命令处理流程
概述本文讲述了beanstalk的命令处理流程。处理客户端连接请求前面已经讲过,当服务启动时会把处理函数设置成srvaccept,用来建立客户端的tcp连接请求。voidsrvserve(Server *s) { ... // 设置处理函数 s->sock.f = (Handle)srvaccept; ... // 进入死循环...原创 2018-08-02 14:12:46 · 343 阅读 · 0 评论 -
Beanstalkd介绍
概述本文介绍了Beanstalkd的功能和状态转换过程。 Philotic公司开发了beanstalkd,以改善Facebook应用程序的响应时间(超过950万用户)。Beanstalkd将最常见页面的平均响应时间缩短到原来的一小部分,从而显着改善了用户体验。 说明:本文使用的beanstalkd客户端是:python语言实现的beanstalkc。基本原理beanstalkd是一...原创 2018-08-19 09:13:25 · 771 阅读 · 0 评论 -
Beanstalkd源码分析—Put命令的实现
概述本文介绍了put命令的实现原理和并对源码进行了分析。Put命令的实现原理put命令是由生产者执行,该命令把新的任务添加到beanstalkd中。但不添加过期时间或生效延迟时间时,该job的状态是READY。处于该状态的job,消费者可以通过reserve()进行订阅和消费。 put命令的主要实现逻辑如下(这里说的是一般put命令的实现逻辑): (1) 创建一个Job实体,初...原创 2018-08-19 19:03:39 · 665 阅读 · 0 评论