rabbitmq 简单梳理
概念:
生产者(Producer,简写P),负责发布消息。
“交换机”(Exchange, 简写X), 负责中转消息。
路由(Route, 简写R), 即 X->Q的路线名。
消息队列 (Queue, 简写Q), 负责临时存储消息。
消费者(Customer,简写C), 负责处理消息。
完整关系图解:
P: 负责发布消息, 可绑定到一个exchange上,默认的exchange名为空字符串,类型为direct。 推送消息时,需要指定路由名(routing_key)。
发布消息时,需要指定:
routing_key, 路由名
body,消息正文
properties,消息属性
AMQP协议定义的消息属性支持14种之多,最常用的有四种:
delivery_mode: 2---持久化消息。 其他值----临时消息(不存文件/数据库)
content_type: 内容类型(json类型设为: application/json)
reply_to: 回调队列名称,
correlation_id: 消息id, 可用于匹配响应内容。
X: 负责路由消息,类型有
- direct, 直接转发, P在推消息时,指定routing_key(路由关键字), 此类型的X直接找:1. 路由名与其匹配的路由, 2.名字与其匹配的队列(Q),没找到则放弃。
- fanout,广播消息, 此时无论P怎么指定routing_key,将无条件转发给绑定到exchange上的所有队列(Q)。
- topic, 可认为是direct改进版(模糊匹配版); 示例图如下:
topic类型的路由, 其名为"关键词1.关键次2.关键词n",每个关键词均可用通配符取代 (* / #)
* : 代表一个单词(关键字)
# : 代表0~n个单词(用.分隔)
对于上图的路由情况:
eg.
消息A.orange.B 匹配*.orange.* , 去Q1
消息A.B.rabbit, 匹配*.*.rabbit, 去Q2
消息lazy.B.orange, 匹配 *.orange.* 和 laze.# 去 Q1和Q2, 消息被处理两次!
消息lazy.B.rabbit, 匹配 *.*.rabbit 和 lazy.# 去Q2, 由于是统一个队列,只投递一次。只处理一次!
消息hardworking.A.cow, 不匹配任何路由规则,消息将被丢弃!
路由的声明: 在绑定队列到Exchange上时声明。
- headers, 暂无资料。
路由:队列绑定到exchange上,需要指定路由,默认为''(路由名为空时,匹配队列名)
Q: 队列, 缓存消息,
可进行持久化(durable), 在少数极端条件下,即使durable的队列消息也可能丢失。
要持久化消息,处理队列要声明为可持久化的,消息在推送时,也需要指定其属性为可持久化的(delivery_mode = 2)。
有临时队列(C指定,用exclusive属性声明队列), 随消费者销毁而销毁(专用)。
队列在分发消息给消费者(多个消费者)时,默认是按消息条数平分的。即:若队列(Q)里有10条消息, 有两个消费者(C1和C2), 那么C1得到(1,3,5,7,9), C2得到(2,4,6,8,10)。
若想队列在下发消息时,考虑到消费者的处理能力,做到处理大而耗时任务的少发,处理小而快速的任务的消费者多发(即负载均衡), 需要配置消费者同时处理最大任务数属性(prefetch)
pika 里面是: channel.basic_qos(prefetch=1)
C: 消费者可以绑定到一个队列上,进行监听,消息来了即处理, 从这个角度讲, 消费者可以作为server端。
消费者在轮询监听到消息,交给回调函数(callback)来处理消息。
消费者指定消息队列中的消息的删除模式(确认后删除/不需要确认删除),通过no_ack参数(默认为False, 即需要确认), 需要确认的消息在其回调函数中,得进行确认操作。以保证消息总能得到处理,不会丢失。默认, 如果一个消费者进程挂掉了, 没有确认"消息处理完了", 消息队列将重发此消息给下一个消费者(保证服务可靠性)。
应用:
1. 提高系统并发性:
对于某些可以异步处理的任务(发送短信/邮件/推送等等),及时将任务publish到消息队列中,及时返回,不阻塞请求。
2. 应用于某些设计模式:
消息发布/订阅
3. rpc
demo参考这里。
转载请注明来源:http://www.cnblogs.com/Tommy-Yu/p/5802264.html
谢谢!
rabbitmq 简单梳理的更多相关文章
- 机器学习&数据挖掘笔记(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 作者:tornadomeet 出处:http://www.cnblogs.com/tornadomeet 前言: 找工作时( ...
- [转]机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理)
机器学习&数据挖掘笔记_16(常见面试之机器学习算法思想简单梳理) 转自http://www.cnblogs.com/tornadomeet/p/3395593.html 前言: 找工作时(I ...
- C#正则表达式_简单梳理_Emoji表情字符处理
A-最近一直有接触到正则表达式,现对其做简单梳理: private const RegexOptions OPTIONS = RegexOptions.IgnoreCase | RegexOption ...
- RocketMQ 简单梳理 及 集群部署笔记【转】
一.RocketMQ 基础知识介绍Apache RocketMQ是阿里开源的一款高性能.高吞吐量.队列模型的消息中间件的分布式消息中间件. 上图是一个典型的消息中间件收发消息的模型,RocketMQ也 ...
- Memcached概念、作用、运行原理、特性、不足简单梳理(1)
大家可能对memcached这种产品早有了解,或者已经应用在自己的网站中了,但是也有一些朋友从来都没有听说过或者使用过.这都没什么关系,本文旨在从各个角度综合的介绍这种产品,尽量深入浅出,如果能对您现 ...
- rabbitmq简单收发服务搭建
消息发送.接收简单代码示例 mq.xml //rabbitmq config spring.rabbitmq.host=ip:host spring.rabbitmq.username= spring ...
- RabbitMQ简单应用の简单队列
(1)首先创建一个maven项目: pom.xml,重点是配置RabbitMQ <dependencies> <dependency> <groupId>junit ...
- AMQP消息队列之RabbitMQ简单示例
前面一篇文章讲了如何快速搭建一个ActiveMQ的示例程序,ActiveMQ是JMS的实现,那这篇文章就再看下另外一种消息队列AMQP的代表实现RabbitMQ的简单示例吧.在具体讲解之前,先通过一个 ...
- rabbitmq简单实例
JMS组件:activemq(慢)AMQP组件(advance message queue protocol):rabbitmq和kafka 一..消息队列解决了什么问题?异步处理应用解耦流量削锋日志 ...
随机推荐
- Win10 VC++6 无法启动此程序,因为计算机中丢失mfc42d.dll 需要提升
亲测可用 1.无法启动此程序,因为计算机中丢失mfc42d.dll 我也遇到了这个问题,并且顺利解决了!按一下流程搞定的: “工程-设置-常规-microsoft基础类,(选择使用MFC作为静态链接库 ...
- [[iso教程]] 《4个月ios实体教程》全网最新、最全ios视频教程
全网最新.最全ios视频教程 内容简介 <ios实体教程>主要介绍如何使用iOS提供的强大工具集创建iOS应用.全视频对iOS操作系统做了全面的介绍,首先讲解如何构建应用程序的用户界面,涵 ...
- spring-boot-starter-amqp踩坑记
踩坑记录 近日在用spring boot架构一个微服务框架,服务发现与治理.发布REST接口各种轻松惬意.但是服务当设计MQ入口时,就发现遇到无数地雷,现在整理成下文,供各路大侠围观与嘲笑. 版本 当 ...
- 通过Iframe在A网站页面内嵌入空白页面的方式,跨域获取B网站的数据返回给A网站!
以下代码只是为演示该方法具体是如何操作的,实际的意义并不大. 其实这个方法还可以解决很多方面的跨域操作,以下两点为我工作中遇到的情况! 比如A系统中打开B系统页面的时候,获取B系统页面高度,A系统中可 ...
- [转]Java compiler level does not match解决方法
查看链接:http://jingyan.baidu.com/article/95c9d20da3ec5fec4e756186.html
- Java Web的web.xml文件作用及基本配置(转)
其实web.xml就是asp.net的web.config一个道理. 说明: 一个web中完全可以没有web.xml文件,也就是说,web.xml文件并不是web工程必须的. web.xml文件是用来 ...
- 关于line-height
line-height不允许负值,给定值之后会根据font-size计算行高,line-height指定的行高是行高最小值,设置height可以增大行高 line-height的计算:以px为例,li ...
- JQuery 实现标题与内容相呼应样式
效果图如下:鼠标移到标题上,标题下面显示标题对应的内容.实现的方法如下: 1.引入css和js文件 <link href="public/CSS/StyleSheet.css" ...
- cookie 和session 的区别详解
这些都是基础知识,不过有必要做深入了解.先简单介绍一下. 二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪 ...
- <<< Tomcat 部署项目There are no resources that can be added or removed from the server
错误信息:没有资源可以添加或删除的服务器 解决方式: 方式1.选中项目右键——找到Project Facets——勾选Dynamic Web Project和java 方式2.新建一个同名web项目, ...