最近业务需要使用Rabbitmq工作队列实现任务的负载分发

1.1、什么是RabbitMQ?

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

1.2、什么是AMQP?

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

而在AMQP中主要有两个组件:ExchangeQueue (在 AMQP 1.0 里还会有变动),如下图所示,绿色的 X 就是 Exchange ,红色的是 Queue ,这两者都在 Server 端,又称作 Broker ,这部分是 RabbitMQ 实现的,而蓝色的则是客户端,通常有 ProducerConsumer 两种类型:

1.3、RabbitMQ的基础概念

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

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

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

应用场景1-“Hello Word”

一个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_keyqueue绑定到exchange,这样exchange便可将不同的message根据message内容路由至不同的queue)。但仍然存在限制,不能根据多个规则路由消息,比如接收者要么只能收error类型的log message要么只能收info类型的message。如果我们不仅想根据log的重要级别如info、warning、error等来进行log message路由还想同时根据log message的来源如auth、cron、kern来进行路由。为了达到此目的,需要topic类型的exchangetopic类型的exchangerouting_key中可以包含两个特殊字符:“*”用于替代一个词,“#”用于0个或多个词。

receive_logs_topic.py
log message接收者:建立连接,声明topic类型的exchange,声明queue,根据程序参数构造routing_key,根据routing_keyqueue绑定到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,定义了一个返回指定数字的斐波那契数的函数,定义了一个回调函数在接收到包含参数的调用请求后调用自己的返回斐波那契数的函数并将结果发送到与接收到messagequeue相关联的queue,并进行确认。开始接收调用请求并用回调函数进行请求处理。

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

你可以根据自己想需要进行应用,具体代码可以去官网查看
http://www.rabbitmq.com/getstarted.html官网

RabbitMQ 6种应用场景相关推荐

  1. java get请求传参_Java-ThreadLocal三种使用场景

    ThreadLocal对于每一位Java读者而言我想可能都不陌生,因为面试基本都会被问到. Java-ThreadLocal三种使用场景 关于ThreadLocal JDK1.2的版本中就提供java ...

  2. Numpy中np.mashgri() 函数介绍及2种应用场景

    @[toc](Numpy中np.mashgri() 函数介绍及2种应用场景 文章目录:) 近期在好几个地方都看到meshgrid的使用,虽然之前也注意到meshgrid的用法. 但总觉得印象不深刻,不 ...

  3. Java CountDownLatch的两种常用场景

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/120506758 本文出自[赵彦军的博客] 文章目录 简介 场景1 让多个线程等待: ...

  4. Redis 几种应用场景

    Redis 几种应用场景 字符串缓存 <?php$redis = new Redis();$redis->connect('127.0.0.1',6379);$strKey = 'test ...

  5. 面试一口气说出Spring的声明式事务@Transactional注解的6种失效场景

    一.Spring事务管理的两种方式 事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制,主要分为编程式事务和声明式事务两种. 编程式事务:是指在代码中手动的管理事务的提交.回滚 ...

  6. table表头固定4种方法_在常见的3种工资条场景中,教你4种批量打印工资条的方法...

    私信回复关键词[福利]~ 获取丰富办公资源,助你高效办公早下班! 打印工资条估计是财务老师的痛,要把一行行的数据,变成一条条的工资条. 数据很多,表头很复杂. 一个个复制粘贴?那是不可能的! 那怎么办 ...

  7. Synchronized 的 8 种使用场景!

    blog.csdn.net/x541211190/article/details/106272922 简介 本文将介绍8种同步方法的访问场景,我们来看看这8种情况下,多线程访问同步方法是否还是线程安全 ...

  8. 应用Quick BI实现首购用户和用户首购的三种运营场景监控

    导读: 首购用户和用户首购是互联网公司运营中最简单.最常遇到.也最容易混淆的两个概念.运营人员与BI经常在首购用户和用户首购上沟通不畅,信息不对称造成理解偏差,导致数据仓库模型或者BI仪表板一改再改. ...

  9. mysql replace 效率,MySQL replace实用场景 MySQL实现replace函数的几种实用场景

    想了解MySQL实现replace函数的几种实用场景的相关内容吗,_陈哈哈在本文为您仔细讲解MySQL replace实用场景的相关知识和一些Code实例,欢迎阅读和指正,我们先划重点:MySQL,r ...

最新文章

  1. 156 13.67用matlab答案,数学实验(MATLAB版韩明版)5.1,5.3,5.5,5.6部分答案
  2. 添加文件然后自动打开
  3. 远程linux服务器,安装集成的xampp,本地电脑远程连接数据库进行使用
  4. 批量修改linux换行格式,linux中sed命令批量修改
  5. Spring Boot Security 整合 OAuth2 设计安全API接口服务
  6. 先验概率与后验概率的区别
  7. Caffe编译 Mnist训练测试---基本参数学习
  8. Postgresql、MySQL相关的四种索引类型:B-Tree,Hash,Gist,GIN
  9. 实验吧CTF web刷题
  10. icode青少年编程比赛网站学生刷题进度爬虫
  11. 有关linux表情图片,面向Ubuntu的LumaQQ个人修改版下载(支持新款表情)
  12. linux journalctl使用详解
  13. cmos逻辑门传输延迟时间_半导体学习日记-CMOS器件面临的挑战
  14. UFS Hibernate介绍--代码部分
  15. 基于 Sphinx 以纯文本编写富媒体项目文档的方法介绍
  16. 脚本小子_Lua深入了解函数
  17. Civil 3D菜单栏不在了怎么办
  18. 不知道怎么去视频水印,看看这些怎样去水印教程
  19. CAD设置图层透明显示
  20. int 长度 mysql_MySQL int 类型的长度和范围解惑

热门文章

  1. TensorRT | 入门篇
  2. 计算机硕士论文导师评语,硕士论文指导教师评语
  3. 微信开发获取access_token(凭证)接口的详解
  4. R语言:使用ComplexHeatmap包绘制热图
  5. Vim/Neovim ALE system verilog使用xvlog时出现“ ‘logic‘ is uan unknown type “ 等
  6. 多个moudle混淆配置问题
  7. 【springcloud合集】04:新建Moudle——微服务提供者支付模块
  8. android studio主moudle无法调用依赖moudle里的jar包
  9. C# Web页面打印网页
  10. centos7dos命令下打开网络