自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(57)
  • 资源 (2)
  • 收藏
  • 关注

原创 rmq 主备自动切换模式

有2种方式检测到broker不可用:1、netty层检测到与broker连接断开,比如触发disconnect、close、连接读写空闲(IdleStateEvent)、异常事件时,执行DefaultBrokerHeartbeatManager#onBrokerChannelClose。提交:只确保leader一定会在响应之前执行提交逻辑,follower同步到最新日志时执行提交逻辑,选举时,新当选的leader一定具有所有已提交的日志,并且会在当选时提交一条空日志来确保提交。broker相关类图。

2023-01-03 20:42:02 676

原创 rmq DLedger集群

日志本地写入后,开始同步给Follower,为了实现超时判断,日志同步是在单独的线程中执行的,每条日志在本地写入成功后,会在缓存一个AppendFuture,它是CompletableFuture的可超时的子类,当这条日志过半同步成功并且提交后,执行CompletableFuture.complete,这时才给客户端返回写入成功或超时的响应。如果存在,从截断日志的结束偏移量开始截断。日志的同步分为4个阶段,依次是:比较,截断,追加,提交(COMPARE,TRUNCATE ,APPEND,COMMIT)

2023-01-03 20:38:05 637 1

原创 rmq集群同步复制、异步复制

当没有开启DLeger集群或Controller模式时,rmq集群类型分为多主和多主多从,多主多从又分为异步复制和同步复制。多主多从通过brokerRole配置角色,ASYNC_MASTER、SYNC_MASTER、SLAVE,master的brokerId一定是0,slave的brokerId必须大于0再谈broker的注册在启动和心跳时会向name server发送注册broker请求(REGISTER_BROKER,BrokerController#doRegisterBrokerAll),name

2022-12-03 17:19:17 524

原创 rmq批量消息

因为它在broker端的存储是单条tagsCode为0的消息存储的,如果消费者指定了tags过滤,只要指定的tags的hashcode不为0,所有的消息将在broker端过滤掉,一条都拉取不到。批量消息对生产者来说就是可以一次性发送多条消息,支持同步、异步发送,不支持单向发送,主题和waitStoreMsgOK必须相同,tags可以不同,并且不支持延时消息和事务消息。,而不是先拆分成多条,因此发送结果中也只有一个消息id。最终返回多个消息id,

2022-11-27 16:58:12 391

原创 rmq文件清理策略

DefaultMessageStore在启动时,会开启一个每隔cleanResourceInterval=10s执行一次的文件清理定时任务,检测当前小时是否是deleteWhen=4,来判断是否进行清理,可以配置多个小时数,分号分割,比如"4;CleanConsumeQueueService,索引文件头记录了最大物理偏移量,因此可以清理该值小于最小物理偏移量的文件。CleanConsumeQueueService,根据日志文件的最小物理偏移量来清理消费队列。

2022-11-26 17:03:24 639

原创 rmq nameserver

broker在启动时会执行BrokerController#registerBrokerAll向每台nameserver发起注册broker(RequestCode.REGISTER_BROKER)请求,注册信息包括:brokerClusterName、brokerName、brokerAddr、brokerId、主题配置信息,创建主题时也会发送该请求,nameserver端由DefaultRequestProcessor处理。,如果broker只向其中1台注册,而客户端使用另一台,会找不到主题。

2022-11-20 16:37:26 208

原创 rmq消费者-推模式

每隔20s,获取一次当前消费组订阅的主题队列和clientId,执行队列分配策略得到当前消费者分到的队列,与上一次重平衡的队列RebalanceImpl.processQueueTable进行比较,对新增的队列,创建PullRequest,加入到PullMessageService的阻塞队列messageRequestQueue中,让PullMessageService线程轮询这个队列处理;单个进程,消费端可以创建多个消费组不同的消费者,发心跳时每个消费者对应一个ComusemrData。

2022-11-16 19:58:02 376

原创 rmq-dashboard消息查询

和msgId查询一样,也是RequestCode.QUERY_MESSAGE请求,但是请求的MixAll.UNIQUE_MSG_QUERY_FLAG字段为false,但是可以得到最多64条消息。QueryMessageProcessor负责处理RequestCode.VIEW_MESSAGE_BY_ID和RequestCode.QUERY_MESSAGE请求。生产者也是通过RequestCode.GET_ROUTEINFO_BY_TOPIC请求获取主题的broker和队列的。

2022-11-07 19:49:12 399

原创 rmq发送消息-服务端

并不是直接fileChannel.force,而是创建一个刷盘请求放到写集合,唤醒刷盘线程,刷盘线程交换空的读集合与写集合,遍历读集合中的刷盘请求进行刷盘,而且最少刷盘数是0,这样如果同一时刻有多个刷盘请求,这些请求会在同一批次进行处理,底层只会进行最多2次刷盘。文件结尾处理:如果消息长度+8大于剩余位置长度(文件大小-写入偏移量),则到达结尾,这时写入一条长度为剩余长度的空消息,魔数为BLANK_MAGIC_CODE,普通消息的魔数是MESSAGE_MAGIC_CODE。

2022-11-03 08:42:39 592

原创 rmq创建主题

创建主题时,其实可以不需要指定nameserver,只需要指定broker,并且只会在指定的broker上创建主题,通过nameserver来维护主题到broker的映射关系。使用mqAdmin脚本执行rocketmq的管理命令时,执行的主类是MQAdminStartup,mqAdmin的子命令则对应SubCommand接口的实现类。

2022-11-01 21:07:38 244

原创 rocketmq启动流程

根据配置文件和命令行参数,创建4个配置类:BrokerConfig、NettyServerConfig、NettyClientConfig、MessageStoreConfig,配置文件通过-c参数指定,如果没指定,使用默认配置。用于判断进程上一次是否强制退出,启动时会创建,目录是${user.home}/store/abort,启动失败、或正常退出执行shutdownhook时删除该文件,强制退出执行kill -9时不会删除该文件。创建完4个配置类后,根据配置类创建brokerController,

2022-11-01 20:26:57 1301

原创 rocketmq生产者

不管是同步、异步还是单向发送,都会根据主题先从nameserver获取对应队列所在的broker地址,保存到DefaultMQProducerImpl的topicPublishInfoTable中。远程调用之前报的,比如建立连接失败,发送之前超时了,有几个子类,

2022-10-23 20:47:22 374

原创 断路器CircuitBreaker

滑动时间窗口,记录的是最近n秒的指标。每个元素对应一个秒级的时间戳,移动一格代表时间+1s,当有新的请求时,移动滑动窗口的结束位置直到请求的时间戳,从总指标中删除移动过的元素的指标,重置指标,重设元素的时间戳。固定请求数滑动窗口,统计最近n个请求的指标(慢调用次数,失败次数,总次数,总调用时间)。通过一个环形数组,数组每个元素记录了最近n个请求的指标,维护最近一次调用对应的索引,每次调用时,索引值向后移动一位,将总的指标减去这个元素的指标,重置移动后对应的元素的指标,再将最新的调用指标记录在这个元素上。

2022-09-22 20:58:36 948

原创 OpenFeign

默认是ReflectiveFeign,最终得到的是jdk代理对象,默认的InvocationHandler实现是FeignInvocationHandler,它为方法到methodHandler的映射,将每个方法调用转发到对应的MethodHandler。QueryTemplate、HeaderTemplate和UriTemplate 组合了Template,Template用来表示包含几对大括号的字符串,根据大括号分割,大括号外部的是纯文本,内部的是变量名称,执行时会根据参数动态替换。

2022-09-15 12:57:44 707

原创 SpringRetry

提供给外部调用的重试执行器。

2022-09-14 21:48:36 308

原创 springboot自动配置类

如果为空,执行DeferredImportSelector.selectImports获取。DeferredImportSelector是延迟的,当解析到它时,先不执行它的导入方法,而是暂存起来,等到其他定义方式(@Bean,@Component,@ComponentScan)处理完在处理,使得Springboot的bean定义后于用户的bean定义加载,从而Springboot的bean上的条件注解(比如@ConditionalOnBean)能够根据用户的定义情况起作用。

2022-09-07 17:21:59 591

原创 springboot启动流程

WebApplicationType 根据类路径是否有Servlet和Reactive的类来确定,如果有DispatcherHandler,并且没有DispatcherServlet和org.glassfish.jersey.servlet.ServletContainer,用Reactive,创建AnnotationConfigReactiveWebServerApplicationContext;CommandLineRunner 获取到的是原生的、未解析的main方法参数,

2022-09-07 15:48:18 258

原创 Quartz JobDataMap

作用quartz的job是无状态的,每次调度都会实例化一个新的job实例,如果要在记录job的状态,保留上一次调度的结果,就需要用jobdatamap。使用方法jobDataMap可以跟jobDetail绑定,也可以跟Trigger绑定JobDetail jobDetail = JobBuilder.newJob(MyJob.class) .withIdentity("job1", "group1") .usingJobData("da

2021-04-10 16:03:38 681

原创 反射修改 final

记一次线上事故:原本代码是这样的,线上application.yml中istest=true@Value("${istest}")private boolean istest=false;IDEA提示将该字段用final修饰,结果导致读取到该字段为false。原因是@Value注解的字段是在bean实例化之后,通过反射赋值的,而反射能顺利修改final字段(无报错提示),但由于字符串和基本类型的final字段会经过JVM内联优化,对变量的访问被替换成常量值的访问,导致获取不到修改后的值。即反射能

2021-03-29 20:54:51 828

原创 Redis集群

理论简介能够自动分割数据到不同节点上,扩展存储空间能保证一定程度的可用性,当某些节点挂掉或网络不可达时,集群能继续对外提供服务。但当主节点和对应所有从节点都挂掉时,集群不可用2个端口号注意:redis集群需要开通2个端口,一个是对外暴露的执行redis命令的端口6379,另一个是节点间通信的内部端口,用来交换数据的,在生产环境要注意开通这2个端口的防火墙,不然集群不能正常工作。hash槽redis用了hash槽来实现数据分片,一共有16384个hash槽(0~16383),每个master

2021-03-27 14:53:06 349

原创 RocketMQ广播消息

广播消息是消费者可以设置一个消费模式,集群模式和广播模式,默认的集群模式处于同一消费组的消费者,只会收到订阅主题的一部分消息,实现了消费者负载均衡;而广播模式的消费者会收到所有消息。consumer.setMessageModel(MessageModel.BROADCASTING);生产者发送3条消息,处于同一消费组的2个消费者都收到了3条消息去掉设置广播模式的代码,起2个消费者,再发送一个收到2条,一个收到1条,而原来广播模式的收到全部的3条...

2021-03-24 09:36:07 342

原创 RocketMQ事务消息

半消息在普通消息的基础上增加了2个属性:半消息标志位PROPERTY_TRANSACTION_PREPARED=true,生产者组PROPERTY_PRODUCER_GROUP,broker端将半消息真实主题和队列号保存到属性中,修改主题为RMQ_SYS_TRANS_HALF_TOPIC,队列号固定为0,保存。发送的半消息实际上先存到了broker的一个内部主题RMQ_SYS_TRANS_HALF_TOPIC中,这样对消费者是不可见的,事务提交后,再将消息转存到真正要发送的主题,这样对消费者就可见了。

2021-03-23 21:50:54 256

原创 RocketMQ延时消息

消息在DefaultMessageStore#putMessage时,首先会执行PutMessageHook#executeBeforePutMessage,默认的扩展点中,会将延时级别大于0的消息的主题替换成SCHEDULE_TOPIC_XXXX,队列号替换成延时级别-1(0~17),原主题放入REAL_TOPIC属性,原队列号放入REAL_QID属性。RocketMQ延时消息就是生产端发送时,可以为消息指定一个延迟级别DELAY的消息属性,指定该条消息在指定时间后才能被消费端收到。

2021-03-23 14:48:11 356

原创 RocketMQ过滤消息

TAGS过滤tags是一个消息属性,存储在消息属性properties,对应key是TAGS,代码如下public class Message implements Serializable { private String topic; private int flag; private Map<String, String> properties; private byte[] body; private String transactionId;

2021-03-23 11:18:59 91

原创 RocketMQ顺序消息

rocketmq顺序消息指的是消费者接收顺序和生产者发送顺序一致,生产者在发送消息时,会发送到主题的多个队列,对应不同服务器的broker上,因为服务器处理速度的差异和网络通信延迟,这一批消息在消费时无法保证按照发送顺序接收;生产者的发送方法传入队列选择器和消息的shardingKey,通过将shardingKey与队列总数取模得到队列,使得相同shardingKey的消息分到同一队列。因此解决消息顺序问题要从2个角度出发,首先是生产端,需要保证顺序的同一批消息发到同一队列上。

2021-03-23 10:04:48 333

原创 RocketMQ消息发送方式,消费组,推模式拉模式

生产rocketmq生产者通过构造方法创建,先学习2个构造方法,无参的和带生产者组的,无参的默认生产者组是DEFAULT_PRODUCER,另外生产者组好像跟事务消息有关,后面再学DefaultMQProducer producer = new DefaultMQProducer("myProducer");DefaultMQProducer producer1 = new DefaultMQProducer();消息生产需要指定name server地址,不然会报org.apache.rocke

2021-03-22 16:22:35 1278

原创 rocketmq单机搭建

主要步骤安装jdk1.8下载安装包,rocketmq4.7.1安装包,解压按需修改nameserver JVM堆大小按需修改brokerserver JVM堆大小,编辑broker.conf,配置nameSrvAddr和brokerIP启动nameserver和brokerserver服务端验证消息生产与消费,客户端验证消息生产与消费操作流程配置解压之后放到/opt/rocketmq4.7.1目录,编辑bin/runserver.sh,nameserver启动脚本是bin/mqname

2021-03-19 17:13:06 134

原创 ActiveMQ配置LevelDB集群

基本步骤搭建zk集群

2021-03-19 00:30:49 648

原创 zookeeper集群搭建

主要步骤压缩包拷到各个机器,解压修改conf/zoo.cfg,配置数据目录dataDir,配置机器server.[myid]=ip:port:port,有多少台就配多少个,myid为不能重复的数字,注意有2个端口号,第一个用来正常通讯,比如follower同步leader数据,第二个用来选举leader在dataDir目录下新建myid文件,每台zk对应一个数字分别启动zk,zkServer.sh status查看状态详细步骤复制到/opt下3个目录:分别修改zoo.cfgdataDi

2021-03-18 22:52:38 89

原创 zookeeper事件监听机制

简介zk事件监听命令,加-w:ls -w [path]:监听子节点的增删get -w [path] 数据变化stat -w [path] 节点属性变化zk事件类型:None 连接建立事件NodeCreated,NodeDeleted 节点创建,节点删除NodeDataChanged 节点数据变化NodeChildrenChanged 子节点列表变化DataWatchRemoved 节点监听移除ChildrenWatchRemoved 子节点监听移除ls -w创建节点,并ls

2021-03-18 17:20:16 328

原创 zookeeper Acl权限控制

简介ACL全称Access Controll List,访问控制列表,用来对znode的读写进行权限控制,以保证数据安全性。ACL由3部分组成,权限模式(schema),授权对象(id),权限信息(permission),schema:\id:permission权限模式模式说明world默认,全世界都可以访问ip针对一个或多个IP授权auth用户名密码,明文digest用户名密码,密文授权对象ip的授权对象就是IP地址,一个或多个,逗号分割a

2021-03-18 16:33:11 383

原创 zookeeper数据模型和命令

持久节点create默认创建的就是持久节点,持久节点会话关闭不会自动删除[zk: localhost:2181(CONNECTED) 34] create /persistence_nodeCreated /persistence_nodestat查看节点状态[zk: localhost:2181(CONNECTED) 35] stat /persistence_nodecZxid = 0x15ctime = Thu Mar 18 14:07:38 CST 2021 节点的创建时间mZxi

2021-03-18 14:31:52 72

原创 zookeeper安装

单机安装安装Jdk官网下载安装包apache-zookeeper-3.5.8-bin.tar.gz,解压进入conf目录,cp zoo_sample.cfg zoo.cfgvim zoo.cfg,修改dataDir=/zookeeper/data,该目录为数据目录,不需要手动建,第一次启动会自动创建启动zk,bin/zkServer.sh start,查看状态:bin/zkServer.sh status,停止bin/zkServer.sh stop...

2021-03-17 22:36:52 62

原创 ActiveMQ持久化之jdbc

不带日志的jdbc首先将mysql驱动包复制到activemq的lib目录,然后编辑activemq.xml文件,指定持久化方式为jdbcPesistenAdapter,并配置数据源:<broker><persistenceAdapter> <!--<kahaDB directory="${activemq.data}/kahadb"/>--> <jdbcPersistenceAdapter dataSource="#mysql-d

2021-03-17 20:05:31 141

原创 ActiveMQ消息的可靠性(持久化,事务,签收机制)

文章目录持久化队列持久化主题持久化订阅事务签收持久化队列持久化producer和message可以设置消息的持久化模式,分为持久化(DeliveryMode.PERSISTENT)和非持久化(DeliveryMode.NON_PERSISTENT)2个选项producer.setDeliveryMode(DeliveryMode.PERSISTENT);message.setJMSDeliveryMode(DeliveryMode.PERSISTENT);区别在于服务重启后消息是否会丢失持久

2021-03-13 23:03:31 305

原创 ActiveMQ消息头,消息体,消息属性

文章目录消息头JMSExpirationJMSPriorityJMSMessageID消息体的格式TextMessageMapMessage消息属性消息头JMSExpiration消息的过期时间,是指消息发送到目的地(MQ)的过期时间,不是在MQ的存活时间。默认是0,永不过期message.setJMSExpiration(1000L);//1s未到达Destination,该消息作废producer.send(message, DeliveryMode.PERSISTENT, 4, 1000L)

2021-03-13 18:54:20 702

原创 红黑树

文章目录红黑树的插入红黑树的定义特性红黑树的变换破坏规则的情况及解决红黑树的插入红黑树的定义红黑树首先是一棵二叉查找树(BST),并且符合以下规则:节点是红色或黑色的根节点是黑色的叶子节点是黑色的空节点红色节点的2个子节点一定是黑色的(不能出现红红相邻)任一节点到叶子节点的每条路径中,黑色节点的数目相同特性红黑树是一棵相对平衡的BST,从根节点到叶子节点的最长路径,不超过最短路径的2倍红黑树的变换主要分2种,变色和旋转,都不影响BST的规则。旋转分为左旋和右旋:左旋是右孩子替

2021-01-28 16:49:51 48

原创 ConcurrentHashMap源码分析

jdk1.7 concurrenthashmap构造函数参数有总容量,segment负载因子,并发级别,因为segment数组初始化后无法扩容,因此负载因子是segment内部的负载因子,并发级别是segment数组的大小。实际并发级别=大于等于给定并发级别的最小2的n次方,segment的实际容量=给定总容量/实际并发级别向上取整,大于等于该值的最小2的N次方。初始化时只会初始化第一个segment元素。给定默认值:总容量是16,负载因子0.75,并发级别16。实际默认值:总容量32,因为segme

2021-01-24 23:12:38 115 1

原创 nacos服务发现源码分析

客户端会先从serviceInfoMap缓存中获取服务实例,如果缓存没有才访问接口。执行一个定时10s的更新任务更新缓存。传udp端口号,相当于订阅了该服务。比如客户端1订阅服务2,当服务2中实例上线或下线时,会发送udp给服务1NacosNamingService.getAllInstances(String serviceName, String groupName, List<String> clusters, boolean subscribe) hostReactor

2021-01-20 23:16:45 375

原创 nacos服务注册

版本管理:major.minor.patch, major的改变,向后不兼容,minor新功能的增加,但向后兼容,patch对已有功能的缺陷修复nacos版本是1.4.0遇到个问题:服务端集群模式断点不生效,集群同步的逻辑只能看静态代码了。。服务注册客户端jar包的META-INFO/spring.factories中自动配置类com.alibaba.cloud.nacos.NacosDiscoveryAutoConfiguration,NacosDiscoveryAutoConfiguratio

2021-01-20 23:15:02 313

base64的编码解码

用Java实现base64编码和解码 package base64; public class translate { public int a=0; public char[] list; public translate(){ list=new char[64]; int i; char c='A'; for(i=0;i<26;i++){ list[i]=c; c++; } c='a'; for(i=0;i<26;i++){ list[i+26]=c; c++; } c='0'; for(i=0;i<10;i++){ list[i+52]=c; c++; } list[62]='+'; list[63]='/'; }

2015-11-17

java实现数据库增删改查

java实现数据库增删改查,应用多线程,网络编程

2015-11-14

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除