任务池与指令池的搭建和使用
任务池与指令池的搭建与使用其实就是选用一个合适的消息队列服务并根据具体问题制定使用规则。
本节将介绍任务池与指令池的搭建与使用的具体方法,主要从4个方面进行深入讲解:消息队列、RabbitMQ、任务池的搭建与使用规则,以及指令池的搭建与使用规则。
消息队列
消息队列(Message Queue)是应用程序间(或同一进程的多个线程间)通信的一种方式。消息队列实质上是一种异步通信方式,消息队列作为消息的中转站,允许应用程序把消息存放在消息队列中,而消息的接收者可以在消息存放一段时间后再取回信息。另外,消息队列一般保持先进先出的原则,即先存放的消息会被先取得。
如果以消息队列作为生产者与消费者模型中的仓库,则相当于规定先生产的信息会被先消费。另外,消息队列一般是独立于应用程序之外的服务,即使生产者应用程序或消费者应用程序都异常退出,消息仍会正常保留在消息队列中。
说明:生产者与消费者模型是一种通用模型,解决的是并行任务的同步问题。而并行任务可能是运行在不同服务器上的应用程序,可能是同一机器中的多个进程,也可能是同一进程的多个线程。
消息队列充当生产者与消费者模型的仓库,如图5.18所示。
图5.18 消息队列充当生产者与消费者模型的仓库
其中,生产者、仓库(消息队列)和消费者是相互独立的三个部分,生产者和消费者可以为多个。另外,生产者和消费者可能是运行在不同服务器上的应用程序,可能是同一机器中的多个进程,也可能是同一进程的多个线程。
以上介绍的是消息队列的相关概念,下面将介绍几种常见的消息队列,值得注意的是,不同的消息队列应对的场景是有所区别的,具体消息队列的选择应该以具体场景为依据。
1、系统内核的消息队列
在现今的操作系统当中,其系统内核基本都带有消息队列。系统内核的消息队列是进程通信的一种方式,同一机器的多个进程可以通过此消息队列进行通信。一般来说,系统内核消息队列中的数据不会因为相关进程的退出而消失,除非系统重启或者程序对消息进行删除。
说明:内核是一个操作系统的核心,它负责管理操作系统的进程、内存、驱动程序、文件系统及网络系统等。Linux实际上是一种系统内核,而Ubuntu、CentOS这些操作系统用的都是Linux内核,所以Ubuntu、CentOS这些操作系统也被统称为Linux系统。
2、Kafka
Kafka是一种高吞吐量的分布式发布订阅消息系统,是非常流行的一种消息队列服务。Kafka是独立的消息队列服务,允许不同服务器上的应用程序使用该消息队列。Kafka是一个分布式流式系统,拥有很高的吞吐量并允许大量的消息堆积,所以最适合作为高并发数据流式处理的消息中间件,常用作日志采集、用户行为采集及数据采集等场景。
3、RabbitMQ
RabbitMQ是遵循AMQP的消息代理,是非常流行的一种消息队列服务。
RabbitMQ是独立的消息队列服务,允许不同服务器上的应用程序使用该消息队列。相对于Kafka,RabbitMQ的吞吐量不具备优势,但是RabbitMQ拥有灵活的消息路由规则,可应对更为复杂的消息传递场景。RabbitMQ拥有消息确认机制,如果消费者程序在处理消息时异常退出(没发送消息确认的反馈),RabbitMQ会重新把消息放回消息队列中,所以RabbitMQ也常被用作消息需要保证被正常消耗的场景。
说明:AMQP(Advanced Message Queuing Protocol)一种提供统一消息服务的应用层标准高级消息队列协议,RabbitMQ是该协议的一种具体实现。
4、其他
除了Kafka和RabbitMQ这两种主流的消息队列服务以外,还有ZeroMQ、ActiveMQ及RocketMQ等。对于用作不同服务器应用程序间通信的消息队列的选择而言,消息队列服务之间很难判断出孰优孰劣,更多的应该是根据具体应用场景的某些特殊要求来作出选择。
本文给大家讲解的内容是云计算服务架构任务池与指令池的搭建和使用,消息队列(做了简单介绍)
下篇文章给大家讲解的内容是大型网站架构的技术细节:云计算服务架构任务池与指令池的搭建和使用,RabbitMQ消息队列
感谢大家的支持
领取专属 10元无门槛券
私享最新 技术干货