范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文

RabbitMQ消息的可靠性投递

  RabbitMQ 是实现了高级消息队列协议(AMQP)的开源消息代理软件(亦称面向消息的中间件),广泛微服务系统之间,服务之间消息异步投递。如何保证消息在投递过程的中可靠性呢。下面的文章我这里探讨一下。 服务端确认-Transaction模式。
  1.将chanel设置成事务模式。
  基于Java,api的设置方式。try {             channel.txSelect();             channel.queueDeclare("simple_queue", true, false, false, null);             //创建消息。             String message = "hello keelon";             //发送消息。             /**              * 1.消息要发送的交换机对象,不写使用默认default exchange              * 2.当前的路由地址。路由地址,可以写成队列地址              * 3.附加数据可以不写。              * 4.消息              */             channel.basicPublish("", "simple_queue", null, message.getBytes(StandardCharsets.UTF_8));             channel.txCommit();             connection.close();         }catch (Exception e){          }
  使用springBoot集成的方式。@Test void TestSendMessage(){     rabbitTemplate.setChannelTransacted(true);     rabbitTemplate.convertAndSend("item_topic_exchange","item.add","hello-springBootmq"); }
  服务端确认的事务方式,这个是阻塞的一条消息没有发送完毕。不能发送下一条消息,影响系统的性能。不建议使用。服务端确认-Confirm模式。
  //开启发送方确认的模式 channel.confirmSelect();  channel.basicPublish("fanout_exchange","",null,message.getBytes(StandardCharsets.UTF_8)); if (channel.waitForConfirms()){     System.out.print("消息发送成功"); } channel.close(); connection.close();
  2.异步确认的方式。channel.addConfirmListener(new ConfirmListener() {     @Override     public void handleAck(long deliveryTag, boolean multiple) throws IOException {         System.out.print("Brooker未确认消息,标识"+deliveryTag);         if (multiple){             //headerSet表示后面参数之前的参数全部删除             confirmset.headSet(deliveryTag+1L).clear();         }else {             confirmset.remove(deliveryTag);         }      }      @Override     public void handleNack(long deliveryTag, boolean multiple) throws IOException {          System.out.print(String.format("服务端已经确认消息,标识:%d,多个消息%b",deliveryTag));         if (multiple){             //headerSet表示后面参数之前的参数全部删除             confirmset.headSet(deliveryTag+1L).clear();         }else {             confirmset.remove(deliveryTag);         }      } });
  springBoot的集成的实现。rabbitTemplate.setConfirmCallback(new RabbitTemplate.ConfirmCallback() {         @Override         public void confirm(CorrelationData correlationData, boolean ack, String cause) {                          if (!ack){                 System.out.println("发送消息失败:"+cause);                 throw new RuntimeException("发送消息失败:"+cause);                 //             }          }     });     rabbitTemplate.convertAndSend("item_topic_exchange","item.add","hello-springBootmq"); }路由保证
  在channel中添加listenner监听无法路由的消息。channel.addReturnListener(new ReturnListener() {     @Override     public void handleReturn(int replyCode, String replyText, String exchange, String routingKey, AMQP.BasicProperties basicProperties, byte[] bytes) throws IOException {        System.out.println("监听器收到无法路由,被返回的消息");     } }); 消息的持久化
  消息,交换机,队列的持久化处理。AMQP.BasicProperties properties = new AMQP.BasicProperties.Builder()         .deliveryMode(2)  //2代表持久化         .contentEncoding("UTF-8") //编码         .expiration("10000") //过期时间                  .build();RabbitMQ 集群
  RabbitMQ 最优秀的功能之一就是内建集群,这个功能设计的目的是允许消费者和生产者在节点崩溃的情况下继续运行,以及通过添加更多的节点来线性扩展消息通信吞吐量。RabbitMQ 内部利用 Erlang 提供的分布式通信框架 OTP 来满足上述需求,使客户端在失去一个 RabbitMQ 节点连接的情况下,还是能够重新连接到集群中的任何其他节点继续生产、消费消息。RabbitMQ 集群中的一些概念
  RabbitMQ 会始终记录以下四种类型的内部元数据:队列元数据
  包括队列名称和它们的属性,比如是否可持久化,是否自动删除交换器元数据
  交换器名称、类型、属性绑定元数据
  内部是一张表格记录如何将消息路由到队列vhost 元数据
  为 vhost 内部的队列、交换器、绑定提供命名空间和安全属性
  在单一节点中,RabbitMQ 会将所有这些信息存储在内存中,同时将标记为可持久化的队列、交换器、绑定存储到硬盘上。存到硬盘上可以确保队列和交换器在节点重启后能够重建。而在集群模式下同样也提供两种选择:存到硬盘上(独立节点的默认设置),存在内存中。
  如果在集群中创建队列,集群只会在单个节点而不是所有节点上创建完整的队列信息(元数据、状态、内容)。结果是只有队列的所有者节点知道有关队列的所有信息,因此当集群节点崩溃时,该节点的队列和绑定就消失了,并且任何匹配该队列的绑定的新消息也丢失了。还好RabbitMQ 2.6.0之后提供了镜像队列以避免集群节点故障导致的队列内容不可用。
  RabbitMQ 集群中可以共享 user、vhost、exchange等,所有的数据和状态都是必须在所有节点上复制的,例外就是上面所说的消息队列。RabbitMQ 节点可以动态的加入到集群中。
  当在集群中声明队列、交换器、绑定的时候,这些操作会直到所有集群节点都成功提交元数据变更后才返回。集群中有内存节点和磁盘节点两种类型,内存节点虽然不写入磁盘,但是它的执行比磁盘节点要好。内存节点可以提供出色的性能,磁盘节点能保障配置信息在节点重启后仍然可用,那集群中如何平衡这两者呢?
  RabbitMQ 只要求集群中至少有一个磁盘节点,所有其他节点可以是内存节点,当节点加入火离开集群时,它们必须要将该变更通知到至少一个磁盘节点。如果只有一个磁盘节点,刚好又是该节点崩溃了,那么集群可以继续路由消息,但不能创建队列、创建交换器、创建绑定、添加用户、更改权限、添加或删除集群节点。换句话说集群中的唯一磁盘节点崩溃的话,集群仍然可以运行,但知道该节点恢复,否则无法更改任何东西。RabbitMQ 集群配置和启动
  如果是在一台机器上同时启动多个 RabbitMQ 节点来组建集群的话,只用上面介绍的方式启动第二、第三个节点将会因为节点名称和端口冲突导致启动失败。所以在每次调用 rabbitmq-server 命令前,设置环境变量 RABBITMQ_NODENAME 和 RABBITMQ_NODE_PORT 来明确指定唯一的节点名称和端口。下面的例子端口号从5672开始,每个新启动的节点都加1,节点也分别命名为test_rabbit_1、test_rabbit_2、test_rabbit_3。
  启动第1个节点:RABBITMQ_NODENAME=test_rabbit_1 RABBITMQ_NODE_PORT=5672 ./sbin/rabbitmq-server -detached
  启动第2个节点:RABBITMQ_NODENAME=test_rabbit_2 RABBITMQ_NODE_PORT=5673 ./sbin/rabbitmq-server -detached
  启动第2个节点前建议将 RabbitMQ 默认激活的插件关掉,否则会存在使用了某个插件的端口号冲突,导致节点启动不成功。
  现在第2个节点和第1个节点都是独立节点,它们并不知道其他节点的存在。集群中除第一个节点外后加入的节点需要获取集群中的元数据,所以要先停止 Erlang 节点上运行的 RabbitMQ 应用程序,并重置该节点元数据,再加入并且获取集群的元数据,最后重新启动 RabbitMQ 应用程序。
  停止第2个节点的应用程序:./sbin/rabbitmqctl -n test_rabbit_2 stop_app
  重置第2个节点元数据:./sbin/rabbitmqctl -n test_rabbit_2 reset
  第2节点加入第1个节点组成的集群:./sbin/rabbitmqctl -n test_rabbit_2 join_cluster test_rabbit_1@localhost
  启动第2个节点的应用程序./sbin/rabbitmqctl -n test_rabbit_2 start_app
  第3个节点的配置过程和第2个节点类似:RABBITMQ_NODENAME=test_rabbit_3 RABBITMQ_NODE_PORT=5674 ./sbin/rabbitmq-server -detached  ./sbin/rabbitmqctl -n test_rabbit_3 stop_app  ./sbin/rabbitmqctl -n test_rabbit_3 reset  ./sbin/rabbitmqctl -n test_rabbit_3 join_cluster test_rabbit_1@localhost  ./sbin/rabbitmqctl -n test_rabbit_3 start_app RabbitMQ 集群运维
  停止某个指定的节点,比如停止第2个节点:RABBITMQ_NODENAME=test_rabbit_2 ./sbin/rabbitmqctl stop
  查看节点3的集群状态:./sbin/rabbitmqctl -n test_rabbit_3 cluster_status
  作者:预流
  链接:https://www.jianshu.com/p/79ca08116d57
  来源:简书
  著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

三星宣布将通过Matter标准解决智能家居集成问题据介绍,从2022年开始,三星的SmartThings设备将支持新的Matter标准。新标准旨在让手机智能扬声器和其他设备相互兼容,无论是谁制造的。继亚马逊谷歌和苹果等其他科技巨头人工智能在印度农业转型中的作用农业为印度约58的人口提供了生计。2020财年,渔业林业和农业的总增加值预计为194。8亿卢比。2020财年,包括相关部门在内的农业占印度当前价格的总增加值(GVA)的17。8。在五座入门级suv。比亚迪宋pro现在想买个车,真是太麻烦了,琳琅满目,实在是太难选了,从5万6万,不断的增加预算,一不小心就看到了15万级的了,唉,无奈囊中羞涩,还是想买个入门级suv虽然预算有限,但是配置上还不致自己开心一点,没人能替你坚强人生有很多年还可能走不同的路,总会遇到很多困难和险阻,能不能平稳的绕开或渡过,取决于你的心态。开心一点,没人能替你坚强开心一点,风雨后自会有彩虹。亲戚朋友最好的情况下可能会帮你一把如何设计一个人人都想居住的智慧城市BySwathiYoung在世界各地,政府都面临着快速城市化公民期望提高和对现代基础设施需求的挑战。云计算的出现加速了新技术解决方案的采用,以改善我们的城市和生活质量。智慧城市或社回顾盐田壹海城校区开业游园会,一个周末根本不够玩!原子同学上周末编程机器人主题游园会吸引了不少亲子组合前来玩耍游园会现场一片欢声笑语盐田壹海城校区正式开业暨原子同学七周年校庆公益捐书总结闭幕圆满落幕啦快和小编一起云游园亲临现场参加这场好玩盐田壹海城站游园会嗨浪启动!夏日游玩新体验!原子同学原子同学游园会盐田壹海城校区正式开业暨原子同学七周年校庆公益捐书总结闭幕ONEMALL壹海城位于盐田区C位地标深圳首个在室内即可观海的购物中心我们将在商场一楼中庭进行盐田壹海城校区直击2021广州建博会智能家居边界在融合第23届中国建博会(广州)在7月20日盛大开幕。作为大家居建装行业全球规模第一大展,也是广州战胜5。21疫情后的首场超大规模展会,备受行业与市场期待。今年近2000家参展企业汇聚,赋能智慧城市,实现净零排放世界城市可以在加快建设清洁低碳有弹性和包容性的能源系统方面发挥核心作用。这一想法得到了G20国家气候和能源部长的认可,他们将在意大利担任主席期间在那不勒斯举行会议,重点讨论各国政府物联网助力零售节能和降低成本ByMartinFlusberg几年前,一家全国性的零售商发现,只要做一些简单的操作改变,他们每年就可以节省250多万美元。出于好意的工作人员一直让室外的门几乎一直开着,导致空调系走出课堂,放肆成长!原子同学课外拓展营开启招募通道啦为丰富孩子的课外生活,打破传统教学与局限,原子同学AtomSTEM联合三只熊阿甘游学莱特飞行者瑞欧国际马术学院雄鹰高尔夫学院智立方方块大师开展课外拓展项目,面向全城青少儿招募课外拓
新能源汽车千亿补贴,都到谁兜里了?作者李大鹏出品电动公会还记得四年前北京蟹岛那场大火吗?01hr2017年5月1日中午,北京东部著名土味度假区蟹岛,突然冒出了滚滚黑烟。数十辆消防车迅速赶来,在不断的爆炸声中,消防员12256G再降600,投屏体验骁龙888,很有使用体验努比亚红魔6R,这部发布了三个月的游戏手机,搭载骁龙888处理器,12256GB售价3299,算是比较有性价比的骁龙888手机,而且机身轻薄,只有7。8mm的厚度以及186g的重量明晚13就要发布了深度分析到底是买13还是12?简单总结明晚就是苹果13的发布会你要不就是买13pro和13promax要不然就是直接12千万不要买13原因如下120hz高刷屏只有13p和13pm才会配备A15比A14性能仅仅提电竞显示器主观推荐,各价位区间段有哪些值得买的?前文信息化时代,显示器承载了我们太多的工作学习,以及娱乐生活,很多小伙伴都要与之相伴几小时到十几小时。因此,选好显示器还是相当重要的。也许有人可能会说,不就是显示器吗?只要色彩鲜艳明晚发布!iPhone13售价5499元起,要不要买首发?网友还是12香明晚苹果秋季发布会就要开始了,还有很多小伙伴在犹豫,这新iPhone到底值不值得买呀?以前科技圈都信奉买新不买旧的道理,旧手机没有必要。但现在相信这句话的人慢慢变少,主要是因为新手跟口令说再见工信部要求各家app链接打通9日,工信部有关业务部门召开了屏蔽网址链接问题行政指导会。会上,工信部提出有关即时通信软件的合规标准,要求限期内各平台必须按标准解除屏蔽,否则将依法采取处置措施。当天参会的企业包括整合盒马集市与淘宝买菜,阿里MMC升级为淘菜菜9月14日,阿里巴巴社区电商(MMC)宣布,已整合盒马集市与淘宝买菜,统一升级为新品牌淘菜菜。据了解,淘菜菜将联手社区小店,并打通阿里体系资源。阿里财报数据显示,今年第二季度,包括新机将至,苹果市值却暴跌5400亿元,库克出手也仍无力挽救9月15日是苹果每年一度的重大新品发布日,全新的iPhone13系列将席卷整个全球智能手机市场。然而,就在新机发布前夕,苹果公司的市值却一日蒸发掉约843亿美元,约合5432亿元人vivoX70Pro和小米11ultra怎么选?到了这个价位就要看题主本人对品牌颜值质感的喜好,因为这两个手机在参数配置上该有的都有,各项规格都是顶级的,按需选购即可。追求顶级的拍照参数规格可以选择小米11ultra,硬件参数规智商税就在身边?小米米家空气净化器4Pro打脸高端空净市场要说小米在哪些领域真正做到了性价比极致,有人说是手机,是充电宝,是指纹锁,而其实一直以来真正坚持性价比,不忽悠我们消费者的其实是空气净化器品类。反观现在很多厂商一方面利用甲醛TVO小米手机怎样设置可以播报天气的闹钟?原来方法这么简单分享生活小妙招,共享科技新生活!大家好,欢迎来到今天的知识分享!我是你们的好朋友小俊!很多人都有设置闹钟的习惯,但是我们的小米手机不仅可以设置播报时间的闹钟还可以设置播报天气的闹钟