- 博客(41)
- 资源 (35)
- 收藏
- 关注
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
转载 小规模的流处理框架.Part 1: thread pools
原文链接 作者:Tomasz Nurkiewicz 译者:simonwang(译者:强力推荐这篇文章,作者设计了一个用于小流量的流式数据处理框架,并详细给出了每一个需要注意的设计细节,对比了不同设计方案的优缺点,能够让你对流处理过程,某些设计模式和设计原则以及指标度量工具有一个更深刻的认识!)在GeeCON 2016上我为我的公司准备了一个编程竞赛,这次的任务是设计并实现一个能够满足以下要
2017-03-27 15:52:41
522
![](https://csdnimg.cn/release/blogv2/dist/pc/img/listFixedTop.png)
原创 限流模式-Guava的RateLimiter
目前有几种常见的限流方式:1、通过限制单位时间段内调用量来限流2、通过限制系统的并发调用程度来限流3、使用漏桶(Leaky Bucket)算法来进行限流4、使用令牌桶(Token Bucket)算法来进行限流具体我们看下第三种和第四中算法,也是我们目前看到的最常见的限流算法漏桶(Leaky Bucket)算法思路很简单,水(请求)先进入到漏桶里,漏桶以一定的速度出水(接
2017-03-24 14:13:10
7598
原创 ElasticSearch-6.3.2源码解读(1)-----部署源码
今天决定走读一遍elasticsearch的源码,算是对这一类分布式系统(分布式的计算存储架构都是差不多的)有一个深入的了解。首先,获取elasticsearch源码编译调试代码,大家可以看下这篇文章,讲的很好,我是基本按照这篇文章来操作的,目前环境正常今天就只弄到了这些了,代码每天会看一些,当然要带着问题取看代码!!!加油...
2019-05-24 17:39:13
343
原创 架构设计
软件模块:是一套一致而互相有紧密关连的软件组织。它分别包含了程序和数据结构两部分。现代软件开发往往利用模块作为合成的单位。模块的接口表达了由该模块提供的功能和调用它时所需的元素。模块是可能分开被编写的单位。这使它们可再用和允许人员同时协作、编写及研究不同的模块。 软件组件定义为自包含的、可编程的、可重用的、与语言无关的软件单元,软件组件可以很容易被用于组装应用程序中。 从逻辑的角度来拆分系统后...
2019-03-09 14:40:34
231
原创 Resilience4j-----BulkHead
介绍Bulkhead意指船舶中的隔舱板,它将船体分割为多个船舱,在船部分受损时可避免沉船。框架中的Bulkhead通过信号量的方式隔离不同种类的调用,并进行流控,这样可以避免某类调用异常危及系统整体。(注:不同于Hystrix,该框架不提供基于线程池的隔离)初始化BulkheadBulkhead的配置方式与熔断类似,有对应的BulkheadRegistry 和 BulkheadConf...
2019-01-22 14:52:30
1404
原创 Resilience4j------CircuitBreaker
与Hystrix相比,它有以下一些主要的区别:Hystrix调用必须被封装到HystrixCommand里,而resilience4j以装饰器的方式提供对函数式接口、lambda表达式等的嵌套装饰,因此你可以用简洁的方式组合多种高可用机制 Hystrix的频次统计采用滑动窗口的方式,而resilience4j采用环状缓冲区的方式 关于熔断器在半开状态时的状态转换,Hystrix仅使用一次执...
2019-01-22 14:51:27
1683
原创 Resilience4j------RateLimiter
高频控制的配置方式与熔断类似,有对应的RateLimiterRegistry 和 RateLimiterConfig,自定义配置的可选项有:频次阈值 阈值刷新时间 限流后的冷却时间初始化:private void init() { // For example you want to restrict the calling rate of some method to be ...
2019-01-22 14:50:03
765
原创 Flink基础教程-----学习笔记
Flink基础教程Flink,Apache Flink 是为分布式、高性能、随时可用以及准确的流处理应用程序打造的开源流处理框架。 Flink是如何实现批处理和流处理?Flink 将批处理(即处理有限的静态数据)视作一种特殊的流处理。 Flink技术栈的核心组成部分,如下图: DataStream API 可以流畅地分析无限数据流,并且可以用Java 或者Scala 来实现。开发人...
2019-01-20 11:40:40
10830
1
原创 java并发编程之美----学习笔记总揽1
并发和并行1.并发是指同一时间段内多个任务同时在执行,且都没有执行结束,而并行是指在单位时间内多个任务同时在执行。并发任务强调的是一个时间段内同时在执行,而一个时间段是由多个单位时间累积而成,所以说并发的多任务在单位时间内不一定同时执行。在单CPU的时代多个任务都是并发执行的,这是因为单个CPU同时只能执行一个任务2.而在多线程编程实践中,线程的个数往往大于CPU的个数,所以一般都称多线程并发...
2019-01-16 16:36:50
642
原创 kafka并不难学---学习笔记
在kafka系统中,核心组件的元数据信息均存储在zookeeper中。这些元数据信息具体包含:控制器选举次数、代理节点和主题、配置、管理员操作、控制器。他们在zookeeper系统中的分布如图所示:控制器选举次数,在kafka系统中,控制器每进行一次选举次数,都会在zk系统/controller_epoch节点下进行记录,该值作为一个数字。在kafka集群中,第一个代理节点(broker)启动时,...
2019-01-16 16:26:40
1112
翻译 spring开始
本参考指南提供有关Spring框架的详细信息。它为所有功能提供了全面的文档,以及Springq潜在的基本概念(如“依赖注入”)的背景知识。 如果您刚开始使用Spring,则可能需要通过创建基于Spring Boot的应用程序来开始使用Spring Framework。 Spring Boot提供了一种快速方式来创建一个基于生产的Spring应用程序。它基于Spring框架,有利于配置的约定,并且旨
2017-08-17 20:04:03
361
翻译 多线程成本
从单线程应用程序到多线程应用程序不仅提供了优势,它也有一些成本。不要只是因为可以使用多线程启用应用程序。你应该有一个好主意:这样做所带来的好处大于成本。如有疑问,请尝试衡量应用程序的性能或响应能力,而不是仅仅猜测。 更复杂的设计 尽管多线程应用程序的某些部分比单线程应用程序更简单,但其他部分更为复杂。由多个线程执行的访问共享数据的代码需要特别注意。线程的互动并不总是简单。错误线程同步引起的错误可
2017-08-15 14:21:22
338
翻译 多线程优点
尽管面临挑战,仍然使用多线程的原因是多线程可以有几个好处: 1.更好的资源利用率。 2.在某些情况下更简单的程序设计。 3.更灵敏的程序。 更好的资源利用率 想象一下从本地文件系统读取和处理文件的应用程序。假设从磁盘读取af文件需要5秒钟,处理时间需要2秒钟。然后处理两个文件 5 seconds reading file A 2 seconds processing file A 5
2017-08-14 10:09:29
385
翻译 Java并发/多线程教程
过去计算机有一个单CPU,只能一次执行一个程序。后来计算机可以处理多任务,这意味着计算机可以同时执行多个程序(AKA任务或进程)。但是这不是真的“同时”。单个CPU在程序之间共享。操作系统将在运行的程序之间切换,在切换之前执行每个程序一段时间。 随着多任务处理,软件开发人员面临新的挑战。程序不能再假定所有的CPU时间可用,也不能全部内存或任何其他计算机资源。 “好公民”计划应该释放所有不再使用的资
2017-08-11 15:54:58
775
翻译 线程安全和不变性
竞争条件只有在多个线程正在访问同一资源且一个或多个线程写入资源时才会发生。如果多线程读取相同的资源竞争条件是不会发生的。 我们可以确保线程之间共享的对象永远不会被任何线程更新,那就是让共享对象不可变,从而线程安全。以下一个例子:public class ImmutableValue{ private int value = 0; public ImmutableValue(int value)
2017-08-04 13:25:37
1348
翻译 java内存模型
java内存模型指明了java虚拟机如何利用计算机内存(RAM)工作的。因为java虚拟机是整个计算机的一个模型,那么很自然的他也包含一个内存模型。 如果你想设计一个正确稳定的并发程序,那么理解java内存模型将会对此有很大的帮助。因为java内存模型指明了不同线程怎样和在什么时候能看到其他线程的共享变量被写入了,以及怎样能够成功地同步访问共享变量。 最原始的java内存模型是不足的,所以jav
2017-08-02 14:46:04
345
转载 使用Redis SETNX 命令实现分布式锁
使用Redis的 SETNX 命令可以实现分布式锁,下文介绍其实现方法。SETNX命令简介命令格式SETNX key value将 key 的值设为 value,当且仅当 key 不存在。 若给定的 key 已经存在,则 SETNX 不做任何动作。 SETNX 是SET if Not eXists的简写。返回值返回整数,具体为
2017-05-04 15:19:15
365
转载 并发场景下HashMap死循环导致CPU100%的问题
问题的症状从前我们的Java代码因为一些原因使用了HashMap这个东西,但是当时的程序是单线程的,一切都没有问题。后来,我们的程序性能有问题,所以需要变成多线程的,于是,变成多线程后到了线上,发现程序经常占了100%的CPU,查看堆栈,你会发现程序都Hang在了HashMap.get()这个方法上了,重启程序后问题消失。但是过段时间又会来。而且,这个问题在测试环境里可能很难重现。
2017-03-29 15:21:17
867
1
转载 fail-fast
fail-fast 机制是java集合(Collection)中的一种错误机制。当多个线程对同一个集合的内容进行操作时,就可能会产生fail-fast事件。例如:当某一个线程A通过iterator去遍历某集合的过程中,若该集合的内容被其他线程所改变了;那么线程A访问集合时,就会抛出ConcurrentModificationException异常,产生fail-fast事件。要
2017-03-29 14:42:40
224
转载 浅谈Java中的equals和==
在初学Java时,可能会经常碰到下面的代码:1 String str1 = new String("hello");2 String str2 = new String("hello");3 4 System.out.println(str1==str2);5 System.out.println(str1.equals(str2)); 为什么第4行和
2017-03-27 13:32:51
304
1
转载 理解String 及 String.intern() 在实际中的应用
1. 首先String不属于8种基本数据类型,String是一个对象。 因为对象的默认值是null,所以String的默认值也是null;但它又是一种特殊的对象,有其它对象没有的一些特性。 2. new String()和new String(“”)都是申明一个新的空字符串,是空串不是null; 3. String str=”kvill”; St
2017-03-27 13:31:34
346
1
转载 0.1+0.2!=0.3
Floating Point MathYour language isn't broken, it's doing floating point math. Computers can only natively store integers, so they need some way of representing decimal numbers. This representation
2017-03-06 14:50:23
1240
转载 sax,dom,jdom的优缺点比较
----sax, dom, jdom技术的优缺点比较SAX分析器在对XML文档进行分析时,触发一系列的事件,应用程序通过事件处理函数实现对XML文档的访问。由于事件触发本身是有时序性的,因此,SAX分析器提供的是一种对XML文档的顺序访问机制,对于已经分析过的部分,不能再倒回去重新处理。 SAX 之所以被叫做"简单"应用程序接口,是因为SAX分析器只做了一些简单的工作,大部分工
2016-12-02 17:37:43
417
原创 java集成groovy优化
继前面一章讲到了groovy的使用方式,有loader以及engine,但是这两个方式的性能还是不能令我们满意,然后我们分析了下groovy的源码,看了下里面的实现逻辑,发现groovy在生成class文件之后(缓存class信息),在每次执行文件操作的时候都会new一个instance,这样做的意义在于engin里面使用binding参数,这样就需要每次生成实例,来产生对应的binding参数,
2016-12-02 17:36:31
3052
原创 java集成groovy的几种方式对比
Groovy的几种集成方式:groovyshell、GroovyClassLoader、GroovyScriptEngine,其中groovyshell的方式不支持脚本缓存,会导致垃圾回收频繁,并且会出现outofmemoryexception(监控如下图1,这种方式直接抛弃),GroovyClassLoader、GroovyScriptEngine性能上比较接近,比较时间如下(执行同一运算gro
2016-11-14 14:43:18
4150
原创 Google Protocol Buffer原理
GoogleProtocol Buffer( 简称 Protobuf) 是 Google 公司内部的混合语言数据标准,目前已经正在使用的有超过 48,162 种报文格式定义和超过 12,183 个 .proto 文件。他们用于 RPC 系统和持续数据存储系统。Protobuf在我们大学学习的七层网络中应该是处于表示层。Protobuf 有如 XML,不过它更小、更快、也更简单。你可以定义自己的
2016-10-12 14:02:23
278
原创 排序算法-希尔排序
希尔排序:也称缩小增量排序,是直接插入排序算法的一种更高效的改进版本。希尔排序是非稳定排序算法。所以希尔排序的实质就是分组插入排序。分组进行插入排序,有些人可能觉得这样不是增加了插入排序的次数了么?其实不然,我哦们知道插入排序的效率取决于原始集合有序,所以只要我们在最后进行插入排序时增加了有序的个数,那对插入排序来说就减少了交换的次数。所以这个排序也最简单:在循环步长之后,再进行插入排序:
2016-04-24 21:00:41
338
原创 排序算法-归并排序
归并排序,从字面上意思就可以得知它是分治法的一种,将两个已经排好的数组进行归并到一个数组,直接贴代码吧,这样比较清晰public static void mergearrayv1(int a[], int first, int mid, int last, int temp[]) { int i = first, j = mid + 1; int m = mid
2016-04-14 20:49:51
338
原创 排序算法-堆排序
学习堆排序之前先了解下什么是二叉堆:二叉堆是完全二叉树或者是近似完全二叉树。二叉堆满足二个特性:1.父结点的键值总是大于或等于(小于或等于)任何一个子节点的键值。2.每个结点的左子树和右子树都是一个二叉堆(都是最大堆或最小堆)。当父结点的键值总是大于或等于任何一个子节点的键值时为最大堆。当父结点的键值总是小于或等于任何一个子节点的键值时为最小堆。一般如果我们用数组来表示堆(即堆的存储),i节点
2016-03-30 08:45:28
404
原创 排序算法-快速排序
今天讲下,效率比较高的快速排序:总的来说,快速排序讲究的是一种分而治之。先选取一个初始值,从左右两边逐一进行比较,直到起始的index>=end,一次比较结束,然后再在两边的集合里面再做如上的比较,也就是我们常做的递归操作。例如:{49,38,65,97,5}1.首先选取初始值49,从5开始比较,52.当前的位置时4,再从左边比较小的,到65时替换为{5,38,49,97,65}3
2016-03-16 17:00:04
348
原创 排序算法-选择与插入排序
今天主要复习下选择排序以及插入排序:1.选择排序:(百度百科的定义)每一次从待排序的数据元素中选出最小(或最大)的一个元素,存放在序列的起始位置,直到全部待排序的数据元素排完。 选择排序是不稳定的排序方法。个人的理解:选择排序就是选择最小的数据放在前面,也是我们最直观的排序方式,举例如下{49,38,65,97,5}:选择最小的数据5,排在最前面,交换位置{5,38,65,97
2016-03-15 15:37:36
367
原创 排序算法-冒泡
今天开始回顾下以前学习的东西了,首当其冲的就是几种常见的算法了:冒泡排序,选择排序,以及插入排序冒泡排序冒泡排序顾名思义,将比较之后的结果像泡泡一样往上移动。首先举个例子:{49,38,65,97,5},冒泡排序的步骤分为如下:(1)49与38比较,交换位置{38,49,65,97,5}(2)49与65比较不需要交换(3)65与97比较也不需要比较(4)97与5比较交换位置
2016-03-14 14:01:50
348
原创 try catch对程序性能的影响
大家看到这样的标题也许会在想,try catch肯定会影响性能的,但是其实并没有很直接的证据表明trycatch会影响系统的性能,尤其是在托管的环境下,今天就用实际的代码来证明下在不同情况下,代码运行的时间指标。.NET中的异常捕获以及处理的机制都是try catch finally块来完成的,作用分别是异常的检测 捕获以及处理。每个类都会跟一个异常表(exception table) 每
2016-02-02 14:48:04
1279
原创 is 与 as
我们知道C#是一种强类型的语言,这样就可以保证在编译的时候,发现类型不匹配的异常。这也说明了,我们应用程序在运行时不会去检查类型的错误。但是,运行时检查类型的错误有时候是不可避免的。在我们的程序中,经常会出现object 的参数,这时我们需要转换成我们要求的类型或者接口。通常我们有两种选择:第一种是直接用as转换或者进行强类型的转换,第二种是先使用is进行类型判断,再使用as转换或者强类型转换。
2016-02-01 11:46:22
446
原创 readonly与const
我们知道c#中有两种常量的表达方式:readonly与const,但是这两种方式有什么不同呢?在实际的应用中如何去选择使用或者说这两种方式可以用另外一种说法,大家更容易明白:运行时常量与编译时常量。表面上的意思就是:readonly是在运行时才确定的常量,而const是在编译时已经替换成常量。这两种方式有不一样的行为操作,如果说你想性能上有稍微的提升,可以选择编译时常量,但是相对于运行时的产量
2016-01-28 10:54:19
690
原创 .net中的属性
这篇文章主要是讨论使用属性的必要性做任何事物的分析时,首先是要先给该事物一个定义,属性:是一种可以像字段一样访问数据的方法,或者更精简地说,属性就是方法。相比于字段来说,属性有如下的优势:1.简化代码的编写。当然了,有人说我只用命名一个简单的变量不就可以访问以及赋值了么,的确,但是如果想实现属性所有的功能,比如访问限制,这种情况下可能就得写一些方法代码了。2.对.net框架更好的支
2016-01-27 10:07:58
503
原创 java程序员修炼之道(1)
这些天看了《java程序员修炼之道》这本书,觉得还不错,将自己的一些理解以及对本书中的重点归纳了下,希望对后来者有些帮助,后续会根据每天理解的内容,陆续地写一些文章,望自己能够每天都处在学习中。第一章主要是介绍了java7的改进地方: 1.java是解释性语言还是编译性语言 在这一点上,本人跟作者的观点有些不一样,c/c++这些都是典型的编译性语言,而java/c#等之类的语
2015-05-18 22:17:27
508
原创 里氏替换原则在现实中的应用
我记得在之前xx大型的互联网公司,该公司只能算是很伪的互联网公司,以业务为主,非技术指导的公司,所以里面的写业务的人员水平也是参差不齐,代码在不停地重构,没过多久又会发现代码的维护难度在增加,然后又是重构,出现了恶性循环。每次来了新需求,都会头疼得紧,担心需求的改变会对上一个版本有很大的冲击。今天来介绍下该业务代码简单的架构知识。 先介绍下该代码设计的背景知识。因为是app的服务端代码,所
2015-04-01 18:28:12
1014
Writing Compiler and Interpreter - A Software Engineering Approach
2018-11-27
Regular.Expression.Pocket.Reference.2nd.Edition
2012-12-04
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人