- 博客(245)
- 资源 (15)
- 收藏
- 关注
原创 guava LoadingCache学习
guava LoadingCache学习简介使用Guava Cache可以保证只让一个线程去加载数据(比如从数据库中),而其他线程则等待这个线程的返回结果。这样就能避免大量用户请求穿透缓存。但是也有一个很致命的缺陷:如果缓存过期,恰好有多个线程读取同一个key的值,那么guava只允许一个线程去加载数据,其余线程阻塞。这虽然可以防止大量请求穿透缓存,但是效率低下。使用refreshAfter...
2019-05-31 18:33:25
3316
转载 Cloud Native和微服务
一、Cloud Native介绍Cloud Native是Matt Stine提出的一个概念,它是一个思想的集合,包括DevOps、持续交付(Continuous Delivery)、微服务(MicroServices)、敏捷基础设施(Agile Infrastructure)、康威定律(Conways Law)等,以及根据商业能力对公司进行重组。 可以说,Cloud Native即包含技...
2018-03-09 16:42:27
4151
转载 Actor模型
1、背景处理并发问题就是如何保证共享数据的一致性和正确性,为什么会有保持共享数据正确性这个问题呢?其实无论是使用数据库锁还是多线程,这里有一个共同思路,就是将数据喂给线程,数据是被动的,自身不复杂,没有自身业务逻辑要求。适合大数据处理或互联网网站应用等等。但是如果数据自身要求有严格的一致性,也就是事务机制,数据就不能被动被加工,要让数据自己有行为能力保护实现自己的一致性。要让数据自己有行为维护自己...
2018-03-09 10:45:53
5066
转载 Serverless和FaaS
如同许多新的概念一样,Serverless目前还没有一个普遍公认的权威的定义。最新的一个定义是这样描述的:“无服务器架构是基于互联网的系统,其中应用开发不使用常规的服务进程。相反,它们仅依赖于第三方服务(例如AWS Lambda服务),客户端逻辑和服务托管远程过程调用的组合。”最开始,“无服务器”架构试图帮助开发者摆脱运行后端应用程序所需的服务器设备的设置和管理工作。这项技术的目标并不是为了实现真...
2018-03-06 20:16:06
2621
转载 Spring Cloud Bus
Spring Cloud Bus提供了批量刷新配置的机制,它使用轻量级的消息代理(例如RabbitMQ、Kafka等)连接分布式系统的节点,这样就可以通过Spring Cloud Bus广播配置的变化或者其他的管理指令。使用Spring Cloud Bus后的架构如图9-2所示。根据此图我们可以看出利用Spring Cloud Bus做配置更新的步骤:1、提交代码触发post给客户端A发送bus/...
2018-03-06 20:03:46
1182
转载 背压
背压是指在异步场景中,被观察者发送事件速度远快于观察者的处理速度的情况下,一种告诉上游的被观察者降低发送速度的策略。简而言之,背压是流速控制的一种策略。需要强调两点:背压策略的一个前提是异步环境,也就是说,被观察者和观察者处在不同的线程环境中。背压(Backpressure)并不是一个像flatMap一样可以在程序中直接使用的操作符,他只是一种控制事件流速的策略。响应式拉取(reactive pu...
2018-03-05 17:43:21
5300
转载 微服务框架选型之争
选项其实很多,这里挑选一些讨论火热、或者主流的来对比,仅供参阅。主流微服务框架:SpringCloud、Dubbo新锐微服务框架:Istio1、框架背景对比(1)Spring Cloud,来源于 Spring Source ,具有 Spring 社区的强大背书外,还有 Netflix 强大的后盾与技术输出。Netflix 作为一家成功实践微服务架构的互联网公司,在几年前就把几乎整个微服务框架栈开源...
2018-02-28 18:01:07
1885
原创 Istio
一、微服务的“痛点”但微服务化易弄,服务治理难搞!微服务化没有统一标准,多数是进行业务领域垂直切分,业务按一定的粒度划分职责,并形成清晰、职责单一的服务接口,这样每一块规划为一个微服务。微服务之间的通信方案相对成熟,开源领域选择较多的有RPC或RESTful API方案,比如:gRPC、apache thrift等。这些方案多偏重于数据如何打包、传输与解包,对服务治理的内容涉及甚少。微服务治理是头...
2018-02-28 17:37:47
4611
转载 Linux daemontools的使用
1、安装mac:curl -o daemontools-0.76.tar.gz http://cr.yp.to/daemontools/daemontools-0.76.tar.gzcentos:wget http://cr.yp.to/daemontools/daemontools-0.76.tar.gztar xvzf daemontools-0.76.tar.gz
2018-01-12 12:53:40
4216
原创 阿里云ecs部署Java环境
1、安装JDK8在终端执行下载命令:wget http://download.oracle.com/otn-pub/java/jdk/8u151-b12/e758a0de34e24606bca991d704f6dcbf/jdk-8u151-linux-x64.tar.gz# 直接下载只下载到download-fail-1505220.html的html文件。因为Oracle要求在下
2018-01-12 10:27:03
1182
原创 git 多帐号配置
背景: 学习git的时候, 大家刚开始使用之前都配置了一个全局的用户名和邮箱。git config --global user.name "test"git config --global user.email "test@xx.com"这个配置,git保存在~/.gitconfig中。 有时候我们需要在一个机器上使用多个git帐号,比如在工作中,都会有一个工作的Git帐号,另外有一个自己使用
2018-01-02 13:32:35
1215
原创 Java8 Optional总结
1、构造方式Optional 的三种构造方式: Optional.of(obj), Optional.ofNullable(obj) 和 Optional.empty()1.1、Optional.of(obj)它要求传入的 obj 不能是 null 值的, 否则 NullPointerException.使用场景:1. 当我们非常非常的明确将要传给 Optional.of
2017-12-14 17:52:07
9061
转载 @Import注解
@Import注解就是之前xml配置中的import标签,可以用于依赖第三方包中bean的配置和加载在4.2之前只支持导入配置类在4.2,@Import注解支持导入普通的java类,并将其声明成一个beanpublic class DemoService { public void doSomething(){ System.out.println("ok"
2017-07-11 19:34:47
26803
1
原创 item2使用Solarized主题
Solarized 是目前最完整的 Terminal/Editor/IDE 配色项目,几乎覆盖所有主流操作系统(Mac OS X, Linux, Windows)、编辑器和 IDE(Vim, Emacs, Xcode, TextMate, NetBeans, Visual Studio 等),终端(iTerm2, Terminal.app, Putty 等)。类似的项目还有 Tomorrow Th
2017-07-07 23:45:55
4151
原创 log4j2异步Logger
1 异步Logger的意义之前的日志框架基本都实现了AsyncAppender,被证明对性能的提升作用非常明显。在log4j2日志框架中,增加了对Logger的异步实现。那么这一步的解耦,意义何在呢?如图,按我目前的理解:异步Logger是让业务逻辑把日志信息放入Disruptor队列后可以直接返回(无需等待“挂载的各个Appender”都取走数据)优点:更高吞吐、
2017-05-26 19:52:20
6938
转载 缓存计数器
电商场景里的缓存计数器:秒杀和超卖 我们在秒杀和防超卖场景里的实现逻辑类似于淘宝这篇博客[注3]所提及的”分布式缓存计数器“,所以我就直接照搬过来了: 分布式缓存的另一个应用场景是缓存计数器。 对于多服务器的系统,分布式缓存提供了统一的存储和原子操作,便于集群环境下的使用。库存计数器是分布式缓存的一个典型应用场景, 对于集群中的每一台机器,库存都应该是一个统一的值,因
2017-03-11 21:46:57
4893
转载 ConcurrentHashMap复合操作问题
ConcurrentHashMap通常只被看做并发效率更高的Map,用来替换其他线程安全的Map容器,比如Hashtable和Collections.synchronizedMap。实际上,线程安全的容器,特别是Map,应用场景没有想象中的多,很多情况下一个业务会涉及容器的多个操作,即复合操作,并发执行时,线程安全的容器只能保证自身的数据不被破坏,但无法保证业务的行为是否正确。举个例子:统
2017-03-11 21:39:48
4045
1
转载 关于缓存问题的解决方案
一、缓存穿透我们在项目中使用缓存通常都是APP先检查缓存中是否存在,如果存在直接返回缓存内容,如果不存在就直接查询数据库然后再缓存查询结果返回。这个时候如果我们查询的某一个数据在缓存中一直不存在,就会造成每一次请求都查询DB,这样缓存就失去了意义,在流量大时,可能DB就挂掉了。这个问题其实经常遇到,只是没有引起足够的重视,在我想来,如果碰到这样的问题可以在封装的缓存SET和GET部分增加个
2017-03-11 21:21:31
3912
原创 guava之Multimap
package com.test;import java.util.Collection;import com.google.common.collect.ArrayListMultimap;import com.google.common.collect.ImmutableSet;import com.google.common.collect.Multimap;public c
2017-03-10 22:13:19
1702
转载 RabbitMQ和kafka从几个角度简单的对比--转
业界对于消息的传递有多种方案和产品,本文就比较有代表性的两个MQ(rabbitMQ,kafka)进行阐述和做简单的对比,在应用场景方面,RabbitMQ,遵循AMQP协议,由内在高并发的erlanng语言开发,用在实时的对可靠性要求比较高的消息传递上。kafka是Linkedin于2010年12月份开源的消息发布订阅系统,它主要用于处理活跃的流式数据,大数据量的数据处理上。
2017-03-06 14:53:17
1834
转载 Lock和Synchronized区别
1、ReentrantLock 拥有Synchronized相同的并发性和内存语义,此外还多了锁投票,定时锁等候和中断锁等候。线程A和B都要获取对象O的锁定,假设A获取了对象O锁,B将等待A释放对O的锁定。如果使用synchronized,如果A不释放,B将一直等下去,不能被中断。如果使用ReentrantLock,如果A不释放,可以使B在等待了足够长的时间以后,中断等待,而干别的事情
2016-08-11 14:09:38
1331
转载 如何合理地估算线程池大小
转自http://ifeve.com/how-to-calculate-threadpool-size/先来一个天真的估算方法:假设要求一个系统的TPS(Transaction Per Second或者Task Per Second)至少为20,然后假设每个Transaction由一个线程完成,继续假设平均每个线程处理一个Transaction的时间为4s。那么问题转化为:如何设计线程
2016-07-26 11:25:44
1785
转载 Elasticsearch学习总结
方法http://www.infoq.com/cn/articles/database-timestamp-021.3 与关系型数据库的名词对照Relational DB => Databases => Tables => Rows => Columns Elasticsearch => Indices => Types => Documents => Fields
2016-07-15 16:21:55
4467
转载 Java命令学习
来源:Hollis链接:http://www.hollischuang.com/archives/110一、jpsjps位于jdk的bin目录下,其作用是显示当前系统的java进程情况,及其id号。 jps相当于Solaris进程工具ps。不象”pgrep java”或”ps -ef grep java”,jps并不使用应用程序名来查找JVM实例。因此,它查找所有的Java应用
2016-07-08 17:02:53
2588
原创 Spring的两种事务定义方式
一、第一种配置方法:基于XML的事务管理这种方法不需要对原有的业务做任何修改,通过在XML文件中定义需要拦截方法的匹配即可完成配置,要求是,业务处理中的方法的命名要有规律,比如setXxx,xxxUpdate等等。详细配置如下:
2016-06-23 20:12:18
8245
原创 mysql select for update
1、FOR UPDATE 仅适用于InnoDB,且必须在事务区块(BEGIN/COMMIT)中才能生效。beginSELECT * FROM x'x'x WHERE xxx FOR UPDATEcommit2、使用select…for update会把数据给锁住,不过我们需要注意一些锁的级别,MySQL InnoDB默认Row-Level Lock,所以只有「明确」地指定主
2016-06-21 18:45:29
4784
原创 Spiring父子容器
一、父子容器通过HierarchicalBeanFactory接口,Spring的IoC容器可以建立父子层级关联的容器体系,子容器可以访问父容器中的Bean,但父容器不能访问子容器的Bean。在容器内,Bean的id必须是唯一的,但子容器可以拥有一个和父容器id相同的Bean。父子容器层级体系增强了Spring容器架构的扩展性和灵活性,因为第三方可以通过编程的方式,为一个已经存在的容器添加一个
2016-06-20 11:42:44
2345
原创 Elasticsearch
一、安装1.1 安装javaElasticsearch是基于java的,使用前需要先安装java。我下载的是jdk-71.2 安装ElasticsearchElasticsearch的安装也很简单,首先下载压缩包:wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsear
2016-05-27 10:19:43
1260
转载 LinkedIn实时低延迟数据抓取系统Databus
转自http://www.infoq.com/cn/news/2013/03/linkedin-databus在互联网架构中,数据系统通常分为真实数据(source-of-truth)系统,作为基础数据库,存储用户产生的写操作;以及衍生数据库或索引,提供读取和其他复杂查询操作。后者常常衍生自主数据存储,会对其中的数据做转换,有时还要包括复杂的业务逻辑处理。缓存中的数据也来自主数据存储,当主
2016-05-10 17:14:06
4400
转载 CLOSE_WAIT问题
1、原理Tcp连接的关闭是连接的两端分别都需要进行关闭(调用close(socket),该函数执行发送FIN,等待ACK等操作)。实际上没有客户端和服务端的区别,只有主动关闭和被动关闭的区别。主动关闭的一方发出 FIN 包,被动关闭的一方响应 ACK 包,此时,被动关闭的一方就进入了CLOSE_WAIT状态。如果一切正常,稍后被动关闭的一方也会发出FIN包,然后迁移到LAST_ACK状态。所以
2016-04-29 17:43:46
2695
转载 JVM参数配置总结
一、堆大小设置JVM中最大堆大小有三方面限制:相关操作系统的数据模型(32-bt还是64-bit)限制;系统的可用虚拟内存限制;系统的可用物理内存限制。32位系统下,一般限制在1.5G~2G;64为操作系统对内存无限制。在Windows Server 2003 系统,3.5G物理内存,JDK5.0下测试,最大可设置为1478m。典型设置:java -Xmx3550m -Xm
2016-04-25 15:08:05
1971
转载 Hystrix
1、背景在复杂的分布式 架构 的应用程序有很多的依赖,都会不可避免地在某些时候失败。高并发的依赖失败时如果没有隔离措施,当前应用服务就有被拖垮的风险。例如:一个依赖30个SOA服务的系统,每个服务99.99%可用。99.99%的30次方 ≈ 99.7%0.3% 意味着一亿次请求 会有 3,000,00次失败换算成时间大约每月有2个小时服务不稳定.随着服务依赖数量的变
2016-03-29 16:11:29
11775
原创 使用slf4j + Log4j2构建日志
一、背景Log4j 1.x 在高并发情况下出现死锁导致cpu使用率异常飙升,而Log4j2.0基于LMAX Disruptor的异步日志在多线程环境下性能会远远优于Log4j 1.x和logback(官方数据是10倍以上),这里分享slf4j + Log4j2的使用方法。二、步骤1、pom.xml删除以往依赖Log4j1.x的依赖项,比如slf4j-log4j12、log4
2015-12-21 14:10:34
22284
原创 Spring中Bean初始化的三种方法
常用的设定方式有以下三种:通过实现 InitializingBean/DisposableBean 接口来定制初始化之后/销毁之前的操作方法;通过 元素的 init-method/destroy-method属性指定初始化之后 /销毁之前调用的操作方法;在指定方法上加上@PostConstruct 或@PreDestroy注解来制定该方法是在初始化之后还是销毁之前调用。 pu
2015-12-16 13:45:33
45396
原创 ssh公钥登录
使用密码登录,每次都必须输入密码,非常麻烦。好在SSH还提供了公钥登录,可以省去输入密码的步骤。 1、原理所谓"公钥登录",原理很简单,就是用户将自己的公钥储存在远程主机上。登录的时候,远程主机会向用户发送一段随机字符串,用户用自己的私钥加密后,再发回来。远程主机用事先储存的公钥进行解密,如果成功,就证明用户是可信的,直接允许登录shell,不再要求输入密码,这和之前的ssh账号密码也
2015-12-08 19:51:27
2571
转载 消息队列的两种模式
Java消息服务(Java Message Service,JMS)应用程序接口是一个Java平台中关于面向消息中间件(MOM)的API,用于在两个应用程序之间,或分布式系统中发送消息,进行异步通信。点对点与发布订阅最初是由JMS定义的。这两种模式主要区别或解决的问题就是发送到队列的消息能否重复消费(多订阅)1、定义JMS规范目前支持两种消息模型:点对点(point to poin
2015-12-01 16:30:24
74524
5
转载 JAVA日志框架
1、日志框架提供日志调用的接口,实际的日志输出委托给日志系统实现。JCL(Jakarta Commons Logging):比较流行的日志框架,很多框架都依赖JCL,例如Spring等。SLF4j:提供新的API,初衷是配合Logback使用,但同时兼容Log4j。2、日志系统负责输出日志Log4j:较早的日志系统,可以单独使用,也可配合
2015-11-06 16:40:51
3702
原创 BeanPostProcessors使用总结
1、BeanPostProcessors接口如果这个接口的某个实现类被注册到某个容器,那么该容器的每个受管Bean在调用初始化方法之前,都会获得该接口实现类的一个回调。容器调用接口定义的方法时会将该受管Bean的实例和名字通过参数传入方法,进过处理后通过方法的返回值返回给容器。要使用BeanPostProcessor回调,就必须先在容器中注册实现该接口的类,那么如何注册呢?Be
2015-11-03 20:29:00
8082
1
how to create my appids · XX-net_XX-Net Wiki · GitHub.pdf
2018-03-09
libevent源码深度剖析.pdf
2011-07-06
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人