- 博客(21)
- 收藏
- 关注
原创 akka学习之消息传递的可靠性
消息传递可靠性 akka帮助我们在单机多核处理器或多服务器分布式系统中构建可靠性强的的应用系统。为了实现这一点,关键是在你的代码单元的交互中(也就是actor)的交互只通过消息传递来实现。因此值得花一章的篇幅来重点介绍消息时如何在actor之间传递的。 这里先假设一个跨多网络服务器的系统作为下面将讨论的内容的上下文环境,因为跨网络消息传递需要更多的可靠性保证。...
2015-01-28 19:46:58
412
原创 akka学习之java内存模型JMM
使用类型安全平台(包括scala和akka在内)的一个目的是,它能使编写并发软件变得简单。本章主要介绍类型安全平台,特别是akka,是如何在并发应用中处理共享内存的。 java内存模型JMM 在jdk 5之前的版本中,java内存模型的定义并不是很好。当多线程访问共享内存时,可能会得到各种千奇百怪的结果,比如: 看见性问题:一个线程看不到另一个...
2014-12-22 20:11:46
149
原创 akka学习之位置透明性
上一章akka学习之actor引用,路径和地址介绍了如何使用actor路径来让actor的位置变得透明。但是一些特殊的特性有必要再额外介绍下,因为在不同的编程语言,平台和技术环境中,远程透明的意思非常也不一样。 默认分布式 在akka中,每件事情的设计目的都是工作在分布式环境中的:所有actor之间的交互都是通过纯粹的消息传递来实现的所有的事件都是异步的。akka...
2014-12-19 19:33:04
214
原创 akka学习之actor引用,路径和地址
这章主要介绍在分布式akka系统中actor是如何识别和寻址的。它的主要思想是actor系统本身形成的内在监护层级结构以及跨多个网络节点中actor之间的通信是位置透明的。 上面这张图描述了akka系统中主要的几种实体之间的关系,下面将对这张关系图做详细介绍。 actor引用 actor引用是actorRef的子类,它最重要的作用就是支持发生消息给它所代...
2014-12-18 21:59:02
350
原创 akka学习之actor监护与监控
在前面的章节akka学习之actor介绍中介绍了actor对ziactor有监护职责,同时actor对其他actor的生命周期等信息进行监控。这张将详细解释什么是监护和监控。什么是监护(supervision)在actor系统,一个actor(上司也可以成为监护人)可以创建子actor(下属),然后可以分配任务给他的下属去执行,同时也要对下属的错误负责,上司也是下属的监护...
2014-12-13 13:45:32
220
原创 akka学习之actor系统介绍
actor系统 前面讲过actor其实是封装了状态和行为的对象,actor之间唯一的通信方式是通过接收者的邮箱交换信息。为了更好的了解actor系统,可能把它类比为人群会更好理解些。在使用actor来对解决方案建模时,把actor想象成一群人,把子任务分配给他们,将他们的功能整理成一个有组织的结构,同时考虑将失败情况向上级汇报。这样的就可以在脑中形成进行软件实现的框架。actor...
2014-12-10 18:39:21
225
原创 akka学习之actor介绍
什么是actor 在上面一章大致提到了akka使用actor对象来处理任务。那么在真正深入学习akka之前,必须先知道什么是actor。actor在语言层面上来说,就是一个对象,但是从功能层面上来说,也可以把它看成一个容器,它包含了自己的状态,处理任务的行为,接收消息的邮箱,子actor以及对子actor的监管策略等内容。所有的这些东西都被封装在actor里面,而一个actor只能通...
2014-12-09 17:48:17
237
原创 并发编程之akka简介
什么是akka akka是一个用scala编写的库,用于简化编写可容错的,可扩展的,高并发应用。akka使用actor模型来提升抽象能力,提供更好的平台来构建可扩展的,弹性的应用。对于比较难处理的错误,akka采用“let it crash”模型来处理,这种模式可以使得一个任务的处理失败不会导致整个应用的crash,使你的系统拥有强大的自愈能力,也不需要重启来恢复系统。同时akka的...
2014-12-02 19:52:50
162
原创 并发编程之FutureTask的实现解析
简介 很多时候我们希望创建一个新线程去执行一个功能相对独立的任务,并在任务完成之后返回执行结果。如果实现Runnable接口,没有办法获得返回值;如果实现Callable接口,必须使用ExecutorService来执行,不能使用更简单灵活的new thread方法来实现。为了解决上面两个问题,于是有了FutureTask。FutureTask实现了Runnable, Fut...
2014-11-12 18:52:58
135
原创 并发编程之线程池ScheduledThreadPoolExecutor原理探究
简介 上一篇文章剖析了ThreadPoolExecutor的原理和实现,这里剖析下ScheduledThreadPoolExecutor的实现方式。ScheduledThreadPoolExecuto能够执行延迟固定时间的任务和周期性任务。在需要多工作线程的情况下,它比Timer更方便,同时比ThreadPoolExecutor有更大灵活性和能力。 但是在使用S...
2014-10-28 12:25:26
269
原创 并发编程之线程池ThreadPoolExecutor原理探究
当前越来越多的系统使用多线程来处理任务,但是为每一个任务创建线程并不是合理的方案,原因有2点:一是创建线程的开销很大,一个任务一个线程的方式会有性能上的损失;二是可能导致线程数量的膨胀,不但不易于线程的管理,还可能导致内存被消耗完,导致out of memory(OOM),从而使系统崩溃。为了解决这个问题,线程池应运而生。线程池有两个作用:一个是限制线程的数量,不会导致线程的膨...
2014-10-22 19:25:22
124
原创 并发编程之AbstractQueuedSynchronizer原理剖析
简介 在java同步锁中,除了synchronized关键字之外,还有很多更灵活的显式锁可供选择,比如ReentrantLock,ReentrantReadWriteLock等。甚至如果jdk中的锁不能满足你的需求,你还可以自己来定义自己的显式锁。显式锁都是实现Lock接口,需要自己实现比如lock(),unlock(),trylock()等方法。而lock接口方法的实...
2014-10-20 19:10:53
117
原创 log4j日志性能优化
在软件系统中,打日志几乎是每个系统都会使用的行为。不管是用来记录系统健康状态,辅助问题定位,还是收集数据,以便后续数据分析等,日志都起着举足轻重的作用。但是IO的阻塞行为和磁盘的读写速度低下意味着写日志并非是没有代价的。 存在问题 在很多系统中,日志模块用的都是log4j,打日志用的都是同步方法,基本配置如下: <appender na...
2014-10-15 16:17:41
246
原创 并发编程之读写锁ReentrantReadWriteLock实现
引子 我们团队有维护这样一个类似比价的系统。其中有一个A方法需要查询好几个第三方的http接口,以获取某些信息进行汇总分析。虽然是通过多线程并发的去访问第三方接口,但是有些第三方系统不稳定,只要其中一个挂了就会影响整个方法的效率。团队成员经常在接到报警信息之后手动把不稳定的接口下线,这给大家的正常生活带来了麻烦,因为你有时候不得不不周末或者半夜起来操作。于是我做了一个自动下线功能,假如...
2014-10-01 22:30:05
105
原创 java常用性能优化方法及耗时对比
字符串操作1.String.split(seg);的时间是StringUtils.split(str, seg);的1.5倍.2.String.replaceAll(regex, replacement)的时间是StringUtils.replace(text, searchString, replacement)的1.86倍。3.如果是单个字符替换StringUtils.repl...
2014-09-12 20:51:07
864
原创 并发编程之任务&线程的取消与关闭
任务或线程的取消与关闭在向线程提交任务并且任务开始执行之后,通常任务执行完就自行停止和结束了,但是很多时候,我们希望在任务自行结束之前能提前终止,比如用户进行了取消操作等。具体来说,取消操作分为以下几种:用户请求的取消操:比如用户按取消按钮,通过管理接口请求取消等;超时停止:比如请求某个http请求,希望在指定时间还没返回结果时取消任务。应用程序事件:比如寻找迷宫出口,如果有一...
2014-08-26 11:19:34
178
原创 并发编程之安全发布对象
对象发布(publish) 发布一个对象是使它能够在被当前范围之外的代码所使用。比如创建一个对象之后,提供一个非私有方法返回这个对象的引用,或者把它传递到其他类的方法中。下面是常见的发布对象的例子:1.把对象的引用保存到静态公有域中public static List<Object> objectList; public void initList()...
2014-08-19 10:27:08
77
原创 并发编程之线程同步锁
线程同步的风险 使用多线程可以让你充分利用多核处理器的资源,更简单的处理异步事件等。但是多线程有3个非常需要关注和解决的风险: 1.安全性风险:即每一次系统运行的最终结果都是与预期相符的,不会产生各种稀奇古怪无法预知的结果。 2.活动度风险:即预期会发生的事件最终会发生,而不是进入一种永远不会发生的状态。一个典型的事件就是死锁。 3.性能风险...
2014-08-13 18:43:19
125
原创 如何使修改的freemarker模板实时生效
很多web系统的前端显示模板都用freemrker。由于freemarker没有像java那样方便直观的进行debug调试,开发过程中经常遇到写一些逻辑比较复杂的模板的时候,需要反复的试错修改,每次修改之后都需要部署再验证,导致开发效率比较低。由于freemarker默认开启了模板缓存机制,不管是直接修改部署war包里的ftl文件,还是修改代码ftl文件用IntellijIDEA...
2014-06-18 17:53:21
4653
1
原创 Arrays.asList方法隐藏的地雷
在进行java开发的时候,经常遇到需要把数组转换为list结构进行处理。如果自己写一个循环进行数据copy 赋值显得麻烦并且没有必要,因为java.util.Arrays类提供了Arrays.asList方法来把数组转换为List。但是有次进行开发的时候写了下面两行代码:String strVal = "aaa";List<String> rawValList...
2014-06-04 17:50:52
144
原创 由exception引起的promotion failed问题的排查与解决
web系统间歇性抽疯问题排查与解决 最近发现维护的web系统经常不定期出现持续时间很短的不可访问的问题(502错误)。问题出现时间不定,持续时间大概在1-2分钟左右。 1.问题定位:出现问题的第一反应是系统挂了,但是过了2分钟左右还没来得及重启系统,就恢复正常了,所以排除系统挂了的原因。第二反应是可能当时的流量较大,恰好自己的请求没有来不及响应。但是根据当时的流量,并没有发...
2014-06-03 15:53:46
665
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人