`
沉沦的快乐
  • 浏览: 55809 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论
文章列表
消息传递可靠性         akka帮助我们在单机多核处理器或多服务器分布式系统中构建可靠性强的的应用系统。为了实现这一点,关键是在你的代码单元的交互中(也就是actor)的交互只通过消息传递来实现。因此值得花一章的 ...
     使用类型安全平台(包括scala和akka在内)的一个目的是,它能使编写并发软件变得简单。本章主要介绍类型安全平台,特别是akka,是如何在并发应用中处理共享内存的。   java内存模型JMM        在jdk 5之前的版本中,java内存模型的定义并不是很好。当多线程访问共享内存时,可能会得到各种千奇百怪的结果,比如:        看见性问题:一个线程看不到另一个线程写入的值。        指令重排序问题:一个线程可能看到另一个线程完全不可能的行为。因为有些机器指令并不是按照你所以期望的顺序执行。       在java 5之后,很多这样的问题都得到了解决 ...
     上一章akka学习之actor引用,路径和地址介绍了如何使用actor路径来让actor的位置变得透明。但是一些特殊的特性有必要再额外介绍下,因为在不同的编程语言,平台和技术环境中,远程透明的意思非常也不一样。   默认 ...
      这章主要介绍在分布式akka系统中actor是如何识别和寻址的。它的主要思想是actor系统本身形成的内在监护层级结构以及跨多个网络节点中actor之间的通信是位置透明的。  上面这张图描述了akka系统中主要的几种实体之间 ...
       在前面的章节akka学习之actor介绍中介绍了actor对ziactor有监护职责,同时actor对其他actor的生命周期等信息进行监控。这张将详细解释什么是监护和监控。 什么是监护(supervision) 在actor系统,一个actor(上司也可以成为 ...
actor系统       前面讲过actor其实是封装了状态和行为的对象,actor之间唯一的通信方式是通过接收者的邮箱交换信息。为了更好的了解actor系统,可能把它类比为人群会更好理解些。在使用actor来对解决方案建模时,把actor想象 ...
什么是actor     在上面一章大致提到了akka使用actor对象来处理任务。那么在真正深入学习akka之前,必须先知道什么是actor。actor在语言层面上来说,就是一个对象,但是从功能层面上来说,也可以把它看成一个容器,它包含了 ...
什么是akka     akka是一个用scala编写的库,用于简化编写可容错的,可扩展的,高并发应用。akka使用actor模型来提升抽象能力,提供更好的平台来构建可扩展的,弹性的应用。对于比较难处理的错误,akka采用“let it crash”模型来处理,这种模式可以使得一个任务的处理失败不会导致整个应用的crash,使你的系统拥有强大的自愈能力,也不需要重启来恢复系统。同时akka的分布式部署更加简单透明。 akka使用的两种方式 作为库使用:在大多数的web系统中,你可能更倾向与把akka作为一个jar包来使用,你可以直接把jar包拷贝到你的系统中,也可以通过maven依赖把 ...
简介         很多时候我们希望创建一个新线程去执行一个功能相对独立的任务,并在任务完成之后返回执行结果。如果实现Runnable接口,没有办法获得返回值;如果实现Callable接口,必须使用ExecutorService来执行,不能使用更简单灵活的new thread方法来实现。为了解决上面两个问题,于是有了FutureTask。FutureTask实现了Runnable, Future<V>,所以它既可以通过new thread来跑任务,也可以通过ExecutorService来管理任务,同时FutureTask还提供了超时返回的功能。另外还有一个非常有用的功能是它 ...
简介         上一篇文章剖析了ThreadPoolExecutor的原理和实现,这里剖析下ScheduledThreadPoolExecutor的实现方式。ScheduledThreadPoolExecuto能够执行延迟固定时间的任务和周期性任务。在需要多工作线程的情况下,它比Timer更方便,同时比ThreadPoolExecutor有更大灵活性和能力。       但是在使用ScheduledThreadPoolExecutor时,有几个点必须注意: 1.在执行延迟任务时,任务的执行不会早于你设定的延迟时间,但是也不保证恰好在达到你设定的延迟时间时就马上执行。在同一时间开始 ...
        当前越来越多的系统使用多线程来处理任务,但是为每一个任务创建线程并不是合理的方案,原因有2点:一是创建线程的开销很大,一个任务一个线程的方式会有性能上的损失;二是可能导致线程数量的膨胀,不但不易于线程的管理,还可能导致内存被消耗完,导致out of memory(OOM),从而使系统崩溃。为了解决这个问题,线程池应运而生。线程池有两个作用:一个是限制线程的数量,不会导致线程的膨胀;二是线程复用,线程执行完一个人任务之后,可以接着执行下一个任务,减少了创建线程的开销。        java中一个运用非常普遍的线程池是ThreadPoolExecutor。下面来探究下Thre ...
    简介        在java同步锁中,除了synchronized关键字之外,还有很多更灵活的显式锁可供选择,比如ReentrantLock,ReentrantReadWriteLock等。甚至如果jdk中的锁不能满足你的需求,你还可以自己来定义自己的显式锁。显式锁都是实 ...

log4j日志性能优化

    博客分类:
  • Java
       在软件系统中,打日志几乎是每个系统都会使用的行为。不管是用来记录系统健康状态,辅助问题定位,还是收集数据,以便后续数据分析等,日志都起着举足轻重的作用。但是IO的阻塞行为和磁盘
引子    我们团队有维护这样一个类似比价的系统。其中有一个A方法需要查询好几个第三方的http接口,以获取某些信息进行汇总分析。虽然是通过多线程并发的去访问第三方接口,但是有些第三方系统不稳定,只要其中一个挂了就会影响整个方法的效率。团队成员经常在接到报警信息之后手动把不稳定的接口下线,这给大家的正常生活带来了麻烦,因为你有时候不得不不周末或者半夜起来操作。于是我做了一个自动下线功能,假如某个接口在1分钟内抛出的异常大于某个阈值之后自动下线一段时间,并在下线一段时间之后再自动上线,如果上线之后发现异常还没有减少则继续下线。为了实现这个功能,首先需要在抛异常的采集信息,并判断是否需要下线。 ...
字符串操作 1.String.split(seg);的时间是StringUtils.split(str, seg);的1.5倍. 2.String.replaceAll(regex, replacement)的时间是StringUtils.replace(text, searchString, replacement)的1.86倍。 3.如果是单个字符替换StringUtils.replace(text, searchString, replacement)的时间是StringUtils.replaceChars(str, searchChar, replaceChar)的15倍。 ...
Global site tag (gtag.js) - Google Analytics