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

先网站开发后软件开发人气最旺的微信公众号

先网站开发后软件开发,人气最旺的微信公众号,做一个网上商城网站建设费用多少钱,凡科网站怎么做友情链接目录 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述2、队列持久化3、消息持久化4、交换器持久化 二、RabbitMQ 知识扩展 1、内存告警与内存换页2、磁盘告警与配置3、数据写入磁盘时机4、磁盘消息格式5、磁盘文件删除机制 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述…目录 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述2、队列持久化3、消息持久化4、交换器持久化 二、RabbitMQ 知识扩展 1、内存告警与内存换页2、磁盘告警与配置3、数据写入磁盘时机4、磁盘消息格式5、磁盘文件删除机制 一、RabbitMQ 持久化机制 1、RabbitMQ 持久化概述 持久化即将原本存在于内存中的数据写入到磁盘上永久保存数据防止服务宕机时内存数据的丢失。 Rabbitmq 的持久化分为队列持久化、消息持久化和交换器持久化。 对于消息来说不管是持久化的消息还是非持久化的消息都可以被写入到磁盘。持久化的消息会同时写入磁盘和内存加快读取速度非持久化消息会在内存不够用时将消息写入磁盘一般重启之后就没有了。 2、队列持久化 队列的持久化是在定义队列时的通过 durable 参数来决定的当 durable 为 true 时才代表队列会持久化。例如 Connection connection connectionFactory.newConnection(); Channel channel connection.createChannel(); //第二个餐胡设置为true代表队列持久化 channel.queueDeclare(queue.persistent.name, true, false, false, null);关键的是第二个参数设置为 true即 durable true。Channel 类中 queueDeclare 的完整定义如下 Queue.DeclareOk queueDeclare(String queue, boolean durable, boolean exclusive, boolean autoDelete,MapString, Object arguments) throws IOException;参数说明 queuequeue 的名称exclusive排他队列如果一个队列被声明为排他队列该队列仅对首次申明它的连接可见并在连接断开时自动删除。这里需要注意三点 排他队列是基于连接可见的同一连接的不同信道是可以同时访问同一连接创建的排他队列“首次”如果一个连接已经声明了一个排他队列其他连接是不允许建立同名的排他队列的这个与普通队列不同即使该队列是持久化的一旦连接关闭或者客户端退出该排他队列都会被自动删除的这种队列适用于一个客户端发送读取消息的应用场景。 autoDelete自动删除如果该队列没有任何订阅的消费者的话该队列会被自动删除。这种队列适用于临时队列。 总结如果将 queue 的持久化标识 durable 设置为 true则代表是一个持久的队列。当服务重启之后队列仍然会存在这是因为服务会把持久化的 queue 存放在硬盘上当服务重启的时候会重新加载这些被持久化的 queue。 3、消息持久化 队列是可以被持久化但是里面的消息是否为持久化那还要看消息的持久化设置。也就是说重启之前 queue 里面如果还有未发出去的消息的话重启之后消息是否还存在队列里面就要取决于在发送消息时对消息的设置。 消息持久化的实现需要在发送消息时设置消息的持久化标识例如 channel.basicPublish(exchange01, routing_key01, MessageProperties.PERSISTENT_TEXT_PLAIN, persistent_message.getBytes());方法原型是 void basicPublish(String exchange, String routingKey, BasicProperties props, byte[] body) throws IOException;这里关键的是 BasicProperties props 这个参数它的定义如下 public BasicProperties(String contentType,//消息类型如text/plainString contentEncoding,//编码MapString,Object headers,Integer deliveryMode,//1:nonpersistent 2:persistentInteger priority,//优先级String correlationId,String replyTo,//反馈队列String expiration,//expiration到期时间String messageId,Date timestamp,String type,String userId,String appId,String clusterId )其中 deliveryMode1 代表不持久化deliveryMode2 代表持久化。而代码实现中的 MessageProperties.PERSISTENT_PLAIN 值是官方提供的一个将 deliveryMode 设置为 2 的 BasicProperties 的对象 public static final BasicProperties PERSISTENT_TEXT_PLAIN new BasicProperties(text/plain,null,null,2,0, null, null, null,null, null, null, null,null, null);除此之外我们也可以使用另一种方式来设置消息持久化标志位 AMQP.BasicProperties.Builder builder new AMQP.BasicProperties.Builder(); builder.deliveryMode(2); // 将 deliveryMode 值设置为 2 表示消息持久化 AMQP.BasicProperties properties builder.build(); channel.basicPublish(exchange01, routing_key01, properties, persistent_message.getBytes());至此我们可以知道当 broker 服务其重启后想要消息不丢失既需要设置队列持久化也需要设置消息持久化。 扩展知识 basicPublish 方法还有另外两个重载方法 void basicPublish(String exchange, String routingKey, boolean mandatory, BasicProperties props, byte[] body)throws IOException; void basicPublish(String exchange, String routingKey, boolean mandatory, boolean immediate, BasicProperties props, byte[] body)throws IOException;这里有两个关键的参数mandatory 和 immediate。这两个标识位都有当消息传递过程中不可达目的地时将消息返回给生产者的功能。下面简单讲解下这两个标识位 1mandatory 当 mandatory 标志位设置为 true 时如果 exchange 根据自身类型和消息 routeKey 无法找到一个符合条件的 queue那么会调用 basic.return 方法将消息返回给生产者Basic.Return Content-Header Content-Body当 mandatory 设置为 false 时如果出现上述情形的话broker 会直接将消息扔掉。 2immediate 当 immediate 标志位设置为 true 时如果 exchange 在将消息路由到 queue(s) 时发现对于的 queue 上么有消费者那么这条消息不会放入队列中。当与消息 routeKey 关联的所有 queue一个或者多个都没有消费者时该消息会通过 basic.return 方法返还给生产者。 概括来说就是 mandatory 标志告诉服务器至少将该消息 route 到一个队列中否则将消息返还给生产者immediate 标志告诉服务器如果该消息关联的 queue上有消费者则马上将消息投递给它如果所有 queue 都没有消费者直接把消息返还给生产者不用将消息入队列等待消费者了。 4、交换器持久化 对于消息的可靠性来说只需要设置队列的持久化和消息的持久化即可。exchange 的持久化并没有什么影响但是如果 exchange 不设置持久化的话当 broker 服务重启之后exchange 将不复存在这样会导致消息发送者 producer 无法正常发送消息。 所以建议同样设置 exchange 的持久化。而 exchange 的持久化设置也特别简单设置方法原型如下 Exchange.DeclareOk exchangeDeclare(String exchange,String type,boolean durable)throws IOException;exchange交换器的名称type交换器的类型常见的如 fanout direct topicdurable持久话标志位 durable 设置为 true 表示持久化 反之为非持久 。 所以只需要在声明的时候将 durable 字段设置为 true 即可 channel.exchangeDeclare(exchangeName, “direct/topic/header/fanout”, true);二、RabbitMQ 知识扩展 1、内存告警与内存换页 1-1、内存告警 当内存使用超过配置的阈值时RabbitMQ 会暂时阻塞客户端的连接并停止接收从客户端发来的消息以避免服务崩溃客户端与服务端的心跳检测也会失败。 当出现内存告警时可以通过管理命令临时调整内存大小 RabbitMQctl set_vm_memory_high_watermark fractionfraction 为内存阈值RabbitMQ 默认是 0.4表示当 RabbitMQ 使用的内存超过总内存的 40% 时就会产生告警并阻塞所有生产则连接。 通过此命令修改的阈值在 RabbitMQ 重启之后将会失效如果想要设置的阈值永久有效需要修改配置文件 # 相对值也就是前面的fraction建议设置在0.4~0.66之间不要超过0.7 vm_memory_high_watermark.relative0.4 # 绝对值单位为KB,MB,GB,对应的临时命令是RabbitMQctl set_vm_memory_high_watermark absolute value #vm_memory_high_watermark.absolute1GB修改完配置文件后需要重启服务才会生效。 1-2、内存换页 在某个 broker 节点触及内存阈值并阻塞生产者之前它会尝试将队列内存中的消息换页存储到磁盘以释放内存空间。持久化和非持久化的消息都会被转储到磁盘中其中持久化的消息本身就在磁盘中有一个备份所以这里会将持久化的消息直接从内存中清除掉。 默认情况下在内存使用达到设置的阈值的 50% 时会进行换页操作。也就是说在默认的内存阈值 40% 的情况下当内存超过 40% * 50% 20% 时会经行换页动作。 内存换页阈值可以通过在配置文件中设置来进行调整 vm_memory_high_watermark_paging_ratio0.75上面的配置将会在 RabbitMQ 内存使用率达到 30%假设内存阈值是 0.4时进行换页动作并在 40% 时阻塞生产者当 vm_memory_high_watermark_paging_ratio 的值大于 1 时相当于禁用了换页功能。 2、磁盘告警与配置 2-1、磁盘告警 当磁盘剩余空间低于设置的阈值时RabbitMQ 同样会阻塞生产者这样可以避免因非持久化的消息持续换页而耗尽磁盘空间导致服务崩溃。 默认情况下磁盘的阈值是50M表示当磁盘剩余空间低于50M时会阻塞生产者并停止内存中消息的换页动作。这个阈值的设置可以减小但不能完全消除因磁盘耗尽而导致崩溃的可能性。比如在两次磁盘空间检测期间内磁盘空间从大于50M被耗尽到0M。 2-2、修改磁盘告警阈值 可以通过以下命令临时调整磁盘阈值 #设置具体大小单位为KB/MB/GB RabbitMQctl set_disk_free_limit disk_limit #设置相对值建议取值为1.0~2.0相对于内存的倍数如内存大小是8G,若为1.0则表示磁盘剩余8G时阻塞 RabbitMQctl set_disk_free_limit mem_relative fraction如果要永久生效需要对应的配置文件配置如下需要重启生效 disk_free_limit.relative2.0 #disk_free_limit_absolute50MB这里有个建议一个相对谨慎的做法是将磁盘阈值设置为与操作系统所显示的内存大小一致。 3、数据写入磁盘时机 消息的正常写入磁盘流程为消息数据写入到缓存 Buffer 中大小为 1 MBuffer 数据满了之后会写入内存文件中最后再刷新到磁盘文件中存在个固定的刷盘时间25ms也就是不管 Buffe r满不满每隔 25msBuffer 里的数据及未刷新到磁盘的文件内容必定会刷到磁盘每次消息写入后如果没有后续写入请求则会直接将已写入的消息刷到磁盘使用 Erlang 的 receive x after 0 来实现。只要进程的信箱里没有消息则产生一个 timeout 消息而 timeout 会触发刷盘操作。 4、磁盘消息格式 消息保存于 $MNESIA/msg_store_persistent/x.rdq 文件中其中 x 为数字编号从 1 开始每个文件最大为 16M16777216超过这个大小会生成新的文件文件编号加 1。 文件中的消息格式如下 Size:64, MsgId:16/binary, MsgBodyMsgId 为 RabbitMQ 通过 rabbit_guid:gen() 每一个消息生成的 GUIDMsgBody 会包含消息对应的 exchangerouting_keys消息的内容消息对应的协议版本消息内容格式二进制还是其它等等。 5、磁盘文件删除机制 当所有磁盘文件中的垃圾消息已经被删除的消息比例大于阈值GARBAGE_FRACTION 0.5时会触发文件合并操作至少有三个文件存在的情况下以提高磁盘利用率。publish 消息时写入内容ack 消息时删除内容更新该文件的有用数据大小当一个文件的有用数据等于 0 时删除该文件。 相关官方文档 https://blog.RabbitMQ.com/posts/2011/01/RabbitMQ-backing-stores-databases-and-diskshttps://www.RabbitMQ.com/persistence-conf.html
http://www.dnsts.com.cn/news/52541.html

相关文章:

  • 做女团学什么舞蹈视频网站网站流量高有什么用
  • 北京网络公司的网站云霄城乡建设局网站
  • 如何在别人的网站模板上加兼容网站建设市场推广招聘
  • 加强网站信息建设泰安明航网络科技有限公司
  • 做设计有哪些好用的素材网站国内装饰行业网站制作
  • 做论坛网站的cms如何在拼多多开网店
  • 做宠物服务的相关网站企业微网站怎么建设
  • 长沙公司做网站网站内搜索关键字
  • 婚纱网站设计首页建设小程序怎么挂失
  • 网站模板文件在哪里下载网页链接调用服务需要开启还是关闭
  • 广州制作网站服装公司简介模板
  • 广州比较好的网站建设企业WordPress装不上jetpack
  • 武清做网站品牌推广计划
  • 福建外贸网站建设国外手机html5网站
  • 吉林整站优化免费照片的网站模板免费下载
  • 网站排行榜前十名品牌运营
  • WordPress输入密码可见seo外链怎么做能看到效果
  • 域名查询网站烟台建设集团招聘信息网站
  • 莞城网站推广wordpress模板 免费下载
  • 小学做试卷的网站wordpress 页面标题
  • o2o与网站建设中英企业网站源码
  • 深圳高端网站设计如何微信小程序注册
  • 网页设计师的主要职责网站页面的优化
  • 宁波网站设计服务收费价格福州网站如何制作
  • 新浪博客怎么做网站中国万网域名注册价格
  • 罗湖区网站建设做网站管理好吗
  • 贵港网站制作临安区规划建设局网站
  • 自己设计手机的网站重庆网页设计培训
  • 班级网站自助建设功能wordpress的编辑器插件
  • 百度熊掌号 wordpress上海关键词优化推荐