- 博客(24)
- 收藏
- 关注
原创 rocketmq----broker启动流程
broker的启动类在brokerStartUp 的main方法 一。 首先调用createBrokerController方法创建brokerController: NettyClientConfig,NettyServerConfig,BrokerConfig,MessageStoreConfig 这4个配置文件对象的创建,里面都配置了默认值 ...
2019-10-10 17:04:18
533
原创 rocketmq--nameserver的启动流程
1. 入口在 NameserverStartUp 的main方法。 首先调用 createNameserverController 创建nameserverController。 这个方法它会去 创建 NamserverConfig 还有NettyServerConfig 两个配置类对象,他们都是有默认值的,我们可以事先创建好nameserver的配置文件,...
2019-09-19 17:59:23
595
原创 借助Redis实现分布式锁实践。
一.目前主流的分布式锁三种实现方式:1.通过zk实现。2.通过数据库的乐观锁实现。3.通过redis来实现。二.作为一个分布式锁需要注意的4点:互斥性:在任意深刻只有一个客户端中的一个线程能持有锁。 死锁: 持锁的线程崩溃后也有机制让锁自动释放,保证不发生死锁。 容错性 :只要大部分的Redis节点正常运行,客户端就可以加锁和解锁。 解铃还须系铃人。...
2019-03-13 10:55:08
243
原创 rocketmq消费失败重试源码分析。
啃了两天这个功能的源码,涉及了好几个模块,终于把这块逻辑啃完了。看完之后有种豁然开朗的感觉。首先我们要知道一点 消息重试的功能是建立在延迟消费消息这个功能的前提条件之下的。这篇文章会穿插延迟发送消息的一些源码分析。① 当消费者(client)启动的时候,将会调用copySubscription()方法。②消费端拉取到消息后将拉取到的消息List(最多32条)扔给Cousum...
2019-03-04 20:37:38
1743
3
原创 rocketmq:订阅组和消费组的关系。
之前在没看过源码之前对于 订阅组和消费组没有一个清楚的认知。今天就来分析下两者的关系。订阅组:订阅组的创建是依赖于消费组的创建。从订阅组的创建运维命令可以发现。有3个参数是必填(cluster和broker选填一个,最佳实践肯定是选择把cluster给填了), -n和-c或者-b肯定不用说的,nameserver地址和cluster名称或者broker地址肯定是要填上的,因为在cluste...
2019-03-04 11:05:09
18490
1
原创 rocketmq 自动创建topic的过程分析以及为什么自动创建topic可能会导致负载不均衡的情况
昨天在rocketmq官方钉钉群里面看到了一个人发了如下问题,没人解答,发现自己之前阅读过相关源码。给予了回复。记录下来client本地首先没有缓存对应topic的路由信息,然后先去nameserver去查找,nameserver中也没有此topic的路由信息,然后返回给client。client接收到返回后再向nameserver请求topic为tbw102的路由信息。如果有broker...
2019-02-19 16:02:07
6911
2
原创 broker异常恢复情况下 消息重复消费问题。
之前在学习rocketmq源码的时候,阅读了丁老师的《rocketmq技术内幕》在写到broker异常关闭再恢复的情况下会造成大量的消息重复消费问题。我认为这里是有误的。首先我们知道无论broker是否正常异常恢复,都是先恢复逻辑队列CousumeQueue的。然后再根据本地store目录下是否有abort文件来判断关闭的时候是正常还是异常。abort:当我们正常启动一个broker时...
2019-02-14 17:19:42
1281
5
原创 rocketmq: broker集群之间的brokerName命名是否可以一致。
今天回顾了下broker与nameserver之间建立连接之后30S一次的心跳测试源码和创建topic过程中broker主动推送topicConfig到Nameserver的源码(实际上心跳测试调用的方法和推送创建topic过程中broker主动推送topicConfig调用的方法是一样的,最终都是调用doRegisterBrokerAll())。心里有两个疑惑产生:1.我们知道创建一个新的t...
2019-02-12 11:30:02
7234
1
原创 rocketMq刷盘源码分析
最近阅读了rocketMQ的刷盘源码。做个总结首先我们都知道刷盘分为 同步刷盘和异步刷盘两种。一个消息发送到broker无非就是broker底层的通信框架netty接收到了一个请求然后转交给一个工作线程来处理这个请求然后返回。那么如何处理这个请求的过程都在broker包下面的SendMessageProcess类当中。我们来看下处理请求的核心方法 private Remoting...
2019-01-15 18:23:33
989
原创 broker的恢复过程
broker的启动恢复过程:0.首先检查broker是正常关闭还是异常关闭的,如何判断这个broker是正常关闭还是异常关闭只需要判断store目录下的abort文件是否存在,如果是正常关闭的情况下,rocketmq注册了一个钩子函数,在jvm关闭的时候会去调用这个钩子函数,这个钩子函数会去删除abort这个文件,那么也就意味着如果是正常关闭这个文件应该是不存在的。 1...
2019-01-11 14:26:21
491
原创 Springmvc 如何接收java8的时间localDateTime。
最近新起了项目用了LocalDateTime作为时间处理对象。(java8开始有的)发现在前端传来的json串中如果传了形如 "2018-12-4 10:12:46"想直接解析成localDateTime会报错。 原因在于缺少了jackson的jsr310包,还有就是对应的时间上面必须加上@Jsonfromat注解。 @DateTimeFormat(pat...
2018-12-04 10:20:09
7389
1
转载 Redis 哨兵模式
Redis Sentinel机制与用法说明【转】本文来自:https://segmentfault.com/a/1190000002680804概述Redis-Sentinel是Redis官方推荐的高可用性(HA)解决方案,当用Redis做Master-slave的高可用方案时,假如master宕机了,Redis本身(包括它的很多客户端)都没有实现自动进行主备切换,而Redis-sen...
2018-10-08 13:43:57
207
转载 同步IO,异步IO,阻塞IO,非阻塞IO
最近在看redis,对于其IO模型采用非阻塞IO感到不是很理解。之所以不理解最大的原因在于对同步IO,异步IO,阻塞IO,非阻塞IO这四个概念的模糊。这里特意查阅了相关资料进行了一个整理,梳理。 IO模型这里统一使用Linux下,用户进程调用recv作为例子,它用于从套接字上接收一个消息,因为是一个系统调用,所以调用时会从用户进程空间切换到内核空间运行一段时间再切换回...
2018-09-18 14:53:55
242
原创 正确理解ThreadLocal
网络上那些讲的真的有毒。还是翻源码最最靠谱。首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的。各个线程中访问的是不同的对象。 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal....
2018-09-14 11:11:30
141
原创 String “==” 的小结
1、String 常量池 为了减少在JVM中创建的字符串的数量,字符串类维护了一个字符串池,每当代码创建字符串常量时,JVM会首先检查字符串常量池。如果字符串已经存在池中,就返回池中的实例引用。如果字符串不在池中,就会实例化一个字符串并放到池中。 Note:常量池在java用于保存在编译期已确定的,已编译的class文件中的一份数据。它包括了关于类,方法,接口等中的常量,也包括字符...
2018-09-07 10:33:24
194
原创 分布式的CAP
CAP定理2000年7月,来自加州大学伯克利分校的Eric Brewer教授注 在ACM PODC(Principles of Distributed Computing)会议上,首次提出了著名的CAP猜想注 。2年后,来自麻省理工学院的Seth Gilbert和Nancy Lynch从理论上证明了Brewer教授CAP猜想的可行性注 ,从此,CAP理论正式在学术上成为了分布式计算领域的公认定...
2018-09-03 15:30:18
201
原创 并发下的单例模式写法。
错误示例:public class Singleton { private static Singleton singleton; private Singleton(){} public static Singleton getInstance(){ if(singleton == null){ ...
2018-08-31 11:28:37
199
原创 jdk和jre的区别。
这个问题其实一直困扰了我很久。我也查阅了很多相关的资料,今天打算总结一下。jre是运行环境,如果你只想运行你java程序,就只要装jre就可以 SDK是java的开发工具包 是让你开发java程序,并让其运行使用的,它包括了jre,javac.exe,java.exe,等一系统的开发工具,也包括了api的源码安装Java后有jdk和jre两个文件夹,但jdk下还有一个jre文件夹,而且这个jre比...
2018-02-28 13:39:41
205
原创 设计模式--------适配器模式
适配器模式有三个重要的成员:Target(目标接口),Adaptee(源角色),Adapter(适配器)。 Target(目标接口): 所要转换的期待的接口。(系统中正在使用的接口). Adaptee(源角色):需要适配的接口。(想办法将其嫁接到Target中) Adapter(适配器):将源接口适配...
2018-02-24 16:25:53
147
原创 Spring aop
1.切面(aspect):切面是通知和切点的结合。通知和切点共同定义了切面的全部内容——它是什么,在何时和何处完成其功能。2.连接点(joinpoint):就是程序运行过程中能够插入切面的地方。比如调用一个方法,抛一个异常,修改一个字段等都可以作为连接点3.切点(pointcut):程序中有非常多的连接点,我们的某一个切面不可能全部应用到所有的连接点,则时候就可以使用切点来缩小这个范围。4.通知(
2018-01-18 21:49:00
125
转载 【转发】网络协议的概要
socket 和http的区别:1、TCP连接 手机能够使用联网功能是因为手机底层实现了TCP/IP协议,可以使手机终端通过无线网络建立TCP连接。TCP协议可以对上层网络提供接口,使上层网络数据的传输建立在“无差别”的网络之上。 建立起一个TCP连接需要经过“三次握手”: 第一次握手:客户端发送syn包(syn=j)到服务器,并进入SYN_SE
2017-12-20 10:24:07
189
原创 对于向下转型,变量是否也会向下转型
package com.hh2;public class Father { private User user=new User(30); private String name="zhh"; public void setName(String name){ this.name=name; } public String getName(){
2017-12-11 17:58:20
306
转载 ssm框架配置相关的问题。
context:annotation-config/> : 使用@Autowired注解,必须事先在Spring容器中声明AutowiredAnnotationBeanPostProcessor的Bean:bean class="org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor "/>
2017-12-10 15:13:56
189
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人