Beanstalk是一个高性能、轻量级、分布式、基于内存的消息队列系统。最初设计的目的是通过在后台异步执行耗时任务来降低大容量Web应用系统的页面访问延迟。实际上,Beanstalkd是典型的类Memcached设计,具有相同的协议和用法。它的基本设计思想很简单:高性能离不开异步,异步离不开队列,内部是生产者消费者模型。背景介绍: 现在市场上有很多消息队列系统。常用的有ActiveMQ、RabbitMQ、ZeroMA、Kafka、RocketMQ。Redis之父最近开了一个Disque。之前在乐视网用的是apache的qpid。但每个系统之所以受欢迎,取决于它的侧重点。 其中ActiveMQ可以称为传统类型,完全支持JMS和AMQP规范。 JMS是Java消息服务应用程序编程接口。它是Java平台上面向消息的中间件(MOM)的技术规范。它促进消息系统中Java应用程序的消息交换,并通过提供用于生成、发送和接收消息的标准接口来简化过程。开发企业应用程序。(*这里说了,JMS是一个应用程序编程接口,也就是API,API的意思就是绑定了一种编程语言) JMS架构由JMS提供者,JMS客户端,JMS生产者,JMS消费者组成,JMS消息、JMS队列和JMS主题。 JMS对象模型包括:连接工厂、JMS连接、JMS会话、JMS目的、JMS生产者和消费者、JMS消息。其中,大家最关心的是JMS消息的两种模型:点对点(pointtopoint,queue)和发布/订阅(publish/subscribe,topic)。两者的区别在于点对点模式是生产者向队列发送消息。一个队列可以有多个消费者,但一条消息只能被一个消费者接收。当没有消费者可用时,消息将被保存。在有可用的消费者之前,队列实现可靠的负载平衡。发布-订阅模式是发布者向主题发送消息,只有订阅主题的订阅者才会收到消息。Topic实现了发布和订阅。当你发布一条消息时,所有订阅该主题的服务都可以获得该消息,因此从1到N个订阅者都可以获得该消息的副本。 AMQP(AdvancedMessageQueuingProtocol),与JMS的区别在于:JMS只是针对java平台的解决方案,而AMQP是跨语言的协议。由于跨语言的特性,减少了企业和系统集成的开销。所以现在的消息队列系统支持的AMQP多,JMS支持的少。 AMQP的特点是面向消息、队列、消息模型(同JMS:点对点和发布-订阅)、可靠性和安全性。它提供三种消息传递保证:至多一次、至少一次和恰好一次。 我们在使用消息队列时经常提到的broker,就是实现了AMQP协议的服务器的名称。其基本结构如下图所示。Beanstalk简介: 接下来说说beanstalk。首先,beanstalk其实并不是JMS规范,也没有严格遵守AMQP协议。有人说Beanstalk之于RabbitMQ,就像Nginx之于Apache。它更简单、更轻便、性能更高且易于使用。但是和Kafka相比,在数据处理能力上还是有差距的,所以我们现在其实是在逐步替代它。但是它有一些特殊的功能,非常好用,后面会提到。 Beanstalk主要包括4个部分。 1>job:需要异步处理的任务,需要放在一个管子里。 2>tube:众所周知的任务队列,用于存放统一类型的作业,是生产者和消费者操作的对象。 3>producer:job的生产者,通过put命令把一个job放到一个管子里。4>consumer:job的consumer,通过reserve、release、bury、delete命令获取job或改变job的状态。 刚才说了Beanstalk有一些特别好用的功能。即支持任务优先级(priority)、延迟(delay)、运行时间(time-to-run)和预留(buried),可以很好地支持分布式后台任务和定时任务处理。这些特性与beantalk的工作过程密切相关。 在Beanstalk中一个job的生命周期有四种类型:READY、RESERVED、DELAYED、BURIED。 当生产者直接放入作业时,作业处于READY状态,等待消费者处理。如果选择延迟放置,作业会先进入DELAYED状态,然后在指定的时间READY。消费者获得READY作业,状态为RESERVED。这样其他消费者就不能再操作这个作业了。当消费者完成工作时,他可以选择删除、释放或埋葬。 删除后,任务就无法再获取了。发布作业可以重新迁移或延迟回到READY。Bury的工作可以处于休眠状态,然后在需要时准备就绪或删除。Beanstalk使用场景: 用作延迟队列:比如用户30分钟内没有操作,则关闭任务。 用作循环队列:使用release命令循环执行任务,如负载均衡任务分发。 作为自下而上的机制来使用:比如一个请求有失败的概率,可以使用Beanstalk不断重试,设置一个超时时间,在限定时间内尝试,直到成功。 用作定时任务:例如,它可以用于专门的后台任务。 用作异步操作:这是所有消息队列最常用的。任务仍然是先进入并按顺序执行。
