两个或多个系统间需要通过定时任务来同步数据,异构系弘的不同进程间想互调用 通讯的问题,可以用rabbitmq解决。rabbitmq擅长解决多系统 异构系统音的数据交换,也可以用于系统间服务的相互调用RPC。

AMQP,即Advanced Message Queuing Protocol,高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计。消息中间件主要用于组件之间的解耦,肖息的发关者无需知道消息使用者的存在,反之亦然。

AMQP主要特征是面向消息 队列 路由(点对点和发布 订阅)可靠性 安全。

RabbitMQ是一个开源的AMQP实现,用于分布式系统中存储转发消息 在易用性 扩展性 高可用性方面表现不错。

ConnectionFactory
Connection
Channel都是RabbitMQ对外提供的API中最基本的对象。Connection是RabbitMQ的socket链接,它封装了socket协议相关部分逻辑。ConnectionFactory为Connection的制造工厂。Channel是我们与RabbitMQ打交道的最重要的一个接口,我们大部分的业务操作是在Channel这个接口中完成的,包括定义Queue
定义Exchange
绑定queue与exchange
发布消息等。

Queue:队列,是RabbitMQ的内部的对象,用于存储消息。

RabbitMQ中的消息都能存储在Queue中,生产者下图的P,生产消息并最终投递到Queue中,消费者下图的C,可以从Queue中获取消息并消费。

多个消费者可能订阅同一个Queue,这时Queue中的消息会被平均分摊给多个消费者进行处理,而不是每个消费者都收到所有的消息并处理。

Message
acknowledgement:在实际应用中,可能会发生消费者收到Queue中的消息,但没有处理完成就宕机或出现其它的意外的情况,这种情况下就可能会导致消息丢失。为了避免这咱情况的发生,我们可以要求消费者在消费完消息后发一个回执给RabbitMQ,RabbitMQ收到消息回执(Message
acknowledgment)后才将该消息从Queue中移除;如果RabbitMQ没有收到回执并检测到消费者的RabbitMQ连接断开,刚RabbitMQ会将该消息发送给其他消费者如果 存在多个消费者 进行除理。这里不存在timeout的概念,一个消费者外理消息的时间再长也不会导致该消息被 发送给其他消费者,除非它的RabbitMQ连接断开。

Message
durability:在RabbitMQ服务器重启的情况下,也不会丢失消息,我们可以将Queue与Message都设置为可持久化的durable,这样可以保证绝大部分情况下我们的RabbitMQ消息不会丢失。但依然解决不了小概率丢失事件的发生 比如RabbitMQ服务器已经接收到生产者的消息,但还没来得及持久化该消息时RabbitMQ服务器就断电了,如果我们需要对这种小概率事件也要管理起来,那么我们要用到事务。

Prefetch
count:前面我们讲到如果有多个消费者同时订阅同一个Queue中的消息,Queue中的消息,Queue中的消息会被平摊给多个消费者。这时如果每个消息的处理时间不同,就有可能导致某些消费者一直在忙,而另外一些消费者很快就处理完手洋工作并一直空闲的情况。我们可以通过设置prefetchCount来限制Queue每次发关给每个消费都的消息数,比如我们设prefetchCount=1,则Queue每次给每个消费者发送一条消息;消费者处理完这条消息后Queue会再给该消费者发送一条消息。

Exchange:生产者将消息发送到Exchange(交换器,下图中的x),由于Exchange将消息路由到一个或多个Queue中或丢弃。

RabitMQ中的Exchange有四种类型,不同的类型有着不同的路由策略。

Routeing
key:生产者在将消息发送给Exchange的时候,一般会指定一个routing
key,来指定这个消息的路由规则,而这个routing
key需要与Exchang
Type 及binding
key联合使用才能最终生效。在Exchang
Type与binding
key固定的情况下“在正常使用时一般这些内容都是固定配置好的”,我们的生产者就可以在发送消息给Exchange时,通过指定routing
key来决定消息流向哪里。RabbitMQ为routing
key设定长度为255
bytes.

Binding:RabbitMQ中通过Binding将Exchange与Queue关联起来,这样RabbitMQ就知道如何正确地将消息路由到指定的Queue了。

Binding
key:在绑定Exchange与Queue的同时,一般会指定一个binding
key;消费者将消息发送给Exchange时,一般会指定一个routing
key;当binding
key与routing
key相匹配时,消息将会被路由到对应的Queue中。在绑定多个Queue到同一个Exchange的时候,这些Binding
允许使用相同的binding
key.binding key并不是在所有情况下都生效,它信赖于Exchange
Type,比如fanout烊型的Exchange就会无视binding
key,而是将消息路由到所有绑定到该Exchange的Queue.

Exchange
Type:RabbitMQ常用Exchange
Type有fanout
direct topic headers这四种

上图中,生产者P发送到Exchange
X的所有消息都会路由到图中的两个Queue,并最终被两个消费者c1与c2消费。

direct类型的Exchange
路由规则也很简单,它会把消息路由到那些binding
key与routing
key完全匹配的 Queue中。

以上图的配置为例,我们以routingKey=”error”发送消息到Exchange,则消息会路由到Queue1(amqp.gen-....,这是由RabbitMQ自动生成的Queue名称)和Queue2(amqp.gen-...);如果我们以routingKey=”info”或routingKey=”warning”来发送消息,则消息只会路由到Queue2,如果我们以其他routingKey发送消息,则消息不会路由到这两个Queue中。

key与routing
key,
但这咱严格的匹配方式在很多情况下不能满足实际业务需求。topic类型的Exchange在匹配规则上进行了扩展,它与direct类型的Exchange相似,也是将消息路由到binding
key与routing
key相匹配的Queue中,但这里的匹配规则有些不同:

routing
key为一个句号“.”分隔的字符串我们将被句点号'.'分隔的每一段独立的字符串称为一个单词,如'stock.usd.nyse'

binding key与routing
key一样也是句点号'.'分隔的字符串

binding
key中可以存在两种特殊字符'*'与'#',用于做模糊匹配,其中'*'用于匹配一个单词,'#'用于匹配多个单词也可以为0个。

上图中的配置为例,routingKey=“quick.orange.rabbit”
的消息会同时路由到Q1与Q2,routingKey=”lazy.orange.fox”的消息会路由到Q1与Q2,routingKey='lazy.brown.fox'的消息会路由到Q2,routingKey='lazy.pink.rabbit'的消息会路由到Q2(只会投递Q2-次,虽然这个routingkey与Q2的两个bindingKey都区);routingKey='quick.brown.fox',routingKey='orange',routingKey='quick.orange.male.rabbit'的消息将会被 丢弃,因为它们没有匹配任何bindingKey.

Headers:headers烊型的Exchange不依赖于routing
key与bindingkey的匹配规则来路由消息,而是根据发送的消息内容中的header属性进行匹配。在绑定Queue与Exchange时指定一组键值对;当消息发送到 Exchange时,RabbitMQ会取到该消息的headers(也是一个键值对的形式),对比其中的键值对是否完全匹配Queue与Exchange绑定时指定的键值对;如果完全匹配则消息会路由到该Queue,否则不会路由到Queue.

RPC:MQ本身是基于异步的消息处理,前面的示例中所有的生产者(P)将消息发关到RabbitMQ后不会知道消费者c处理成功或者失败,甚至连有没有消费者来除理这条消息都不知道。但实际的应用场景中,我们很可能需要一些同步等待服务端将我的消息处理完后再进行下一步处理。这相当于RPC(Remote
Procedure Call,远程过程调用)。在RabbitMQ中也支持RPC

RabbitMQ中实现发送请求(消息)时,在消息的属性(MessageProperties,在AMQP协议中定义了14种properties,这些属性会随着消息一起发送)中设置两个值replyTo(一个Queue名称,用于告诉服务处理完成后将通知我的消息发到这个Queue中)和correlationId(此次请求的标识号,服务器外理完成后需要将此属性返还,客户端将根据这个id了解哪条请求被成功执行了或执行失败)

服务器端收到消息并处理

服务器端处理完消息后,将生成一条应答消息到replyTo指定的Queue,同时带上correlationId属性

客户端之前订阅replyTo指定的Queue,从中收到服务器的应答消息后,根据其中的correlationId属性分析哪条请求被执行了,要据执行结果时行后续业务处理。

AMQP协议是一个高级抽象层消息通信协议,RabbitMQ 是AMQP协议的实现。
每个rabbitmq-server叫做一个broker,等着tcp连接进入。
Binding联系Exchane与Queue.
 Routing key由生产者指定。Binding key由消费者指定。二者联合决定一条消息的来去。

rabbitmq 基本信息的更多相关文章

  1. 使用 RabbitMQ 实现异步调用

    目录 引言 启动 RabbitMQ 服务器 运行 rabbitmq 容器 RabbitMQ 控制台 Exchange 和 Queue 开发服务端和客户端 开发服务端 开发客户端 Java Bean 类 ...

  2. RabbitMQ代码第一步

    Hello RabbitMQ 终于到了使用.Net连接RabbitMQ的时候了,我们首先新建一个控制台应用程序,在程序包管理控制器中NuGet中下载 RabbitMQ. Install-Package ...

  3. Python之路-python(rabbitmq、redis)

    一.RabbitMQ队列 安装python rabbitMQ module pip install pika or easy_install pika or 源码 https://pypi.pytho ...

  4. 三.RabbitMQ之异步消息队列(Work Queue)

    上一篇文章简要介绍了RabbitMQ的基本知识点,并且写了一个简单的发送和接收消息的demo.这一篇文章继续介绍关于Work Queue(工作队列)方面的知识点,用于实现多个工作进程的分发式任务. 一 ...

  5. centos7 rabbitmq安装以及应用

    安装单机rabbitmq   1.安装erlang cd /usr.local yum install wget yum install net-tools wget http://erlang.or ...

  6. RabbitMQ单机集群搭建出现Error: unable to perform an operation on node 'rabbit1@ClusterNode1'

    参考链接:https://www.cnblogs.com/daryl/archive/2017/10/13/7645749.html 全部步骤和参考链接相同. 前八部都正常,在第九步会报错Error: ...

  7. RabbitMQ基本用法、消息分发模式、消息持久化、广播模式

    RabbitMQ基本用法 进程queue用于同一父进程创建的子进程间的通信 而RabbitMQ可以在不同父进程间通信(例如在word和QQ间通信) 示例代码 生产端(发送) import pika c ...

  8. IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯(一)

    IdentityServer4 + SignalR Core +RabbitMQ 构建web即时通讯 前言 .net core 2.1已经正式发布了,signalr core1.0随之发布,是时候写个 ...

  9. RabbitMQ学习之队列监控

    对于RabbitMQ的监控,除了服务器基本信息(硬盘.CPU.内存.IO等)以及MQ的进程和端口,我们也可以通过请求url访问管理API监控其集群和队列的情况.在Javaapi 3.6.0以后,cha ...

随机推荐

  1. ubuntu Server 安装 php5

    ubuntu Server 安装 php5 1:如果你的服务器已经安装了apache2组件,那么在安装php5时,可以把对应apache2的php5组件一起安装 sudo apt-get instal ...

  2. jsp中的js嵌入Extjs与后台action交互

    近期做前台须要和后台交互数据,直接使用js一直没实现.最后使用extjs实现了,extjs代码直接嵌入到jsp的js代码中就可以(0跟jsp里使用extjs一样,须要载入extjs的几个文件) < ...

  3. Loadrunner 怎么将response的数据下载下来

    我们请求url时候会遇见返回的数据格式为json格式.但是怎么显示到reply页面呢?其实有一个参数需要设置成0 web_url("GetRequestData", "U ...

  4. 1z0-052 q209_9

    9: You are working on an instance started using the SPFILE. You want to move the Flash Recovery Area ...

  5. eclipse Java compiler level does not match the version of the installed Java project facet.

      eclipse Java compiler level does not match the version of the installed Java project facet. Create ...

  6. ScriptManager.RegisterAsyncPostBackControl 方法

    来源:VS2012帮助文档 用途: 将控件注册为异步回发的触发器 语法: public void RegisterAsyncPostBackControl( Control control ) 参数 ...

  7. 【java设计模式】之 代理(Proxy)模式

    代理模式的核心作用就是通过代理,控制对对象的访问.这跟实际中是一样的,比如说明星都有经纪人,这就是一个代理,比如有人要找某明星拍戏,那么首先处理这事的是他的经纪人,虽然拍戏需要自己拍,但是拍戏前后的一 ...

  8. POJ 3691 DNA repair (DP+AC自动机)

    DNA repair Time Limit: 2000MS   Memory Limit: 65536K Total Submissions: 4815   Accepted: 2237 Descri ...

  9. C# 默认参数/可选参数需要注意

    在使用C#的默认参数/可选参数的时候,需要注意,参数的默认值是在编译的时候,自动加入调用方的. 如我有这样一个方法: public class Name { public void Test(Bool ...

  10. OpenXml读取word内容注意事项

    OpenXml读取word内容注意事项 1.使用OpenXml读取word内容,word后缀必须是".docx":如果word后缀是".doc"需要转成&quo ...