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. Node.js之Express一

    前面也了解了HTTP模块,但它并不支持session.cookie等.Express是对HTTP模块的封装,同时也支持session这些,使用起来也更好用.Express更有点像IIS服务器.它也是属 ...

  2. [转]How to Create an Add-in for Microsoft Outlook

    本文转自:https://www.codeproject.com/Articles/1112815/How-to-Create-an-Add-in-for-Microsoft-Outlook This ...

  3. SQL Server数据库状态和文件状态

    数据库状态 (database states) 查询数据库的当前状态 : 1.查询所有数据库的状态 ,通过sys.databases目录视图的state_desc列 user master go se ...

  4. MySql社区版和企业版的区别

    1.社区版的免费,出问题MySql公司概不负责,是企业版的测试版,功能却没有企业版功能完善. 2.企业版的收费,并且价格不便宜,标准版2000美元,企业版5000美元,高级集群版10000美元(6万人 ...

  5. C#截取字符串(转载)

    来源:https://www.cnblogs.com/lykbk/archive/2012/06/28/lyk1232132.html C#截取字符串 一. 1.取字符串的前i个字符 (1)strin ...

  6. 线程2--多线程NSThread

    NSThread三种方式创建子线程 /** * NSThread创建线程方式1 * 1> 先创建初始化线程 * 2> start开启线程 */ -(void)creatNSThread { ...

  7. Tomcat9 配置在Windows7 64位 上安装步骤

    安装 Tomcat 之前先安装java JDK . 本人在安装Tomcat之前,java的jdk安装的是jdk 11版本.安装java 网上教程一大把,我这里不再阐述. 百度直接搜 Tomcat,如下 ...

  8. Linux线程同步——条件变量

    互斥锁是用来给资源上锁的,而条件变量是用来等待而不是用来上锁的. 条件变量用来自动阻塞一个线程,直到某特殊情况发生为止. 通常条件变量和互斥锁同时使用. 和条件变量使用有关的几个重要函数: int p ...

  9. zookeeper 典型应用

    一.发布/订阅 配置文件的集中管理. 问题:当分布式系统变多后,每个系统保存相应的配置文件,会造成同个文件有多份,修改起来非常麻烦. 解决方法:使用zk的发布/订阅功能,配合Watcher机制,在应用 ...

  10. JavaSE (二)

    this关键字 当一个对象创建后,Java虚拟机(JVM)就会给这个对象分配一个引用自身的指针,这个指针的名字就是 this. 用法:对当前对象的默认引用 调用自己的的构造方法. 用在构造方法内部,区 ...