- 博客(74)
- 资源 (1)
- 收藏
- 关注
原创 rocketmq-netty通信设计-request和response
默认情况下:eventLoopGroupBoss线程池1个线程,负责channel的链接eventLoopGroupSelector线程池3个线程,负责IO处理defaultEventExecutorGroup线程池8个线程,负责请求的RemotingCommand编解码NettyRequestProcessor绑定的ExecutorService,默认8个线程,负责处理RemotingCommand的业务处理证据如下。以下是nameServer的启动线程截图。
2025-02-13 18:30:41
770
原创 rocketmq-product-send方法源码分析
product的发送有几种API模式,其实目的都是为了选择MessageQueue默认的发送,是根据topic的队列,做负载均衡的方式,topicPublishInfo内部维护着ThreadLocalIndex对象,做线程级别的负载均衡。而且默认都3次重试机会,意味可以选择不同队列做发送;指定messageQueue,是调用方明确知道发送的MessageQueue,这种失败不会做重试;
2025-01-25 23:49:10
910
原创 rocketmq-MQClientInstance-单进程多生产者组多消费者组的实例模型
查看上图,关键点,在于rocketmq.client.name的配置。默认是DEFAULT,会导致倍数增长。修改后,所有group会共用同一个MQClientInstance。当一个client,订阅多个consumergroup、多个productgroup时。事实上,rocketmq的client端,默认就是倍数增长的。如果没去关注,那么可能就出现程序响应迟钝了。假设订阅2个consumergroup, 线程数量是2倍增加吗?订阅多个,那线程增长就恐怖了。消费者组,是有多个线程去共同协作的。
2025-01-22 18:07:31
277
原创 rocketmq-product-DefaultMQProducer启动流程
1、将producerGroup注册到org.apache.rocketmq.client.impl.factory.MQClientInstance#producerTable变量上。3、启动定时器任务RequestHouseKeepingService1处理响应超时的消息。2、启动定时器任务现成MQClientFactoryScheduledThread。比较简单,不做详细分析了。使用arthas如下。
2025-01-22 17:55:58
429
原创 rocketmq-nameserver-DefaultRequestProcessor详细解读
往topicQueueTable,将注册的brokerName,master节点的topic信息上报到nameserver。前一篇文章,介绍nameserver启动流程,会谈到。包含的brokerName,没有的话,就添加上去。第二步,是检查brokerName的主从节点。第三步,当brokerName的主节点(brokerId = 0)注册时,请求体包含topic信息,更新。前面的步骤没有说,是因为暂时不清楚作用。往brokerAddrTable,相同brokerName情况下,添加主从的信息。
2025-01-15 00:03:25
638
原创 rocketmq-nameserver-启动流程-定时任务-分析
RouteInfoManager内存中,有几个成员变量map,管理topic、broker、心跳等。product、consumer、broker的rpc请求,都会进入该方法。我用的版本是4.9.8,namesrv模块,只有6个文件。这张图,描述了启动的执行流程和定时任务。功能也就意味着比较少。启动流程比较简单,不做详细分析了。使用arthas分析。
2025-01-12 11:51:42
438
原创 rocketmq-push模式-消费侧拉取线程-PullMessageService分析
初始的拉取请求,来源于重平衡线程RebalanceService创建的PullRequest。这里解析下PullRequest的业务含义。比如有一个topic叫TopicAAA,它在3个broker上分别有4个读队列,意味着这个topic下有12个队列。保存在RebalanceImpl的成员变量ConcurrentMap> topicSubscribeInfoTable。假设消费者组有4个client组成。
2024-12-31 17:25:33
1007
原创 rocketmq-push模式-消费侧重平衡-类流程图分析
首先启动时,会从nameserver获取topic的所有queue。这些queue分布在多个broker上。构建了mqSet。再随机从一个broker上,获取当前消费者组,包含的所有消费者List cidAll。将两者排序,根据分配策略,分配当前消费者负责的队列。(比如总共12个队列,4个消费者。当前消费者,负责 4,5,6队列)。如此看,是客户端重平衡。通过排序然后策略分配的方式,实现消费者互不通信的条件下协同合作。启动时,内存都是空,所以会触发构建PullRequest请求体。
2024-12-27 19:00:52
1042
原创 记录spring-boot 3.X版本整合RocketMq
我是从github上fork后下载到本地。使用idea启动nameSrv和broker。注意使用spring-boot 3.x版本后,jdk必须要17以上。所以本地需要安装jdk17。rocketMq我用的是最新的4.X版本4.9.8。版本信息是如何选择的呢?看rocketMq官网。新增application.yml文件。启动就可以看到如下,正常的生产和消费。使用spring-boot的初始化。创建工程并下载放到父工程子目录下。
2024-11-21 22:25:44
1693
原创 缓存数据库一致性解决办法
所谓缓存,实际上就是用空间换时间,准确地说是用更高速的空间来换时间,从而整体上提升读的性能。这篇文章讨论的是 Redis 与 MySQL 的缓存不一致问题,事实上就算是本地缓存,也是一样的问题。根据CAP理论,要实现强一致性,就要牺牲可用性,这会极度降低系统性能。而使用缓存,本地就是为了提升性能。如此,目标是实现最终一致性,并且尽可能降低不一致的时间。
2024-11-19 15:54:51
690
1
原创 配置中心nacos_no1_demo实战
nacos单机部署单机server端部署我本地下载的是2.0.4版本<revision>2.0.4</revision>与springcloud结合nacosSpring Cloud Alibaba VersionSpring Cloud VersionSpring Boot Version2.0.42.2.7.RELEASE*Spring Cloud Hoxton.SR122.3.12.RELEASE版本匹配后,着手开发demo。&
2022-02-28 23:27:12
413
原创 spring-cloud-alibaba学堂准备
学习范围查看wiki 版本说明要学的有5个组件。SentinelNacosRocketMQDubboSeata学习目标关注组件对外提供的特性。1、微服务中的定位2、架构实现分析3、性能参数与同类产品的实现区别,优缺点4、功能特性原理分析5、开发关注的对外暴露的接口,配置属性6、本地完成demo测试方法论1.本次目的是全面掌握spring-cloud-alibaba功能特性。当团队有技术选型的时候,能够准确地判断是否合适2.基于第一点,暂时不做源码级别的原理分析3.参考
2022-02-22 21:28:46
262
原创 spring-boot Fat JAR启动原理
1.FAT JAR目录结构解压后结果drwxr-xr-x 5 hjq staff 160 Dec 3 09:57 .drwxr-xr-x 10 hjq staff 320 Dec 4 11:42 ..drwxr-xr-x 5 hjq staff 160 Dec 2 23:41 BOOT-INFdrwxr-xr-x 5 hjq staff 160 Dec 2 23:41 META-INFdrwxr-xr-x 3 hjq staff 96 Feb 1
2021-12-04 16:46:18
741
原创 java char双字节如何存储Unicode字符
计算机世界,都是二进制组成。最早期,美国出了ascii码标准,只需要1个字节,最多表示128个字符,支持了英语的字符集。全世界这么多国家,这么多种语言,肯定不够。欧洲出了iso编码标准,咱们中国出了gbk,支持中文。编码混乱,自然就要做统一编码标准。所以诞生了Unicode编码,它目标是给全世界所有符号都编码,都有一个唯一的编码。也名万国码,单一码。它总共有三个字节,第一个字节表示平面,设计了17个平面。后两个字节,是实际数据。两个字节,最多表示65536个字符。17个平面,就是最多能表达1百多万个字符。
2021-11-03 10:39:24
548
原创 Innodb的文件
1.参数文件,指向哪里找到数据库文件,初始化参数等2.日志文件。错误日志文件,二进制日志文件,慢查询日志文件,查询日志文件等3.socket文件 UNIX域套接字进行连接时需要的文件4.pid文件 MYSQL实例的进程ID文件5.MYSQL表结构文件 存放mysql表结构定义文件6.存储引擎文件:会有自己的文件保存各种数据,存储了数据和索引参数文件先去读一个配置参数文件。用来寻找数据库各种文件所在位置。mysql --help | grep my.cnf数据库参数包含两类。动态参数,运行
2021-10-22 09:16:41
146
原创 mysql存储引擎区别
FeatureMyISAMBDBMemoryInnoDBArchiveNDB单表存储限制NONOYES64TBNONOtransactios(提交,回滚)NOYESNOYESNONOlock granularity粒度tablepagetablerowrowrowmvcc/snapshot readyesyesyesGeospatial supportYesB-tree indexesY...
2021-10-18 16:34:44
92
原创 mysql慢查询定位 执行计划分析 sql执行顺序
1.慢查询定位:mysql已经内置了慢查询记录功能。默认关闭,需要打开的话,通过系统参数配置。1.修改配置文件my.ini,[mysqld]log_output='FILE,TABLE'slow_query_log='ON'long_query_time=0.0012.命令设置,但是mysql重启后会丢失该配置SET GLOBAL slow_query_log = 'ON';SET GLOBAL log_output = 'FILE,TABLE';SET GLOBAL long_qu
2021-09-03 17:55:16
217
原创 java线程的6种状态.源码有铁证
最近面试多次被问到线程状态了。以前有些印象,但是一直没有深究。回答的不如人意。所以来一次源码探究。最讨厌就是网络的文章,一个个说的有头有脸,线程状态也是命名各种差异。线程的状态,明显是一个枚举类型,所以jdk源码上就有了。java.lang.Thread.State,是Thread类定义的内部类/**A thread state. A thread can be in one of the following states:NEW A thread that has not yet starte
2021-08-20 17:33:22
225
原创 jdk1.8特性介绍和代码例子
java是歪果仁发明的,现在sun公司已经被oracle收购。原来已经好久了。以前总以为java历史久远,其实还没有我年纪大。我想多尝试尝试英语环境。还是多用google和facebook吧ok。java 8 new Feature in oracle,大家一起看看老外的原文。https://www.oracle.com/java/technologies/javase/8-whats-new.html世界好复杂呀,我发现自己也就是单细胞生物,想的太多,做的太少,还是好好专注自己的一亩三分地。做能
2021-08-12 13:56:28
217
原创 Nacos 集群部署模式理解(记录)
nacos部署有三种模式。最近在研究nacos,看到客户端链接服务端。官网的快速开始,只谈到单机模式的情况下,很好理解。客户端上添加配置ip和端口但是生产环境如何部署?client如何服务发现?nacos集群如何负载均衡?带着问题,我查找了资料。第一种,直连模式:生产环境部署模式:nacos集群部署N台客户端链接方式:集群ip和端口,都写在配置文件上。随机选择一台nacos节点通信,实现负载均衡;优点:清晰明白了,没有引入额外的组件。适合中小项目,快速部署和运维缺点:当nacos部署变
2021-05-28 14:49:38
1265
原创 nacos2.0.1 配置中心 使用grpc源码分析
经过大佬指点,选择直接看nacos2.x版本源码,探讨最新的实现方式。1.nacos2.x的架构实现对比1.X的架构,主要是提供了grpc的长连接实现。grpc官网传送门grpc是一个语言无关,平台无关的rpc实现框架,谷歌开源,支持多种编程语言。使用HTTP2.0的特性,支持长连接,服务端推送,header压缩,多路复用。HTTP2.0特性介绍从架构图可以看到,2.x框架,主要是添加了grpc通信实现,是兼容1.x版本。使用grpc,主要是为了解析1.x框架下,http连接带来的.
2021-05-25 18:58:52
6999
2
原创 归并排序和堆排序 java实现
归并排序官方介绍归并排序(Merge Sort)是建立在归并操作上的一种有效,稳定的排序算法,该算法是采用分治法(Divide and Conquer)的一个非常典型的应用。将已有序的子序列合并,得到完全有序的序列;即先使每个子序列有序,再使子序列段间有序。若将两个有序表合并成一个有序表,称为二路归并。用自己的话形容:给一个无序集合数组,使用分治思想,二分法进行拆分,将大问题拆分成小问题,从上往下把问题集合缩小到一,再从下往上,陆续把两个集合归并。从而得到一个有序集合。它的时间复杂性是O(n
2021-04-21 12:20:42
229
原创 nacos-client 监听配置源码分析
配置监听,是要重点分析,代码稍微复杂一些。 /** * Add a listener to the configuration, after the server modified the configuration, the client will use the * incoming listener callback. Recommended asynchronous processing, the application can implement the g
2021-04-12 18:40:35
795
2
原创 nacos-client 推送和移除配置源码
String url = Constants.CONFIG_CONTROLLER_PATH; Map<String, String> params = new HashMap<String, String>(6); params.put("dataId", dataId); params.put("group", group); params.put("content", content); param.
2021-04-12 15:16:34
644
原创 nacos-client 获取配置源码分析
上一篇关于nacos-client启动的分析这一篇文章,是介绍获取配置的实现方式。查看接口com.alibaba.nacos.api.config.ConfigService /** * Get config. * * @param dataId dataId * @param group group * @param timeoutMs read timeout * @return config value
2021-04-12 14:20:47
1652
原创 nacos-client 配置管理ConfigService启动源码分析
当前使用的nacos-client版本是1.4.1看我的上一篇文章,获取nacos java sdk 使用demo我们知道,nacos两大功能是配置管理和服务发现。这篇文章,是介绍配置管理ConfigService启动分析的。生成配置服务类ConfigService//指定nacos服务地址String serverAddr = NacosServerProperties.serverAddr;String dataId = "provider-server";String gr.
2021-04-09 00:07:30
743
原创 nacos java sdk 使用demo
上一篇,介绍了nacos服务端,客户端和springCloud的版本选择。我研究nacos,计划是先把客户端琢磨透,再去看服务端源码。目录1.看官网说明2.跟随官网写demo配置管理demo服务发现demo我的源码下载1.看官网说明java sdk我选择的版本是最新的稳定版本1.4.1<!-- https://mvnrepository.com/artifact/com.alibaba.nacos/nacos-client -->...
2021-03-28 22:07:35
1023
原创 nacos服务端、客户端和springCloud版本说明
最近看消息,nacos已经推出2.0,性能比1.x版本要强十倍。暂时还是选择1.x版本作为我研究的对象,后续再看2.0的新特性。现在nacos1.x的最新Release版本是1.4.1.对于读者的项目,springCloud的版本都不一致。那么我们如何寻找对应的nacos版本呢。还是那句话,不懂得就看官网,再串联起来。nacos服务端版本第一步,先看springCloud版本springCloud官网 https://spring.io/projects/spring-cl...
2021-03-28 10:10:59
17484
3
原创 Hashtable扩容,源码阅读
这篇文章,是笔者学习hash源码的笔记,写作的过程,利于知识梳理,找到盲区。将会分三篇文章。这是第一篇,讲解hashtable扩容。虽然hashtable已经被ConcurrentHashMap取代了,但是源码简单,利于我们理解hash的实现方式。先看hashtable的结构图...
2021-02-24 17:49:06
994
原创 记录postgresql 模糊查询、索引字段使用函数走索引
近段时间,生产环境,数据库质量小组给出了一份sql名单,要优化。主要问题是有两种:大表全表扫描、禁止在索引列上使用函数。大表全表扫描,分三种情况。1、分页查询 limit pageSize offSet pageStart;2、where条件字段没有加索引3、where条件字段是模糊查询第一种情况,暂时还找不到好的办法.不是我们组的sql,所以先忽略;第二种情况,对应字段加索引就行。pg库索引的默认数据结构是b-tree;第三种情况,印象中,模糊查询是不能走索引的。查资料后,发现pg库是可以
2020-11-18 09:05:33
2920
原创 网页布局,左右分栏实现——原来是响应式的锅
开发博客系统,现在要开发 “用户个人空间页”。这次参考csdn的布局它是分左右两栏。它是通过display:left 、 display:right来做左右的。在我个人实践时,当缩小浏览器窗口,**右侧的文章栏 会自动换行。**导致页面很难看我是用bootstrap4 UI框架的。csdn很多页面也是用bootstrap4。通过F12,可以看到class 确实是使用了container但是,这里确实没有用到bootstrap4,而是自定义 响应式属性。导致和我自己引入bootstrap4的
2020-05-21 07:53:49
3459
原创 Spring Security获取登录信息
SecurityContextHolder.getContext().getAuthentication();authentication.getPrincipal()SecurityContextHolder是用于保存SecurityContext。securityContext是一个threadLocal变量authentication包含认证信息Principal是一个Object类型,代用账号密码认证方式时,运行时绑定的是org.springframework.security.core
2020-05-19 14:40:25
608
原创 搭建hive-1.2.2和hadoop2.7.7单机模式
hive依赖hadoop环境。第一步,搭建hadoop环境下载:hadoop-2.7.7下载解压,拷贝到安装目录:注意自己的目录tar -zxvf hadoop-2.7.7.tar.gzmv hadoop-2.7.7 hadoopcp -R hadoop /user/local/soft配置hadoop环境变量JAVA_HOME=/usr/jdkJRE_HOME=/usr/jd...
2020-05-02 09:51:25
525
原创 计算机科学导论第三版 1-5章随笔
下笔前,我在思考,到底随笔要写什么。计算机科学和人文文章,有诸多区别。我们日常接触的新闻媒体,文章,往往有固定的主题,很多文字,是不言自明的。也就是说废话很多。然后,技术书籍,它也有主题,主题确是非常的抽象,它的组成,是一个又一个知识点组成。这些知识点,属于“复合对象”,理解它们比较困难。知识体系,相当于搭建积木,上层(较高抽象)需要下层(较低抽象)支撑。日常生活接触到的知识,层次相对较少;技...
2019-09-10 19:31:07
658
原创 JAVA 注解 介绍
一、来源是什么从JDK1.5之后,开始支持注解。注解的出现,提供配置的功能。往往使用XML来做配置的功能。但是XML意味着要读取文件,编写比较麻烦。而很多场景下,class需要的是简单的配置,而且方便地使用。注解在编译中,嵌入到字节码上。使用java的反射机制,获取到注解。这个机制,从语言层面进行配置支持,极大方便了程序开发,并且被spring、dubbo、mybatis、netty等各...
2019-03-15 16:13:27
283
原创 希尔排序和快速排序,java实现
希尔排序(shell sort)又称为缩小增量排序(diminishing increment sort)。该算法是泛华的插入排序,这是重点。插入排序在输入序列几乎有序的情况下非常高效,希尔排序分多路并使用不同的间距来比较相邻元素,逐步减少间距,最终以1为间距执行一次插入排序。每减少一次间距,序列就会越加相对有序。最后使用插入排序,使得整体有序。 public static...
2019-02-11 21:35:53
269
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人