- 博客(140)
- 收藏
- 关注
原创 本地限流的常用算法
在大流量app后端模块设计过程中, 接口限流是必须考虑的事情,本文主要聊聊单机限流的一些常用的实现方案, 以及公司实现的一个 本地限制并发数的Throttling简单实现。限流的存在的必要性当下互联网出现突发流量带来的挑战防刷当我们的系统不足以应对当下的流量,那么这个时候我们就需要一种方式阻止流量继续涌入我们的系统,这个时候就需要对用户的请求进行限流常见限流方案限制并发。利用全局计数器。比如计数器总共允许一百个。我们在进入方法的时候将这个计数器加1,然后执行完方法将这个计数器-1..
2021-03-06 12:21:30
644
1
原创 阿里云CDN记录
阿里云CDN 踩坑记录CDN文件上传上传限制300M,超过在小文件传输方面,(图片的话),主要延迟体现在首包时间,TCP时间; 而在像直播流/视频流等大文件传输主要体现在下载时间。在小文件传输方面直播CDN质量标准接入阿里云CDN可以参考以下衡量CDN指标来判断CDN质量:延时:指一个数据包从用户的计算机发送到网站服务器,然后再立即从网站服务器返回用户计算机的来回时间。延时越低,性能越好。下载速度:指用户从网络上或者网络服务器上下载的数据时的传输速度。下载速度越快,性能越好。打开
2020-11-01 10:43:16
602
原创 Redis异地多活原理简介
一、异地多活需要了解的知识什么是异地多活简单来说,就是在不同地域建立数据中心,每个数据中心在日常使用中都需要正常接入业务流量,做业务支撑。异地多活的优势主要体现在以下几个方面。单机房系统架构,一旦机房故障,线上业务中断将会带来不可估量的影响。但是对于异地多活架构的系统来说,如下图:其中地域 1 机房故障,甚至地域 2 机房也故障,只要地域 3 的机房是可用的,流量都可以切到地域 3 机房,线上的业务也不会中断。性能的提升举个简单的例子:从北京到上海共 1468 公里,即使是
2020-07-15 00:15:45
5732
1
原创 Netty Channel参数说明
Channel 通用参数CONNECT_TIMEOUT_MILLIS : Netty参数,连接超时毫秒数,默认值30000毫秒即30秒。MAX_MESSAGES_PER_READ Netty参数,一次Loop读取的最大消息数,对于ServerChannel或者NioByteChannel,默认值为16,其他Channel默认值为1。默认值这样设置,是因为:ServerChannel需要接受足够多的连接,保证大吞吐量,NioByteChannel可以减少不必要的系统调用select。WRITE_
2020-07-08 14:55:04
1522
原创 浅析 CompletableFuture的无锁栈机制
这几天在看公司的BinLogRelover的时候, 看到大佬在WIKI里面特意指出,为何使用Guava提供的ListenableFuture来做一些回调功能, 而且还指出在高并发的场景下Java8提供的CompletableFuture并不如人意,其实我个人还是比较喜欢CompletableFuture的, 哈哈, 可能是以前写代码用的比较多吧。ListenableFuture用的不是很多, 所以优缺点也说不清楚, 但是CompletableFuture经常让人诟病的大概包含两点吧,cancel(tr
2020-05-16 21:00:13
959
原创 Reactor中 publishOn 与 subscribeOn的区别
publishOn 和 subscribeOnpublishOn 和 subscribeOn。这两个方法的作用是指定执行 Reactive Streaming 的 Scheduler(可理解为线程池), 不过这两个方法是用的场景是不相同的.为何需要指定执行 Scheduler 呢?一个显而易见的原因是:组成一个反应式流的代码有快有慢,可能你的下游接口RT是不同的。如果将这些功能都放在一个线程里...
2020-03-21 10:57:52
6282
6
原创 动态规划 - 分割数组的最大值
给定一个非负整数数组和一个整数 m,你需要将这个数组分成 m 个非空的连续子数组。设计一个算法使得这 m 个子数组各自和的最大值最小。注意:数组长度 n 满足以下条件:1 ≤ n ≤ 10001 ≤ m ≤ min(50, n)示例:输入:nums = [7,2,5,10,8]m = 2输出:18解释:一共有四种方法将nums分割为2个子数组。其中最好的方式是将其分...
2020-01-03 23:49:16
1112
原创 内存管理的两种基本方法
段式内存管理事实上,对操作系统和程序员来说,按物理性质来处理内存是不方便的。如果硬件可以提供内存机制,以便将程序员的内存视图映射到实际的物理内存,系统将有更多的自由来管理内存,而程序员将有一个更自然的编程环境。分段提供了这种机制。分段就是支持这种用户视图的内存管理方案。逻辑地址空间是由一组段构成。每个段都有名称和长度。地址指定了段名称和段内偏移。因此用户通过两个量来指定地址:段名称和段偏移。...
2019-12-15 22:54:42
2153
原创 SentinelResource注解
Sentinel 注解Sentinel 提供了 @SentinelResource 注解用于定义资源,并提供了AspectJ 的扩展用于自动定义资源、处理 BlockException 等。使用 Sentinel Annotation AspectJ Extension的时候需要引入 sentinel的aop依赖<dependency> <groupId>co...
2019-12-06 23:17:48
695
原创 Guava Cache的使用
缓存在Guav中的应用Guava Cache与ConcurrentMap很相似,但也不完全一样。最基本的区别是ConcurrentMap会一直保存所有添加的元素,直到显式地移除。相对地,Guava Cache为了限制内存占用,通常都设定为自动回收元素。在某些场景下,尽管LoadingCache 不回收元素,它也是很有用的,因为它会自动加载缓存。通常来说,Guava Cache适用于:你愿意消...
2019-11-17 21:14:55
585
原创 startenv.sh的一点总结
#!/bin/shtomcat:tomcat $CATALINA_BASE/confexport TOMCAT_USER="tomcat"export JAVA_OPTS="-Xms1024m -Xmx1024m -XX:NewSize=256m -XX:PermSize=256m -server -XX:+DisableExplicitGC -Dqunar.logs=$CATALINA_BA...
2019-11-17 21:11:01
378
原创 Dubbo IOC
在Dubbo中, 无论是通过name 获取指定扩展类, 还是自适应扩展,都会在加载完扩展,进行一次依赖注入,我们可以把这个称为Dubbo的IOC机制。例如:private T createExtension(String name) { // throws any possible exception in loading period. findException(name)...
2019-10-27 23:37:14
211
原创 Spring的beanFactory初始化过程分析
这两天对Dubbo代码里面一个使用 FactoryBean的地方有很多疑惑, 才发现自己对我们最熟悉的Spring框架好多地方,都没搞清楚为什么要这样用。废话少说, Spring作为一个IOC工厂, 自然是为了生产Bean而生,那么就去看下Spring是如何管理,并生产Bean的。我直接用 AnnotationConfigApplicationContext 来测试,public stati...
2019-10-23 00:05:29
460
原创 Dubbo 源码阅读1 - SPI 扩展加载class
Dubbo的SPI扩展机制Dubbo 并未使用 Java SPI,而是重新实现了一套功能更强的SPI机制。Dubbo SPI 的相关逻辑被封装在了 ExtensionLoader 类中,通过 ExtensionLoader,我们可以加载指定的实现类。Dubbo SPI 所需的配置文件需放置在 META-INF/dubbo 路径下,配置内容如下。traceFilter=com.qunar.com...
2019-10-03 21:41:45
246
原创 lombok简单使用和原理介绍 - 1
lombok 的使用和简单原理分享Lombok是一个Java库,能自动插入编辑器并构建工具,简化Java开发。通过添加注解的方式,不需要为类编写getter(), setter()或eques()方法,同时可以自动化日志变量。1 如何使用1.1. 添加maven依赖<dependency> <groupId>org.projectlombok</gro...
2019-08-07 23:58:14
226
原创 ZAB协议 对分布式一致性的保证
在前面, 我讲了Raft协议在分布式环境下的作用,这篇讲解ZK的ZAB协议算法。谈到ZAB协议,不得不提的是Paxos算法,可是Paxos就如所有的书和博客里面说的那样,的确让人很难理解,我尝试看了很多相关的资料,对他的概念还是一知半解,raft算是对Paxos的一种可理解的实现。Zab协议 的全称是 Zookeeper Atomic Broadcast (Zookeeper原子广播)。Zo...
2019-07-28 22:32:57
672
原创 回压式 负载均衡的思考
回压策略Gateway维护一个ConcurrentLinkedQueue[WorkRequest],其中WorkRequest里面记录Provider的唯一标志。之后LoadBalance从这个队列里面一直Poll工作请求。如果有则选择对应的Provider打过去,如果没有则循环等待(此时称Provider端对Gateway产生了回压);Provider端注册Listener的时候,告知Ga...
2019-07-26 19:29:24
415
原创 Dubbo中几种负载均衡方式
AbstractLoadBalanceDubbo 中,所有负载均衡实现类均继承自 AbstractLoadBalance,该类实现了 LoadBalance 接口,并封装了一些公共的逻辑。如下 public <T> Invoker<T> select(List<Invoker<T>> invokers, URL url, Invocation ...
2019-07-21 18:24:41
1373
原创 负载均衡策略实现的几点问题
最近参加阿里云举办的天池中间件挑战赛初赛,赛题是设计一个良好的负载均衡策略,能够最大程度保证gateway调用Provoder的成功率。赛题具体就不透漏了,大家可以自己去提交下代码。 话说负载均衡这个东东,在上大学的时候就经常听说,但是自己写代码的时候却不会涉及到,因为这些都是框架在底层处理了。熟悉Dubbo的同学都知道,dubbo有自己的缺省负载均衡策略配置,即RandomLoadBalanc...
2019-07-06 16:48:12
345
原创 ThreadLocal以及FastThreadlocal源码解读
ThreadLocal在线程之间隔离变量十分方便,但是JDK自带的这个东东,也并不是毫无缺点的,这里先不讲他的缺点,因为大多数情况下,JDK的ThreadLocal还是够用的。JDK对ThreadLocal的介绍该类提供了线程局部 (thread-local) 变量。这些变量不同于它们的普通对应物,因为访问某个变量(通过其 get 或 set 方法)的每个线程都有自己的局部变量,它独立于变量的...
2019-07-04 23:54:49
347
原创 Kafka时间轮的设计
Kafka中存在大量的延迟操作,比如延迟生产、延迟拉取以及延迟删除等。Kafka并没有使用JDK自带的Timer或者DelayQueue来实现延迟的功能,而是基于时间轮自定义了一个用于实现延迟功能的定时器(SystemTimer)。JDK的Timer和DelayQueue插入和删除操作的平均时间复杂度为O(nlog(n)),并不能满足Kafka的高性能要求,而基于时间轮可以将插入和删除操作的时间...
2019-06-20 22:12:09
734
原创 零拷贝在Java代码中的应用
一提到零拷贝,大部分都是涉及网络编程中,对代码的性能优化,一直存在操作系统层面。WIKI对零拷贝的定义如下:"Zero-copy" describes computer operations in which the CPU does not perform the task of copying data from one memory area to another.我们看到“零拷贝”...
2019-06-16 19:17:40
728
原创 Kafka消费者那些事...
再均衡再均衡是指分区的所属权从一个消费者转移到另一消费者的行为,它为消费组具备高可用性和伸缩性提供保障,使我们可以既方便 又安全地删除消费组内的消费者或往消费组内添加消 费者。不过在再均衡发生期间,消费组内的消费者是无法读取消息的。 也就是说,在再均衡发生期间的这一小段时间内,消费组会变得不可用 。另外,当 一个分区被重新分配给另一个消费 者时, 消费者当前的状态也会丢失。比如消费者消费完...
2019-06-13 10:51:26
262
原创 Kafka在发送一条消息时经历了什么?
Kafka在发送一条消息到borker之前,需要经过过滤器,序列化器, 分区器。整个生产者客户端由两个线程协调运行,这两个线程分别为主线程 和 Sender线程 。在主线程中由 KafkaProducer创建消息,然后通过可能的拦截器、序列化器和分区器的作用之后缓存到RecordAccumulator中 Sender 线程负责从 RecordAccumulator中获取消息并将其发送到 Ka...
2019-06-11 22:41:28
1258
原创 Raft算法的Java实现
自己这几天在学习Redis的Sentinel高可用解决方案,Sentinel选主使用的是著名的Raft一致性算法,本文对Raft的选主作了介绍,具体的算法内容,请参考 Raft 英文PaperRaft的整体结构Raft 通过选举一个高贵的领导人,然后给予他全部的管理复制日志的责任来实现一致性。而每个 server 都可能会在 3 个身份之间切换:领导者候选者跟随者而影响他们身份...
2019-06-06 11:29:20
13124
7
原创 NIO学习
title: 三言两语之 NIOdate: 2018-3-23 23:02:17categories:- Javatags:- NIO老是说,异步非阻塞,同步非阻塞,异步IO,NIO,同学你能分清吗?NIO的selector是NIO实现非阻塞的关键之处。仅用单个线程来处理多个Channels的好处是,只需要更少的线程来处理通道。事实上,可以只用一个线程处理所有的通道。对于操作系统...
2019-06-05 19:47:24
120
原创 Mybatis源码解析
title: Mybatis源码分析1date: 2018-7-9 14:18:40categories:- Mybatistags:- Mybatis摘要:Mybatis源码学习1暑假看完了《深入Mybatis技术原理》,在这里写了一点对Mybatis运行原理的一点总结。Mybatis的基本构成主要包含了下面几个重要的组件:SqlSessionFactoryBuilde...
2019-06-05 19:46:42
700
原创 线程池源码解析
title: 线程池源码剖析date: 2018-5-21 14:18:40categories:- JDKtags:- JDK- 代码重构- 源码学习摘要:JDK1.8线程池源码剖析多线程编程中,为每一个任务分配一个线程是不可行的。那么,如何来管理我们的线程,减少系统的性能开销就是我们研究线程池的动力。JDK1.8线程池的生命周期在多线程的环境下为每个任务都分配一个线...
2019-06-05 19:45:23
322
原创 滑动窗口最大值
title: 滑动窗口最大值date: 2018-3-6 14:18:40categories:- 剑指offertags:- Algorithm- 剑指offer给定一个数组和滑动窗口的大小,请找出所有滑动窗口里的最大值。代码实现public class 滑动窗口的最大值 { public ArrayList<Integer> maxInWindows(int ...
2019-06-05 19:44:38
1473
原创 指令冲排序的一点总结
title: 指令重排序date: 2017-12-25 12:50:17categories:- concurrenttags:- Java- concurrent- JDK源码在执行程序时,为了提供性能,处理器和编译器常常会对指令进行重排序,但是不能随意重排序,不是你想怎么排序就怎么排序,它需要满足以下两个条件:在单线程环境下不能改变程序运行的结果;存在数据依赖关系的不...
2019-06-05 19:44:01
183
原创 回溯算法的一点总结
title: backtrack解决问题一点总结date: 2018-2-5 21:18:40categories:- Algorithmtags:- Algorithm算法设计与分析中就学过回溯法(递归,迭代),可是一遇到问题,还是没有建立起使用回溯的思想。在子集包含,字符串重建,序列,等问题中都非常好用。Permutations1public class leetcod...
2019-06-05 19:42:43
2303
原创 ZK 主从模式
title: Zookeeper实现主从模式date: 2018-11-12 23:18:40categories:- Zookeepertags:- ZookeeperZK 探究native Zookeeper主从模式Zk的master节点public class Master implements Watcher{ ZooKeeper zk; String...
2019-06-05 19:41:54
1533
原创 Linux踩坑 之 crontab不执行
老大分了个任务,需要在云主机上定期执行一段Python脚本 并且直接告诉我,要用cron 来做,定期任务。 没接触这个,就是百度谷歌了,博主给的样例,就是自己写一个cron脚本 vim davecron.cron内容就是简单的打印log* * * * * date >> /etc/temp.txt 每分钟输出一次 crontab davecron.cron ...
2018-08-01 21:17:11
9926
1
原创 Leetcode Contest94
title: LeetcodeContest94 date: 2018-7-22 23:43:00 categories: - leetcode tags: - Algorithm摘要: 做的最简单的一次周比赛872 Leaf-Similar Trees左相似的树Consider all the leaves of a binary tree....
2018-07-23 11:38:54
485
原创 863. All Nodes Distance K in Binary Tree
原题: We are given a binary tree (with root node root), a target node, and an integer value K.Return a list of the values of all nodes that have a distance K from the target node. The answer can be ...
2018-07-02 19:46:49
870
原创 26. Remove Duplicates from Sorted Array
Given a sorted array nums, remove the duplicates in-place such that each element appear only once and return the new length.Do not allocate extra space for another array, you must do this by modifyi...
2018-06-14 10:51:09
136
原创 leetcode 227. Basic Calculator II
Implement a basic calculator to evaluate a simple expression string.The expression string contains only non-negative integers, +, -, *, /operators and empty spaces . The integer division should trun...
2018-05-17 23:02:50
187
原创 leetcode 165. Compare Version Numbers
Compare two version numbers version1 and version2. If version1 &gt; version2 return1; if version1 &lt; version2 return-1;otherwise return 0.You may assume that the version strings are non-empty and...
2018-05-17 10:22:19
252
原创 leetcode 93. Restore IP Addresses
Given a string containing only digits, restore it by returning all possible valid IP address combinations.Example:Input: “25525511135” Output: [“255.255.11.135”, “255.255.111.35”]package dgdf...
2018-05-10 17:36:00
206
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人