当前位置: 首页 > news >正文

手机网站描述手机网站封装用户体验

手机网站描述,手机网站封装用户体验,中国国际空间站拒绝十个国家,wordpress评论点赞怎么实现消息何去何从 mandatory和immediate是channel.basicPublish方法的两个参数#xff0c;都有消息传递过程中不可达目的地时将消息返回给生产者的功能。 mandatory参数 true#xff1a;交换器无法根据自身的类型 和路由键找到符合条件的队列#xff0c;rabbitmq调用Basic.Re…消息何去何从 mandatory和immediate是channel.basicPublish方法的两个参数都有消息传递过程中不可达目的地时将消息返回给生产者的功能。 mandatory参数 true交换器无法根据自身的类型 和路由键找到符合条件的队列rabbitmq调用Basic.Return命令将消息返回给生产者 生产者调用channel.addReturnListener添加ReturnListener监听器实现 false消息直接丢弃 immediate参数 告诉服务器至少将该消息路由到一个队列中否则将消息返回给生产者。 Rabbitmq3.0去掉了对immediate参数支持建议采用TTL和DLX方法替代 true如果交换器在将消息路由到队列时发现队列上并不存在任何消费者这条消息将不会存入队列中当与路由键匹配的所有队列都没有消费者时该消息会通过Basic.Return返回至生产者。 备份交换器AE 生产者发送消息不设置mandatory消息未被路由会丢失设置了需要添加ReturnListener。如果不想编程复杂也不想消息丢失使用备份交换器。 使用 声明交换器时添加alternate-exchange参数实现 channel.exchangeDeclare(“myAe”,“fanout”,true,false,null);channel.queueDeclare(“unroutedQueue”,true,false,false,null);channel.queueBind(“unroutedQueue”,“myAe”,“”); 通过策略Policy实现 rabbitmqctl set_policy AE “^normalExchange$” ‘{“alternate-exchange”:“myAE”}’ 特殊情况 如果设置了备份交换器不存在客户端和RabbitMQ服务端都不会有异常出现此时消息会丢失如果备份交换器没有绑定任何队列客户端和rabbitmq服务端都不会有异常出现此时消息会丢失如果备份交换器没有任何匹配的队列客户端和rabbitmq服务端都不会有异常出现此时消息会丢失如果备份交换器和mandatory参数一起使用那么mandatory参数无效 过期时间Time to Live TTL 设置消息TTL 通过队列属性设置队列中所有消息都有相同的过期时间一旦过期就从队列中抹去消息已经在队列头部只要定期从队列头部开始扫描即可 channel.queueDeclare方法中加入x-message-ttl参数实现单位ms MapString,Object args new HashMapString,Object(); args.put(x-message-ttl,6000); channel.queueDeclare(queueName,durable,exclusive,autoDelete,args);通过Policy方式设置ttl rabbitmqctl set_policy TTL .* {message-ttl:6000} --apply-to queue通过调用http api接口设置 通过对消息本身单独设置每条消息的ttl可以不同即使过期也不会马上抹去是否过期是在即将投递到消费者之前判定的 代码设置 设置AMQP.BasicProperties属性set属性deliveryMode持久化消息expirationttl时间 通过 http api接口设置 如果两个方法一起使用消息的ttl以两者之间较小的数值为准消息在队列中一旦超过设置的ttl时就会变成死信消费者将无法再收到该消息 不设置ttl表示此消息不会过期ttl0表示除非此时可以直接将消息投递到消费者否则立即丢弃。 设置队列TTL channel.queueDeclare方法中的x-expires参数可以控制队列被自动删除前处于未使用状态的时间未使用队列上没有任何消费者队列也没有被重新声明并在过期时间段内也未调用过Basic.Get命令 MapString, Object args new HashMapString,Object(); args.put(x-expires, 1800000); channel.queueDeclare(myqueue,false,false,false,args);死信队列 当消息在一个队列中变成死信后能被重新被发送到另一个交换器中这个交换器就是DLX死信交换器绑定DLX的队列就是死信队列 消息变成死信情况 消息被拒绝消息过期队列达到最大长度 当队列中存在死信时rabbitmq会自动将这个消息重新发布到设置的DLX上去进而被路由到另一个队列死信队列可以监听这个队列的消息进行相应处理 设置方法 代码设置 channel.queueDeclare方法中设置x-dead-letter-exchange为队列添加DLX 通过Policy方式设置 延迟队列 延迟队列存储的对象是对应的延迟消息当消息被发送以后并不想让消费者立刻拿到消息而是等待特定时间后消费者才能拿到这个消息进行消费。 场景 订单系统30min内未支付进行异常处理手机遥控设备指定时间工作 通过DLX 和TTL模拟延迟队列的功能。 假设一个应用中需要将每条消息都设置为10秒延迟生产者通过exchange.normal交换器将发送的消息存储在queue.normal队列消费者订阅的是queue.dlx队列当消息从queue.normal整个队列中过期之后被存入queue.dlx队列消费者恰巧消费到了延迟10秒的这条消息。 优先级队列 实现通过设置队列的x-max-priority参数实现 默认最低优先级为0越高越优先消费 前提如果在消费速度大于生成者的速度且broker中没有消息堆积的情况下对发送的消息设置优先级就没什么意义了。 RPC实现 客户端发送请求消息服务端回复响应的消息为了接收响应的消息需要在请求消息中发送一个回调队列 String callbackQueueName channel.queueDeclare().getQueue(); BasicProperties props new BasicProperties.Builder().replyTo(callbackQueueName).build(); channel.basicPublish(,rpc_queue,props,message.getBytes());replyTo用来设置一个回调队列correlationId用来关联请求和其调用RPC之后的回复每一个请求设置一个唯一的correlationId 可以为每一个客户端创建一个单一的回调队列。 持久化 交换器持久化通过在声明队列是将durable参数置为true实现的。如果不持久化rabbitmq服务重启后相关的交换器元数据会丢失消息不丢失只是不能将消息发送到这个交换器中了。队列持久化通过在声明队列时将durable置为true如果不设置持久化rabbitmq重启后相关队列元数据会丢失此时数据也会丢失。消息持久化通过将消息的投递模式BasicProperties中的diliveryMode属性设置为2即可实现消息的持久化设置了队列和消息的持久化rabbitmq服务重启后消息依旧存在。 将交换器、队列、消息都设置持久化后不能保证数据百分百丢失。 生产者确认 确定消息到底有没有正确到达服务器。可以通过事务机制和发送方确认机制 事务机制 rabbitmq客户端与事务机制相关方法 channel.txSelect用于当前的信道设置成事务模式channel.txCommit用于提交事务channel.txRollback用于事务回滚 开启事务流程 客户端发送Tx.select将信道置为事务模式Broker回复Tx.Select-Ok,确认已将信道置为事务模式在发送完消息后客户端发送Tx.Commit提交事务Broker回复Tx.Commit-Ok确认提交事务如果发生异常在捕获异常后channel.txRollback()回滚 缺点会有性能损失 发送方确认机制 生产者将信道设置成confirm模式channel.confirmSelectrabbitmq同意Confirm.Select-Ok一旦信道进入confirm模式所有在该信道上发布的消息都会被指派一个唯一id一旦消息被投递到匹配的队列后rabbitmq会发送一个确认给生产者包含消息唯一id使得生产者知晓消息已经正确到达了目的地。 事务机制在一条消息发送后会使发送端阻塞等待rabbitmq回应后才发下一条消息而发送发确认机制最大好处是异步的。生产者通过回调方法处理该确认消息。如果rabbitmq因自身内部错误导致消息丢失会发送一条nack命令生产者应用程序同样可以在回调方法中处理nack命令。 publisher confirm优势 批量confirm方法每发送一批消息后调用channel.waitForConfirms方法等待服务器的确认返回异步confirm方法提供一个回调方法服务端确认了一条或多条消息后客户端会回调这个方法进行处理。 消费端要点介绍 消息分发 rabbitmq队列拥有多个消费者时队列收到的消息将以轮询的分发方式发送给消费者每条消息只会发送给订阅列表里的一个消费者。 问题如果某些空闲某些忙碌造成整体下降方法channel.basicQos方法允许限制信道上的消费者所能保持的最大未确认消息的数量。如果达到上限就不会向这个消费者再发送任何消息知道消费者确认了某条消息后相应计数减1之后消费者可以继续接受消息。 消息顺序性 指消费者消费到的消息和发送者发布的消息的顺序是一致的。 打破顺序性的情形 如果生产者使用了事务机制发送消息遇到异常进行了事务回滚需重新补偿发送如果是另一个线程实现则出现乱序。如果生产者发送的消息设置了不同的超时时间并设置了死信队列顺序不一致。设置了优先级也不是顺序的。 要保证消息的顺序性需要业务方使用rabbitmq之后进一步处理例如在消息体内添加全局有序标识实现。 弃用QueueingConsumer 缺陷 内存溢出问题队列堆积较多的消息导致消费者客户端内存溢出假死不断堆积 使用Basic.Qos限制某个消费者所保持未确认消息的数量。 会拖累同一个connection下的所有信道性能降低同步递归调用QueueingConsumer会产生死锁rabbitmq的自动连接恢复机制不支持Queueing Consumer这种形式QueueingConsumer不是事件驱动的 消息传输保障 一般消息中间件消息传输保障分为三个层级 最多一次最少一次恰好一次 rabbitmq支持其中的最多一次和最少一次其中最少一次投递实现需要考虑 消息生产者需要开启事务机制或publisher confirm机制以确保消息可以可靠地传输到rabbitmq中消息生产者需要配合使用mandatory参数或者备份交换器来确保消息能够从交换器路由到队列中进而能够保存下来而不会被丢弃消息和队列都需要进行持久化处理以确保rabbitmq服务器在遇到异常情况时不会造成消息丢失消费者在消费消息的同时需要将autoAck设置为false然后通过手动确认的方式去确认已经正确消费的消息以避免在消费端引起不必要的消息丢失。 参考《RabbitMQ实战指南》
http://www.hkea.cn/news/14552782/

相关文章:

  • 中山网站制作专业网站建设公司岳阳
  • 有什么国企是做网站的个人网站 建设
  • 网站建设中要尽量使用图片wordpress卡密网站源码
  • 网站安全代维jsp做的网站答辩问题
  • 怎么注册一个自己的网站查询网站服务器地址
  • 企业网站开发协议wordpress建站收录快
  • 国内专业的网站建设服装效果图网站
  • 网站改版 目的厦门网站建设和空间
  • 深圳网站优化指导哈尔滨站建好了吗
  • 做网站的注意事项如何比较网站
  • 在线制作图片动画效果seo案例分析方案
  • 合肥seo网站多少钱广州抖音seo公司
  • 龙华建设局网站企业网站开发研究现状
  • 一个备案号多个网站德阳响应式网站建设
  • 昆山建设工程招标网站网站已经开发怎样用微信实现手机网站开发
  • 网站项目在哪接dw网页制作教程图片主页子页
  • 椒江建设局网站网站如何做淘宝联盟推广
  • 网站做下CDN防护网站建设验收模板
  • 网站推广总结网站版权符号代码
  • 支付商城网站制作上海做响应式网站的公司
  • 织梦网站导航如何删除怎么做网站免费优化
  • 公司如何做网站推广线下推广方法及策略
  • 免费建设网站怎么样新闻型网站建设
  • 怎么和网站合作推广哪个网站可以改字体
  • 做淘宝客的网站株洲微豆网络科技有限公司网页设计
  • 做360网站优化快速株洲网站制作公司
  • 站内seo的技巧免费ppt模板下载不用钱的
  • 做宠物食品的网站南山区网站建设
  • 专门看网站的浏览器wordpress的标签设置主页
  • iis配置网站无法访问北京网站开发人员