全热交换器

RabbitMQ-Exchange交换器

扶醉桌前 提交于 2019-12-03 02:21:49
交换器分类 RabbitMQ的Exchange(交换器)分为四类: direct(默认) headers fanout topic 其中headers交换器允许你匹配AMQP消息的header而非路由键,除此之外headers交换器和direct交换器完全一致,但性能却很差,几乎用不到,所以我们本文也不做讲解。 注意: fanout、topic交换器是没有历史数据的,也就是说对于中途创建的队列,获取不到之前的消息。 1、direct交换器 direct为默认的交换器类型,也非常的简单,如果路由键匹配的话,消息就投递到相应的队列,如图: 使用代码:channel.basicPublish("", QueueName, null, message)推送direct交换器消息到对于的队列,空字符为默认的direct交换器,用队列名称当做路由键。 direct交换器代码示例 发送端: Connection conn = connectionFactoryUtil.GetRabbitConnection(); Channel channel = conn.createChannel(); // 声明队列【参数说明:参数一:队列名称,参数二:是否持久化;参数三:是否独占模式;参数四:消费者断开连接时是否删除队列;参数五:消息其他参数】 channel.queueDeclare(config

RabbitMQ 相关概念

Deadly 提交于 2019-12-03 01:54:53
RabbitMQ 整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息。可以把消息传递的过程想象成:当你讲一个包裹送到邮局,邮局会暂存并最终将邮件通过邮递员送到收件人的手上,RabbitMQ 就好比由邮局、邮箱和邮递员组成的一个系统。从计算机术语层面来说,RabbitMQ 模型更像是一种交换机模型。 RabbitMQ 的整体模型架构如下图: 生产者和消费者 Producer:生产者,就是投递消息的一方。 生产者创建消息,然后发不到 RabbitMQ 中。消息一般可以包含 2 个部分:消息体和标签(Label)。消息体也可以称之为 payload,在实际应用中,消息体一般是一个带有业务逻辑结构的数据,比如一个 JSON 字符串。当然可以进一步对这个消息体进行序列化操作。消息的标签用来表述这条消息,比如一个交换器的名称和一个路由键。生产者把消息交由 RabbitMQ,RabbitMQ 之后会根据标签把消息发送给感兴趣的消费者(Consumer)。 Consumer:消费者,就是接收消息的一方。 消费者连接到 RabbitMQ 服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体(payload)。在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也会消费到消息体,也就不知道消息的生产者是谁,当然消费者也不需要知道。 Broker

RabbitMQ队列

一个人想着一个人 提交于 2019-12-02 16:42:07
为啥要使用MQ 以常见的订单系统为例,用户点击【下单】按钮之后的业务逻辑可能包括:扣减库存、生成相应单据、发红包、发短信通知。在业务发展初期这些逻辑可能放在一起同步执行,随着业务的发展订单量增长,需要提升系统服务的性能,这时可以将一些不需要立即生效的操作拆分出来异步执行,比如发放红包、发短信通知等。这种场景下就可以用 MQ ,在下单的主流程(比如扣减库存、生成相应单据)完成之后发送一条消息到 MQ 让主流程快速完结,而由另外的单独线程拉取MQ的消息(或者由 MQ 推送消息),当发现 MQ 中有发红包或发短信之类的消息时,执行相应的业务逻辑。 MQ的介绍 MQ 全称为 Message Queue , 消息队列( MQ )是一种应用程序对应用程序的通信方法。 MQ 是消费-生产者模型的一个典型的代表,一端往消息队列中不断写入消息,而另一端则可以读取队列中的消息。消息发布者只管把消息发布到 MQ 中而不用管谁来取,消息使用者只管从 MQ 中取消息而不管是谁发布的。这样发布者和使用者都不用知道对方的存在。 你可以想想在生活中的一种场景:当你把信件的投进邮筒,邮递员肯定最终会将信件送给收件人。我们可以把MQ比作 邮局和邮递员。 MQ和邮局的主要区别是,它不处理消息,但是,它会接受数据、存储消息数据、转发消息 队列,生产者,消费者 队列是RabbitMQ的内部对象,用于存储消息。生产者

RabbitMQ实战-笔记

邮差的信 提交于 2019-12-02 10:56:52
第二章 理解消息通信 2.1 消费者与生产者的概念 信道是建立在tcp上的虚拟连接,可以减少tcp连接的开销 2.2 amqp消息路由必须有三部分: 交换器,队列和绑定, 生产者把消息发布到交换器上,消息最终到达队列,绑定决定了消息如何从路由器路由到特定队列. 2.2.1通过amqp的consume命令可以将信道设置为接收模式,直到取消对队列的订阅为止.消费者在消费了最近接收的那条消息后就可以从队列中自动接收下一条消息,如果消息者处理消息,并且需要在消息一到达队列时就自动接收的话,应该使用consume. 2.2.2 如果仅想从队列中获取一条消息,而不是持续订阅,可以使用get命令,该命令在获取消息后会取消订阅,如果想再次获得消息,需要再次调用get命令.如果想要持续获取消息,并实现高吞吐量,应该使用consume. 2.2.2.1 当队列有多个消费者时,消息会被平均分发给所有消费者. 2.2.2.2 消费者在接收到消息后,需要通过ack命令向服务器进行确认,或者在订阅到队列的时候设置auto_ack为true,不确认,则该消息会被重发. 2.2.3 如果在接收到消息后由于某些原因未能正确处理该消息,想要拒收该消息的话,可以通过reject命令,rabbitmq会把消息重新发给下一个订阅的消费者. 2.2.4 通过queue.declare来创建队列

RabbitMQ指南

一笑奈何 提交于 2019-11-30 23:02:07
原文地址:http://www.blogjava.net/qbna350816/archive/2016/06/04/430771.html 官网指南-RabbitMQ-Java Client API Guide 概述 RabbitMQ Java client 将 com.rabbitmq.client作为其顶层包 . 关键类和接口有: Channel Connection ConnectionFactory Consumer 协议操作可通过 Channel接口来进行.Connection用于开启c hannels,注册connection生命周期事件处理, 并在不需要时关闭connections. Connections是通过 ConnectionFactory来初始化的,在ConnectionFactory中,你可以配置不同的connection设置,如:虚拟主机和用户名等等 . Connections 和 Channels 核心API类是 Connection和 Channel , 它们代表对应AMQP 0-9-1 connection 和 channel. 在使用前,可像下面这样来导入: import com.rabbitmq.client.Connection; import com.rabbitmq.client.Channel; 连接到broker

RabbitMQ各功能入门

喜你入骨 提交于 2019-11-30 22:45:17
一、RabbitMQ相关角色 RabbitMQ整体上是一个生产者与消费者模型,主要负责接收、存储和转发消息,可以把消息传递的过程想象成:你将一个包裹收到邮局,邮局会暂存并最终将包裹由快递员送到收件人的手上。RabbitMQ就好比由邮局、邮箱和邮递员组成的一个系统,从计算机术语来说,RabbitMQ模型更像是一种交换机模型。如下图(RabbitMQ的模型框架): 二、生产者和消费者 Ⅰ:Producer:生产者,就是投递消息的一方。 生产者创建消息,然后发布到RabbitMQ中,消息一般可以包含2个部分:消息体和标签(label)。也可成为payload,在应用中,消息体一般是一个带有业务逻辑结构的数据,如JSON串。生产者把消息交给RabbitMQ,RabbitMQ之后会根据标签把消息发送给感兴趣的消费者(Consumer)。 Ⅱ:Consumer:消费者,就是接收消息的一方。 消费者连接到RabbitMQ服务器,并订阅到队列上。当消费者消费一条消息时,只是消费消息的消息体(payload),在消息路由的过程中,消息的标签会丢弃,存入到队列中的消息只有消息体,消费者也只会消费到消息体,也就不知道消息的生产者是谁,也不需要知道。 Ⅲ:Broker:消息中间件的服务节点。 对于RabbitMQ来说,一个RabbitMQ Broker可以简单的看作一个RabbitMQ服务节点

SpringBoot高级——消息中间件

半城伤御伤魂 提交于 2019-11-30 21:53:43
一、概述  1、大多应用中,可通过消息服务中间件来提升系统异步通信、扩展解耦能力  2、消息服务中的两个重要概念:消息代理(message broker,即消息中间件服务器)和目的地(destination)   当消息发送者发送消息以后,将由消息代理接管,消息代理保证消息传递到指定目的地。  3、消息队列主要有两种形式的目的地   队列(queue):点对点消息通信(point-to-point)    消息发送者发送消息,消息代理将其放入一个队列中,消息接收者从队列中获取消息内容,消息读取后被移出队列    消息只有唯一的发送者和接受者,但并不是说只能有一个接收者,这是因为消息一旦被消费就会从队列中移除   主题(topic):发布(publish)/订阅(subscribe)消息通信    发送者(发布者)发送消息到主题,多个接收者(订阅者)监听(订阅)这个主题,那么就会在消息到达时同时收到消息,不同于点对点的方式,在点对点的方式中一旦一个接收者处理了消息,消息就会被移除,那么其他的接收者就不会再去处理,而订阅的方式则是所有的接收者都会对该消息做出相应处理 二、使用场景  1、异步处理   在用户注册时给用户发送短信和邮件,但是短信和邮件并不需要在注册成功已完成就发送,因此可以异步处理  2、应用解耦  3、流量削峰   比如秒杀:在10万个客户秒杀1万个商品的时候

activemq、rabbitmq、kafka原理和比较

a 夏天 提交于 2019-11-30 21:22:53
一、activemq 虽然是java写的消息队列,但是提供Java, C, C++, C#, Ruby, Perl, Python, PHP各种客户端,所以语言上是没什么问题的。配置和使用,基本上是java xml这一套。同时对jms、spring之类的支持很友好。 而且因为是Java写的,所以可以作为一个jar包,放到java项目里,用代码启动和配置,这个对于java开发者而言是不是相当爽?毕竟还是有些场景,需要我们把队列放到自己项目内部,随项目启动而启动的。而且,还可以类似拓展tomcat一样,自己写java的plugin来拓展activemq。比如说,我有10万硬件连到mq上,这10万设备每个都有用户名密码,这个时候我们可以用java写个权限验证,从数据库里查这10万用户名密码。 activemq支持主从复制、集群。但是集群功能看起来很弱,只有failover功能,即我连一个失败了,可以切换到其他的broker上。这一点貌似不太科学。假设有三个broker,其中一个上面没有consumer,但另外两个挂了,消息会转到这个上面来,堆积起来。看样子activemq还在升级中。 activemq工作模型比较简单。只有两种模式 queue,topics 。 queue就多对一,producer往queue里发送消息,消费者从queue里取,消费一条,就从queue里移除一条

RabbitMQ实战

最后都变了- 提交于 2019-11-30 21:19:13
第2章 理解消息通信 2.2 此底部开始构造:队列 信道(channel)是建立在TCP连接上的虚拟连接。因为如果每个生产者/消费者都使用真实的TCP连接的话,每一个线程连接到RabbitMQ,都会建立一个TCP连接,不仅会造成TCP连接的巨大浪费(创建和销毁TCP回话开销很大),而且操作系统每秒也就只能建立这点数量的连接,很快就会碰到性能瓶颈。 如图,一条电缆(TCP连接)有许多光纤束(信道),运行所有连接的线程通过多条光纤束同时进行传输和接收。 当一个RabbitMQ队列有多个消费者时,队列收到的消息将以循环的方式发送给消费者,每个消息只发送给一个订阅的消费者。 消费者接收到的每一条消息都必须进行确认 或者在订阅到队列的时候讲auto_ack参数设置为true 当设置了auto_ack时,一旦消费者接收消息,RabbitMQ会自动视其确认了消息。消费者通过确认命令告诉RabbitMQ它已经正确接收了消息,此时RabbitMQ才能安全地把消息从队列中删除。 如果消费者收到一条消息,但是确认之前从Rabbit断开连接(或者从队列上取消了订阅),RabbitMQ会认为这条消息没有分发, 然后重新分发给下一个订阅的消费者 。另一方面,如果消费者没有确认消息, Rabbit讲不会给该消费者发送更多消息 ,这是因为在上一条消息被确认之前,Rabbit会认为这个消费者没有准备好接收下一条消息

1、RabbitMQ的简单使用

半腔热情 提交于 2019-11-30 21:13:45
1、AMQP AMQP,即Advanced Message Queuing Protocol,一个提供统一消息服务的应用层标准高级 消息 队列协议,是 应用层 协议的一个开放标准,为面向消息的中间件设计。基于此协议的客户端与消息中间件可传递消息,并不受客户端/ 中间件 不同产品,不同的开发语言等条件的限制。 Erlang 中的实现有 RabbitMQ 等。 2、RabbitMQ 1、Erlang语言 Erlang是一种 通用的并发程序设计语言 ,它由乔·阿姆斯特朗(Joe Armstrong)在瑞典电信设备制造商爱立信所辖的计算机科学研究室开发,目的是创造一种可以应付大规模开发活动的程序设计语言和运行环境。Erlang于1987年发布正式版本,最早是爱立信拥有的私有软件,经过十年的发展,于1998年发表开放源代码版本。 Erlang是运作于虚拟机的解释型语言,但是现在也包含有乌普萨拉大学高性能Erlang计划(HiPE)[3]开发的原生代码编译器,自R11B-4版本开始,Erlang也支持脚本方式执行。在编程范型上,Erlang属于多重典范编程语言,涵盖函数式、并行及分布式。循序运行的Erlang是一个及早求值, 单次赋值和动态类型的函数式编程语言。 2、消息队列(Message Queue) 在计算机科学中,消息队列(英语:Message queue