Metrics相关技术使用点

2015/10/25 10:26:50 No Comments

本文参考了原metrics的get start以及用户手册,如链接:http://metrics.dropwizard.io/3.1.0/getting-started/

技术点

1 Gauge 取值功能

用来进行获取某个值的功能,其封装一个getValue方法,那么在指定的周期时间之内,metrics可以调用这个方法用于获取特定的值。比如,某个队列当前大小,当前cpu,内存等信息。
因为是实时获取,因此可能有些值获取成本较高,或者不需要每次都取最新值,因此可以考虑使用类似缓存的技术。如在5s之内是缓存的。

read more… »

解决jetty在windows下锁静态文件的问题

2015/10/13 18:36:57 No Comments

本文原英文地址:http://www.eclipse.org/jetty/documentation/9.3.0.v20150612/troubleshooting-locked-files-on-windows.html#d0e26059
在jetty容器内,对于静态文件,会采用内存缓存的实现方式,如采用buteBuffer的方式来进行缓存。如果使用NIO连接器(默认情况),jetty就会采用文件映射(filemapper)的方式。但是这个方式在windows下会存在一个问题,即使用文件内存映射会导致这个文件被进程锁住,其它进程就不能但修改或者替换这个文件了。解决这个问题的一个方法就会停掉jetty,但这种方式显示不太靠谱。

jetty提供了一个开关标记来开启或者禁止内存映射,在类DefaultServlet中有一个属性useFileMappedBuffer,此属性值默认为false,并且在配置文件webdefault.xml中进行配置。

默认的配置文件存储在jar包jetty-webapp-${version}.jar中的org/eclipse/jetty/webapp/webdefault.xml,还有一份存储在jetty-home/etc/目录中。两者的区别在于,后者由jetty运行时配置文件中默认使用。前者由在代码中WebAppContext默认使用(没有配置值的情况下).最简单的作法就是修改这个配置文件,如下所示:

<init-param>
   <param-name>useFileMappedBuffer</param-name>
   <param-value>true</param-value> <!-- change to false -->
</init-param>

read more… »

jdk线程池中调整coreSize无效的问题分析及处理

2015/10/08 15:40:24 No Comments

近期在ETL项目中,增加一个用于监控队列数和当前线程数之间的关系,并动态调节线程池大小的一个功能。其作用机制即是指当发现队列中任务太多时,能够增大线程数,以达到使用更多的线程来运行任务的目的。相应的伪代码如下所示:

    extThreadPoolExecutor.setCorePoolSize(newCorePoolSize);
    extThreadPoolExecutor.prestartCoreThread();

但是在后面通过监控发现以下的信息

队列总数:1670,核心线程数:500,活跃线程数:200

即相应的核心线程数是已经作了相应的调整,但是活跃线程数,却始终没有上升。没有达到调节线程数的目的。
从理论上说,如果增大了核心线程数,那么线程数会在新任务时,会自动创建新的线程来进行相应的任务,并且我们通过手动启动核心线程来强制运行任务,因此也不会出现线程并没有创建的问题(详细可以查看prestartCoreThread的作用)。

read more… »

redisson中连接对象创建及断线重连

2015/09/04 15:43:49 No Comments

在redisson中,由于使用了netty来封装对redis的协议访问,因此对于连接对象的创建和释放,也借由相应的connection来实现。由篇由masterSlave的角度,描述整个redisson中对于client的封装,以及在网络中断情况下,客户端会得到什么样的反馈,如何实现重连的情况。

本篇主要介绍master slave情况下各个对象的关系图信息,以及在具体创建时的一些处理问题.Redisson版本:2.1.1

1 对象关系图

整个关系如上所示,由下图进行描述

  1. 由MasterSlaveServersConfig负责配置连接的各项参数,比如master地址,slave地址,连接数大小等,这个对象是在redision创建时,由Config对象负责创建的
  2. 在调用Redission.create时,创建起相应的connectionManager对象,其持有相应的master连接信息,以及相应slave的连接信息
  3. 相应的connectionManager负责创建卢相应masterEntry以及slaveEntry信息,并且保存相应的映射信息
  4. connectionManager负责当前客户端对于具体服务器端的各项配置以下,比如转码器,连接池,使用的各项协议等,其根据这些信息,使用netty创建起相应的redisClient对象
  5. entry将已经创建好的redisClient交由connectionEntry负责持有,因此这里的client仅表示一个特有的客户端连接信息。在初始化时并不自动创建相应的连接
  6. entry因此持有相应的client,因此也自然根据当前的需要创建出相应的connection对象,这里entry的创建工作交由client负责,同时将创建好的connection管理起来

read more… »

scala中sbt相应安装及配置信息

2015/08/23 22:09:00 No Comments

在使用scala进行开发时,特别是混合java进行开发时,都推荐使用sbt,而不是使用maven进行开发。因此,本篇描述了我搭建一个基本的sbt环境以及相应的配置信息,并且在idea中也能够识别相应的配置信息。
默认情况下,scala的配置信息使用默认值均会使用 ~/.ivy2以及~/.sbt,作为开发人员,肯定不会使用这些默认值,而是使用统一的配置目录及相关信息.

默认安装情况

默认情况下,将sbt文件从官方(http://www.scala-sbt.org/download.html)下载下来,并解压至指定的目录之后。配置好环境变量(主要是bin)之后,运行sbt,将使用默认的配置下载相应的组件信息。

  • ivy存储配置信息    默认存储在~/.ivy2目录下,主要包括在整个项目开发中所使用的jar缓存,类型maven中的repository
  • sbt启动信息    默认存储至~/.sbt 目录下,主要包括sbt启动时所依赖的组件,如scala信息以及sbt本身的各项jar文件.

自定义配置
其实这些配置信息都可以通过sbt自带的配置文件进行修改,网上在类似替换jar文件,或者在~/.sbt中增加配置项这些作法。但对于不想将配置信息放在~目录中来说,这些都不太方便。要修改这些信息,也很方便,在linux中,我们只需要修改文件sbtopts即可.此文件随sbt提供,在sbt目录下的conf目录中。具体配置如下所示:

read more… »

fastjson 反序列化源码解析

2015/08/16 13:02:18 No Comments

fastjson从0.X版本到最新版本,由于其特殊的编码(即特别编码优化),让人对其实现思路很难处理,加上没有注释,因此在学习了解时也很困难。因此,本篇即从基本概念入手,忽略其一些特殊处理点(对实际结果无意义),了解其反序列化实现思路。
本文基于fastjson版本 1.2.4

1 基本概念

  • token-词法标记      用于标识当前在解析过程中解析到的对象的一个标记,具体的值参考 JSONToken。比如 {,即表示当前正在解析的是一个类似map或对象的格式,而},则表示当前对象已经到底了。
  • ch-当前字符    用于表示当前已经读取到的字符是什么,如 abc,当位置为1时,则当前字符为 b
  • bp-解析字符位置    用于表示当前字符所位于原始字符串中的哪一个位置,与ch是相对应的,它始终表示最新的一个位置,如果需要记录一些历史位置。如字符串起始位置,数字起始位置等,则需要使用其它标记,如np。
  • sbuf-字符缓冲    在解析字符串时的特殊存储区域,主要是用于解析转义字符时的临时存储区。即如果原字符串为 a\\t,则实际解析的字符串应该为a\t,那么原字符串为3位长,解析之后为2位长。即需要另行存储。字符缓冲区如名所示,为一个字符数组,需要需要单独的定义来存储长度信息,如使用sp。
  • sp-字符缓冲区位置    这个用于表示在字符缓冲区之间记录当前字符串(或数字串)等的长度信息,同时也等同于当前的一个位置(如果坐标从0开始)。
  • np-数字解析位置    用于实际表示在解析到常量信息时起始点的标记位置。通过np + sp,即计算得出相应的区间值了。

read more… »