Beanstalkd 的理解

Beanstalkd 是一个轻量级的内存型队列,利用了和Memcache 类似的协议。其官网beanstakkd官网 下方的感谢语说:

Many thanks to memcached for providing inspiration for simple protocol design and for the structure of the documentation. Not to mention a fantastic piece of software!

对于其底层协议感兴趣的可以去github上看,介绍的很清楚。本文只对beanstalkd 的应用提供思路上的阐释,不列举具体的代码。直到beanstalkd 能够干什么,才能够再实践中去应用。但是怎么用beanstalkd 干活解决问题,则要去网上看beanstalkd 的API,每种语言的都有,可以各取所需。

Beanstalkd 的意思是魔豆,他的队列管理器叫做tube。一般的队列都是先进先出,适合N:M 的生产者消费者处理模型。想象一下如下的模型:我们的业务中经常需要适应高并发的场景,当1万个用户同时访问某个接口时,为了响应服务,我们需要尽可能的加速接口的响应效率。有时候我们只负责提交任务,而不关注任务是否处理成功或者失败。这时候使用过程化的思路解决问题,就会受到牵制。假若盲目的增加机器,压榨mysql的性能,还是不能阻挡十万、百万并发。这时候可以考虑使用异步去处理,接口收到请求之后,立刻将任务放进队列里,新启一台脚本机,起若干进程来消费任务。

为什么要使用Beanstalkd

实际业务中,有时候会出现队列与队列之间相互依赖的情况。比如A,B两个队列。A负责往数据库中insert数据,而B队列负责update数据。只有插入数据库后,我们才能进行update。但是如果同时开两个队列。因为队列执行的先后是不可控的,这就造成了B update的时候,不知道A是否已经insert。另外比如Reids的队列机制,一但消费者从队列中取出了一个job。但是由于神奇的原因,失败掉了,怎么办?任务就这样丢失了,这个任务再也处理不掉了。

带着这些问题,我们交给BeansTalkd来解决。

理解Beanstalkd的队列机制

Beanstalkd 是CS结构,有Server端和Client段之分。Server端都是一样的,负责存储和消费队列任务。但是Client端由于各种语言各种框架,就各部相同。

任务在队里之中被称作Job. 一个Job 再Beanstalkd中有以下的生命周期:

  1. put:将一个任务放置进tube中
  2. deayed: 这个任务现在再等待中,需要若干秒才能准备完毕【延迟队列】
  3. ready: 这个任务已经准备好了,可以消费了。所有的消费都是要从取ready状态的job
  4. reserved: 这个任务已经被消费者消费。
  5. release: 这个job执行失败了,把它放进ready状态队列中。让其他队列执行。
  6. bury:这个job执行失败了,但不希望其他队列执行,先把它埋起来。

这是一个job生命周期的主要状态,如果有讲的不全的,可以去翻看API.

各种语言的演示代码都大同小异,这里就不浪费纸张了。

Beanstalkd 的理解的更多相关文章

  1. beanstalkd 消息队列

    概况:Beanstalkd,一个高性能.轻量级的分布式内存队列系统,最初设计的目的是想通过后台异步执行耗时的任务来降低高容量Web应用系统的页面访问延迟,支持过有9.5 million用户的Faceb ...

  2. Beanstalkd,zeromq,rabbitmq的区别

    1).rabbitmq(功能强大,管理应用也完善,不过也比较重量级)2).zeromq(从rabbitmq出来的一个小而快速的队列,基本是目前最快的队列机制,自身支持多种模式,可以对各个模式进行自己组 ...

  3. Celery异步的分布式任务调度理解

    什么是Celery呢? Celery是一个用Python开发的异步的分布式任务调度模块. Celery本身不包含消息服务,使用第三方消息服务,也就是Broker,来传递任务,目前支持的有Rebbimq ...

  4. Beanstalkd 基本概念和使用

    1:什么是 Beanstalkd ? Beanstalkd 一个高性能.轻量级的分布式内存队列系统 简单来说,就是一个队列,相比于 数据库/redis 队列相比. 更专业.能完成的功能更多.就这么理解 ...

  5. 【Beanstalkd】Beanstalkd消息队列的安装与使用

    一.Beanstalkd是什么? Beanstalkd是一个高性能,轻量级的分布式内存队列 二.Beanstalkd特性 1.支持优先级(支持任务插队)2.延迟(实现定时任务)3.持久化(定时把内存中 ...

  6. 认识beanstalkd

    认识beanstalkd 背景  公司业务做某个需求是将数据写入到消息队列中,然后另外一个服务来消费数据,这里的消息队列使用的是beastalkd,之前接触到的消息队列为kafka,因此简单学习记录一 ...

  7. 理解CSS视觉格式化

    前面的话   CSS视觉格式化这个词可能比较陌生,但说起盒模型可能就恍然大悟了.实际上,盒模型只是CSS视觉格式化的一部分.视觉格式化分为块级和行内两种处理方式.理解视觉格式化,可以确定得到的效果是应 ...

  8. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  9. 理解加密算法(三)——创建CA机构,签发证书并开始TLS通信

    接理解加密算法(一)--加密算法分类.理解加密算法(二)--TLS/SSL 1 不安全的TCP通信 普通的TCP通信数据是明文传输的,所以存在数据泄露和被篡改的风险,我们可以写一段测试代码试验一下. ...

随机推荐

  1. 展示博客(Alpha阶段)

    Deadline: 2017-11-18 22:00PM,以博客发表日期为准 评分基准: 按时交 - 有分(满分10分),检查的项目包括后文的四个方面 团队成员介绍 Alpha阶段进展 团队合作,各成 ...

  2. nodeJs的npm报错问题

    1. Failed at the phantomjs-prebuilt@2.1.14 install script 'node install.js'. 解决办法: npm install phant ...

  3. volatile特性

    volatile保证可见性 一旦一个共享变量(类的成员变量.类的静态成员变量)被volatile修饰之后,那么就具备了两层语义: 1)保证了不同线程对这个变量进行操作的可见性,即一个线程修改了某个变量 ...

  4. ORDER BY 高级用法之CASE WHEN

    今天在公司查看一段sql SP代码,发现了一段比较奇怪的代码. 大概长这样子: Select * from tableA ORDER BY ColA , CASE END 小弟才疏学浅,咋一看到代码以 ...

  5. MVC 之var与dynamic

    如果你用MVC写过程序,那么你应该知道ViewBag这个用于前后台的数据传递工具,那么你是否对ViewBag的用法感到过疑惑呢? ViewBag.Mode1l=new object(); ViewBa ...

  6. [日常] Redis基本使用测试

    Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库.缓存和消息中间件. 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(list ...

  7. [javaSE] 网络编程(UDP通信)

    UDP发送端 获取DatagramSocket对象,new出来 获取DatagramPacket对象,new出来,构造参数:byte[]数组,int长度,InetAddress对象,int端口 调用D ...

  8. 规范大于编码-我的javaWeb开发规范

    1.应用名称和数据库名称一致 2.javaBean类名称+s和数据库表名一致 3.返回一条数据时,变量名为javaBean类名称的小写;返回多条数据时,变量名为javaBean类名称的大写 4.jav ...

  9. knockout事件绑定

    <!DOCTYPE html> <html> <head> <meta charset="utf-8" /> <title&g ...

  10. 将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问

    将windows共享文件夹挂载在linux机器的/mnt/windows/ 目录下进行访问.windows机器ip:192.168.1.101,用户名:XXXX密码:XXXXlinux机器ip:ip2 ...