RabbitMQ 6种应用场景

http://www.rabbitmq.com/getstarted.html官网html

最近业务须要使用Rabbitmq工做队列实现任务的负载分发缓存

1.一、什么是RabbitMQ?

RabbitMQ是实现AMQP(高级消息队列协议)的消息中间件的一种,服务器端用Erlang语言编写,支持多种客户端,如:Python、Ruby、.NET、Java、JMS、C、PHP、ActionScript、XMPP、STOMP等,支持AJAX。用于在分布式系统中存储转发消息。服务器

1.二、什么是AMQP?

  AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。它从生产者接收消息并递送给消费者,在这个过程当中,根据规则进行路由,缓存与持久化。并发

 而在AMQP中主要有两个组件:Exchange 和 Queue (在 AMQP 1.0 里还会有变更),以下图所示,绿色的 X 就是 Exchange ,红色的是 Queue ,这二者都在 Server 端,又称做 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,一般有 Producer 和 Consumer 两种类型:分布式

  idoall.org

1.三、RabbitMQ的基础概念

  • Broker:简单来讲就是消息队列服务器实体
  • Exchange:消息交换机,它指定消息按什么规则,路由到哪一个队列
  • Queue:消息队列载体,每一个消息都会被投入到一个或多个队列
  • Binding:绑定,它的做用就是把exchange和queue按照路由规则绑定起来
  • Routing Key:路由关键字,exchange根据这个关键字进行消息投递
  • vhost:虚拟主机,一个broker里能够开设多个vhost,用做不一样用户的权限分离
  • producer:消息生产者,就是投递消息的程序
  • consumer:消息消费者,就是接受消息的程序
  • channel:消息通道,在客户端的每一个链接里,可创建多个channel,每一个channel表明一个会话任务

安装配置过程,这里不赘述。函数

RabbitMQ有六种应用场景,这里作简单介绍ui

应用场景1-“Hello Word”.net

一个P向queue发送一个message,一个C从该queue接收message并打印。
设计

send.py 
producer,链接至RabbitMQ Server,声明队列,发送message,关闭链接,退出。日志

应用场景2-work queues

将耗时的消息处理经过队列分配给多个consumer来处理,咱们称此处的consumer为worker,咱们将此处的queue称为Task Queue,其目的是为了不资源密集型的task的同步处理,也即当即处理task并等待完成。相反,调度task使其稍后被处理。也即把task封装进message并发送到task queue,worker进程在后台运行,从task queue取出task并执行job,若运行了多个worker,则task可在多个worker间分配。


new_task.py
创建链接,声明队列,发送能够模拟耗时任务的message,断开链接、退出。

worker.py
创建链接,声明队列,不断的接收message,处理任务,进行确认。

应用场景3-Publish/Subscribe

在应用场景2中一个message(task)仅被传递给了一个comsumer(worker)。如今咱们设法将一个message传递给多个consumer。这种模式被称为publish/subscribe。此处以一个简单的日志系统为例进行说明。该系统包含一个log发送程序和一个log接收并打印的程序。由log发送者发送到queue的消息能够被全部运行的log接收者接收。所以,咱们能够运行一个log接收者直接在屏幕上显示log,同时运行另外一个log接收者将log写入磁盘文件。

 


receive_logs.py
日志消息接收者:创建链接,声明exchange,将exchange与queue进行绑定,开始不停的接收log并打印。

emit_log.py
日志消息发送者:创建链接,声明fanout类型的exchange,经过exchage向queue发送日志消息,消息被广播给全部接收者,关闭链接,退出。

应用场景4-Routing

应用场景3中构建了简单的log系统,能够将log message广播至多个receiver。如今咱们将考虑只把指定的message类型发送给其subscriber,好比,只把error message写到log file而将全部log message显示在控制台。

应用场景5-topic

应用场景4中改进的log系统中用direct类型的exchange替换应用场景3中的fanout类型exchange实现将不一样的log message发送给不一样的subscriber(也即分别经过不一样的routing_key将queue绑定到exchange,这样exchange即可将不一样的message根据message内容路由至不一样的queue)。但仍然存在限制,不能根据多个规则路由消息,好比接收者要么只能收error类型的log message要么只能收info类型的message。若是咱们不只想根据log的重要级别如info、warning、error等来进行log message路由还想同时根据log message的来源如auth、cron、kern来进行路由。为了达到此目的,须要topic类型的exchange。topic类型的exchange中routing_key中能够包含两个特殊字符:“*”用于替代一个词,“#”用于0个或多个词。

receive_logs_topic.py
log message接收者:创建链接,声明topic类型的exchange,声明queue,根据程序参数构造routing_key,根据routing_key将queue绑定到exchange,循环接收并处理message。

emit_log_topic.py
log message发送者:创建链接、声明topic类型的exchange、根据程序参数构建routing_key和要发送的message,以构建的routing_key将message发送给topic类型的exchange,关闭链接,退出。

应用场景6-PRC

在应用场景2中描述了如何使用work queue将耗时的task分配到不一样的worker中。可是,若是咱们task是想在远程的计算机上运行一个函数并等待返回结果呢。这根场景2中的描述是一个彻底不一样的故事。这一模式被称为远程过程调用。如今,咱们将构建一个RPC系统,包含一个client和可扩展的RPC server,经过返回斐波那契数来模拟RPC service。

rpc_server.py
RPC server:创建链接,声明queue,定义了一个返回指定数字的斐波那契数的函数,定义了一个回调函数在接收到包含参数的调用请求后调用本身的返回斐波那契数的函数并将结果发送到与接收到message的queue相关联的queue,并进行确认。开始接收调用请求并用回调函数进行请求处理。

rpc_client.py
RPC client:远程过程调用发起者:定义了一个类,类中初始化到RabbitMQ Server的链接、声明回调queue、开始在回调queue上等待接收响应、定义了在回调queue上接收到响应后的处理函数on_response根据响应关联的correlation_id属性做出响应、定义了调用函数并在其中向调用queue发送包含correlation_id等属性的调用请求、初始化一个client实例,以30为参数发起远程过程调用。

你能够根据本身想须要进行应用,具体代码能够去文章顶部的官网查看

本文参考:http://blog.csdn.net/zyz511919766/article/details/41946521

相关文章
相关标签/搜索