衡阳县做淘宝网站建设网站托管服务协议
news/
2025/9/22 21:40:30/
文章来源:
衡阳县做淘宝网站建设,网站托管服务协议,网络营销是什么职业,龙海市住房和城乡建设局网站1.什么是RabbitMQ RabbitMQ是一个由erlang开发的AMQP#xff08;Advanced Message Queue #xff09;的开源实现。AMQP 的出现其实也是应了广大人民群众的需求#xff0c;虽然在同步消息通讯的世界里有很多公开标准#xff08;如 COBAR的 IIOP #xff0c;或者是 SOAP 等Advanced Message Queue 的开源实现。AMQP 的出现其实也是应了广大人民群众的需求虽然在同步消息通讯的世界里有很多公开标准如 COBAR的 IIOP 或者是 SOAP 等但是在异步消息处理中却不是这样只有大企业有一些商业实现如微软的 MSMQ IBM 的 Websphere MQ 等因此在 2006 年的 6 月Cisco 、Redhat、iMatix 等联合制定了 AMQP 的公开标准。 RabbitMQ是由RabbitMQ Technologies Ltd开发并且提供商业支持的。该公司在2010年4月被SpringSourceVMWare的一个部门收购。在2013年5月被并入Pivotal。其实VMWarePivotal和EMC本质上是一家的。不同的是VMWare是独立上市子公司而Pivotal是整合了EMC的某些资源现在并没有上市。 RabbitMQ的官网是http://www.rabbitmq.com 百度百科amqp协议介绍https://baike.baidu.com/item/AMQP/8354716?fraladdin 注意:RabbitMQ是采用erlang语言开发的所以必须有erlang环境才可以运行 2.为什么要使用MQ 3.常用消息中间件的对比 4.消息队列RabbitMq的五种形式队列
4.1.点对点(简单)的队列
点对点模式一对一消费一个生产者投递消息给队列只能允许有一个消费者进行消费。 注意如果消费集群的话会进行均摊消费。前提是服务器的配置相同。 均摊消费的弊端假如有2台服务器分别为A、B。如果每个消费处理消息的业务时间不相同的情况下可能对消费者处理慢的服务器不公平(服务器压力大)A处理比B处理时间快应该A处理的消息多一些B处理的消息少一些才合理。 队列以先进先出原则进行存放消息集合。生产者投递消息到队列中。 当消费者启动的时候会与队列服务器建立长连接当生产者有消息投递到队列的时候队列会立刻将消息通知给消费者进行消费。 长连接的好处如果是短链接的话每次访问都需要建立连接比较占内存。建立长连接会减少三次握手提高传输速度。 取消息队列与推送消息队列的区别
取消息生产者投递消息到队列中队列服务器缓存消息。这时候当消费者启动的时候消费者会去向队列服务器中获取消息。 推消息当生产者和消费者都启动的时候生产者向队列投递消息这时候队列会将消息推送给消费者。 4.2.工作(公平性)队列模式
公平队列的原理队列服务器向消费者发送消息的时候消费者采用手动应答模式队列服务器必须要收到消费者发送ack结果通知之后才会继续发送下一个消息。 4.3.发布订阅模式
Direct exchange直连交换机是根据消息携带的路由键routing key将消息投递给对应队列的。 发布订阅实现流程生产者投递消息给交换机交换机根据路由策略(routignKey)转发到不同的队列服务器中缓存然后队列服务器在推送消息给消费者进行消费或者消费者从队列服务器中拉取消息进行消费。 发布订阅实现原理一对多。 这个队列模式是消息队列中最重要的队列了其他的都是在它的基础上进行了扩展。 功能实现一个生产者发送消息多个消费者获取消息同样的消息包括一个生产者一个交换机多个队列多个消费者。 思路解读重点理解 1. 一个生产者多个消费者 2. 每一个消费者都有自己的一个队列 3. 生产者没有直接发消息到队列中而是发送到交换机 4. 每个消费者的队列都绑定到交换机上 5. 消息通过交换机到达每个消费者的队列 该模式就是Fanout Exchange扇型交换机将消息路由给绑定到它身上的所有队列 以用户发邮件案例讲解 注意交换机没有存储消息功能如果消息发送没有绑定消费队列的交换机消息则丢失。在消费者没有启动的情况下生产者投递消息到交换机这时候交换机不知道把消息转发给哪个消费者所以消息会消失。因为交换机没有缓存功能只做转发的功能。 使用场景用户注册→发送邮件→发送短信。 4.4.路由模式RoutingKey
Direct exchange直连交换机是根据消息携带的路由键routing key将消息投递给对应队列的。 生产者发送消息到交换机并指定一个路由key消费者队列绑定到交换机时要制定路由keykey匹配就能接受消息key不匹配就不能接受消息。 例如我们可以把路由key设置为insert 那么消费者队列key指定包含insert才可以接收消息消费者队列key定义为update或者delete就不能接收消息。很好的控制了更新插入和删除的操作。 采用交换机direct模式 流程说明如果生产者投递消息到交换机(exchange),邮件队列和短信队列也都绑定了交换机(exchange)。但是当交换机的类型(typedirect)的时候交换机的转发(路由)由routingKey决定转发给谁。如下如图所示当交换机的rontingKeyemail的时候消息将转发到邮件队列服务然后由邮件消费者进行消费。而短信队列是都收不到消息的因为短信的路由routingKeymsg。如果短信队列也想收到消息就需要修改routingKeyemail才可以收到消息。 这就是交换机类型typedirect的用法及特性。 4.5.通配符模式Topics
说明此模式实在路由key模式的基础上使用了通配符来管理消费者接收消息。生产者P发送消息到交换机Xtypetopic交换机根据绑定队列的routing key的值进行通配符匹配 符号#匹配一个或者多个词lazy.# 可以匹配lazy.irs或者lazy.irs.cor 符号*只能匹配一个词lazy.* 可以匹配lazy.irs或者lazy.cor 消息队列RabbitMQ应答模式
为了确保消息不会丢失RabbitMQ支持消息应答。消费者发送一个消息应答告诉RabbitMQ这个消息已经接收并且处理完毕了。RabbitMQ就可以删除它了。 如果一个消费者挂掉却没有发送应答RabbitMQ会理解为这个消息没有处理完全然后交给另一个消费者去重新处理。这样你就可以确认即使消费者偶尔挂掉也不会丢失任何消息了。 没有任何消息超时限制只有当消费者挂掉时RabbitMQ才会重新投递。即使处理一条消息会花费很长的时间。 消息应答是默认打开的。我们通过显示的设置autoAsktrue关闭这种机制。现即自动应答开一旦我们完成任务消费者会自动发送应答。通知RabbitMQ消息已被处理可以从内存删除。如果消费者因宕机或链接失败等原因没有发送ACK不同于ActiveMQ在RabbitMQ里消息没有过期的概念则RabbitMQ会将消息重新发送给其他监听在队列的下一个消费者。 RabbitMQ的公平转发
目前消息转发机制是平均分配这样就会出现俩个消费者奇数的任务很耗时偶数的任何工作量很小造成的原因就是近当消息到达队列进行转发消息。并不在乎有多少任务消费者并未传递一个应答给RabbitMQ。仅仅盲目转发所有的奇数给一个消费者偶数给另一个消费者。 为了解决这样的问题我们可以使用basicQos方法传递参数为prefetchCount 1。这样告诉RabbitMQ不要在同一时间给一个消费者超过一条消息。 换句话说只有在消费者空闲的时候会发送下一条信息。调度分发消息的方式也就是告诉RabbitMQ每次只给消费者处理一条消息也就是等待消费者处理完毕并自己对刚刚处理的消息进行确认之后才发送下一条消息防止消费者太过于忙碌也防止它太过去清闲。 通过 设置channel.basicQos(1); 消息队列RabbitMQ应答模式
案例: 生产者端代码不变消费者端代码这部分就是用于开启手动应答模式的。 channel.basicConsume(QUEUE_NAME, false, defaultConsumer); 注第二个参数值为false代表关闭RabbitMQ的自动应答机制改为手动应答。 在处理完消息时返回应答状态true表示为自动应答模式。 channel.basicAck(envelope.getDeliveryTag(), false); 传统简单队列是如何实现的
生产者生产消息直接投递给队列服务器队列服务器在以推送消息到消费者或者消费者从队列服务器拉取消息进行消费。消费者启动的时候会与队列服务器建立长连接。 RabbitMQ关键名词
AMQP高级消息队列协议是一个异步消息传递所使用应用层协议规范为面向消息中间件设计基于此协议的客户端与消息中间件可以无视消息来源传递消息不受客户端、消息中间件、不同的开发语言环境等条件的限制 涉及概念解释 Server(Broker):接收客户端连接实现AMQP协议的消息队列和路由功能的进程 Virtual Host虚拟主机的概念类似权限控制组一个Virtual Host里可以有多个Exchange和Queue。 Exchange:交换机接收生产者发送的消息并根据Routing Key将消息路由到服务器中的队列Queue。 ExchangeType:交换机类型决定了路由消息行为RabbitMQ中有三种类型Exchange分别是fanout、direct、topic Message Queue消息队列用于存储还未被消费者消费的消息 Message由Header和body组成Header是由生产者添加的各种属性的集合包括Message是否被持久化、优先级是多少、由哪个Message Queue接收等 body是真正需要发送的数据内容 BindingKey绑定关键字将一个特定的Exchange和一个特定的Queue绑定起来。 RabbitMQ交换机的作用
生产者发送消息不会像传统方式直接将消息投递到队列中而是先将消息投递到交换机中在由交换机转发到具体的队列队列在将消息以推送或者拉取方式给消费者进行消费这和我们之前学习Nginx有点类似。 交换机的作用根据具体的路由策略分发到不同的队列中。 交换机有四种类型 Direct exchange直连交换机是根据消息携带的路由键 routing key将消息投递给对应队列的 Fanout exchange扇型交换机将消息路由给绑定到它身上的所有队列 Topic exchange主题交换机队列通过路由键绑定到交换机上然后交换机根据消息里的路由值将消息路由给一个或多个绑定队列 Headers exchange头交换机类似主题交换机但是头交换机使用多个消息属性来代替路由键建立路由规则。通过判断消息头的值能否与指定的绑定相匹配来确立路由规则。 RabbitMQ消息确认机制
问题产生背景: 生产者发送消息出去之后不知道到底有没有发送到RabbitMQ服务器 默认是不知道的。而且有的时候我们在发送消息之后后面的逻辑出问题了我们不想要发送之前的消息了需要撤回该怎么做。 如果RabbitMQ服务器宕机了消息会丢失吗 答案RabbitMQ服务器支持消息持久化机制会把消息持久化在硬盘上保存。代码设置 channel.queueDeclare(EMAIL_QUEUE, true, false, false, null); 方法第二个参数默认情况下我们应该设置为true。 解决方案: 1.AMQP 事务机制 2.Confir
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/910465.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!