rabbitmq集群-镜像模式
上文参考: rabbitmq集群-普通模式
1. 什么是镜像模式
它和普通集群最大的区别在于 Queue 数据和原数据不再是单独存储在一台机器上,而是同时存储在多台机器上。也就是说每个 RabbitMQ 实例都有一份镜像数据(副本数据)。每次写入消息的时候都会自动把数据同步到多台实例上去,这样一旦其中一台机器发生故障,其他机器还有一份副本数据可以继续提供服务,也就实现了高可用。
2 配置镜像队列
所谓的镜像集群模式并不需要额外搭建,只需要我们将队列配置为镜像队列即可。这个配置可以通过网页配置,也可以通过命令行配置,我们分别来看。
2.1 网页配置
配置页面,我们可以通过配置页面配置不同的policy各参数含义如下:
Name: policy 的名称。
Pattern: queue 的匹配模式(正则表达式)。
Definition:镜像定义,主要有三个参数:ha-mode, ha-params, ha-sync-mode。
ha-mode:指明镜像队列的模式,有效值为 all、exactly、nodes。其中 all 表示在集群中所有的节点上进行镜像(默认即此);exactly ...
RabbitMQ延迟队列
一、说明
在上一篇中,介绍了RabbitMQ中的死信队列是什么,何时使用以及如何使用RabbitMQ的死信队列。相信通过上一篇的学习,对于死信队列已经有了更多的了解,这一篇的内容也跟死信队列息息相关,如果你还不了解死信队列,那么建议你先进行上一篇文章的阅读。这一篇里,我们将继续介绍RabbitMQ的高级特性,通过本篇的学习,你将收获:
什么是延时队列
延时队列使用场景
RabbitMQ中的TTL
如何利用RabbitMQ来实现延时队列
二、本文大纲
以下是本文大纲:本文阅读前,需要对RabbitMQ以及死信队列有一个简单的了解。
三、什么是延时队列
延时队列,首先,它是一种队列,队列意味着内部的元素是有序的,元素出队和入队是有方向性的,元素从一端进入,从另一端取出。其次,延时队列,最重要的特性就体现在它的延时属性上,跟普通的队列不一样的是,普通队列中的元素总是等着希望被早点取出处理,而延时队列中的元素则是希望被在指定时间得到取出和处理,所以延时队列中的元素是都是带时间属性的,通常来说是需要被处理的消息或者任务。简单来说,延时队列就是用来存放需要在指定时间被处理的元素的队列。
...
RabbitMQ死信队列
一、说明
RabbitMQ是流行的开源消息队列系统,使用erlang语言开发,由于其社区活跃度高,维护更新较快,性能稳定,深得很多企业的欢心(当然,也包括我现在所在公司【手动滑稽】)。为了保证订单业务的消息数据不丢失,需要使用到RabbitMQ的死信队列机制,当消息消费发生异常时,将消息投入死信队列中。但由于对死信队列的概念及配置不熟悉,导致曾一度陷入百度的汪洋大海,无法自拔,很多文章都看起来可行,但是实际上却并不能帮我解决实际问题。最终,在官网文档中找到了我想要的答案,通过官网文档的学习,才发现对于死信队列存在一些误解,导致配置死信队列之路困难重重。于是本着记录和分享的精神,将死信队列的概念和配置完整的写下来,以便帮助遇到同样问题的朋友。
二、本文大纲
以下是本文大纲:本文阅读前,需要对RabbitMQ有一个简单的了解,偏向实战配置讲解。
三、死信队列是什么
死信,在官网中对应的单词为“Dead Letter”,可以看出翻译确实非常的简单粗暴。那么死信是个什么东西呢?“死信”是RabbitMQ中的一种消息机制,当你在消费消息时,如果队列里的消息出现以下情况:
消息被否定确认, ...
RabbitMQ如何保证消息的顺序性
1.1 保证顺序性的意义
消息队列中的若干消息如果是对同一个数据进行操作,这些操作具有前后的关系,必须要按前后的顺序执行,否则就会造成数据异常。举例:比如通过mysql binlog进行两个数据库的数据同步,由于对数据库的数据操作是具有顺序性的,如果操作顺序搞反,就会造成不可估量的错误。比如数据库对一条数据依次进行了 插入->更新->删除操作,这个顺序必须是这样,如果在同步过程中,消息的顺序变成了删除->插入->更新,那么原本应该被删除的数据,就没有被删除,造成数据的不一致问题。
1.2 出现顺序错乱的场景
我们还是以RabbitMQ为例,后续会陆续更新更多的MQ的解决方案。
1.2.1 错乱场景一
①一个queue,有多个consumer去消费,这样就会造成顺序的错误,consumer从MQ里面读取数据是有序的,但是每个consumer的执行时间是不固定的,无法保证先读到消息的consumer一定先完成操作,这样就会出现消息并没有按照顺序执行,造成数据顺序错误。
1.2.2 错乱场景二
一个queue对应一个consumer,但是consumer里面进 ...
rabbitmq集群-普通模式_rabbitmq 普通集群
RabbitMQ的Cluster模式分为两种
普通模式
镜像模式
1. 概念解释
1.1 什么是普通模式
普通集群模式,就是将 RabbitMQ 部署到多台服务器上,每个服务器启动一个 RabbitMQ 实例,多个实例之间进行消息通信。此时我们创建的队列 Queue,它的元数据(主要就是 Queue 的一些配置信息)会在所有的 RabbitMQ 实例中进行同步,但是队列中的消息只会存在于一个 RabbitMQ 实例上,而不会同步到其他队列。当我们消费消息的时候,如果连接到了另外一个实例,那么那个实例会通过元数据定位到 Queue 所在的位置,然后访问 Queue 所在的实例,拉取数据过来发送给消费者。这种集群可以提高 RabbitMQ 的消息吞吐能力,但是无法保证高可用,因为一旦一个 RabbitMQ 实例挂了,消息就没法访问了,如果消息队列做了持久化,那么等 RabbitMQ 实例恢复后,就可以继续访问了;如果消息队列没做持久化,那么消息就丢了。大致的流程图如下图:*我们会发现,其实队列的数据只是保存了一份,其他的broker只是保留了元数据而已,用来访问交换机,bindin ...
RabbitMQ消息丢失的场景,MQ消息丢失解决方案
第一种:(生产者)生产者弄丢了数据。生产者将数据发送到 RabbitMQ 的时候,可能数据就在半路给搞丢了,因为网络问题啥的,都有可能。第二种:(服务端)RabbitMQ 弄丢了数据。MQ还没有持久化自己挂了第三种:(消费者)消费端弄丢了数据。刚消费到,还没处理,结果进程挂了,比如重启了。
1.针对生产者
方案1 :开启RabbitMQ事务可以选择用 RabbitMQ 提供的事务功能,就是生产者发送数据之前开启 RabbitMQ 事务channel.txSelect,然后发送消息,如果消息没有成功被 RabbitMQ 接收到,那么生产者会收到异常报错,此时就可以回滚事务channel.txRollback,然后重试发送消息;如果收到了消息,那么可以提交事务channel.txCommit。缺点: RabbitMQ 事务机制是同步的,你提交一个事务之后会阻塞在那儿,采用这种方式基本上吞吐量会下来,因为太耗性能。
方案2: 使用confirm机制事务机制和 confirm 机制最大的不同在于,事务机制是同步的,你提交一个事务之后会阻塞在那儿,但是 confirm 机制是异步的在生产者开启 ...
IDEA断点
前言
[IDEA 断点调试 debug 会用吗?#69_哔哩哔哩_bilibili](https://www.bilibili.com/video/BV1ur4y1P7SV/?spm_id_from=333.1007.top_right_bar_window_history.content.click&vd_source=add54d0fcd49c96c6c124259f9775bc3)
断点的分类
> 行断点:
>
在某一行产生的断点,代码运行到该行停止
详细断点:
1.按住shfit+鼠标左键产生
2.
3.详细断点输出的值
方法断点
在方法上打的断点
会在方法的开始的第一行停止。
在接口中的方法打方法断点: 在运行的时候会停止在该接口的具体类实现中。
最后程序停留在其接口实现类中。
异常断点
在一个启动程序中设置了异常代码,最后会停留在抛出异常的那一行代码处。
属性断点
追踪一个类或者对象属性变化的过程。
断点的使用:
断点条件
+ 给断点设置条件,只有当条件满足的时候,程序才再这里停下来;常用于循环,和多线程调试中
参看调试过程中变量的值 ...
Java常见集合源码分析
ArrayList
概述
实现接口图
RandomAccess :这是一个标志接口,表明实现这个接口的 List 集合是支持 快速随机访问 的。
ArrayList是可以动态增长和缩减的索引序列,它是基于数组实现的List类。
ArrayList也可以储存null值
源码分析
属性
构造方法
核心方法
spirngboot3整合swagger3
参考链接:
SpringBoot3.x使用Swagger - 掘金](https://juejin.cn/post/7299800370489966630#heading-22)
导入依赖:
12345<dependency> <groupId>org.springdoc</groupId> <artifactId>springdoc-openapi-starter-webmvc-ui</artifactId> <version>2.2.0</version></dependency>
配置:
开发环境
开发环境通常会开启Swagger文档,方便前端查阅文档
12345678springdoc: api-docs: enabled: true # 开启OpenApi接口 path: /user-service/v3/api-docs # 自定义文档接口路径,默认为 "/v3/api-docs" swagger-ui: ena ...
SSM学习总结
Mybits:
mybits核心配置文件:
用于配置 MyBatis 的各种参数和属性,以及引入映射文件(Mapper)。
12345678910111213141516171819202122232425262728293031323334353637383940<?xml version="1.0" encoding="UTF-8" ?><!--<!DOCTYPE> 标签:声明了XML文档类型的声明,指定了使用的DTD(文档类型定义)文件的路径和版本。--><!DOCTYPE configuration PUBLIC "-//mybatis.org//DTD Config 3.0//EN" "http://mybatis.org/dtd/mybatis-3-config.dtd"><!--configuration 标签:MyBatis的配置文件必须以这个标签作为根标签,包含了所有的配置信息。--><con ...