Venus 日志

Venus 3.0.6 Released
  1. source code文件采用 utf8编码
  2. 修正了接口返回null 客户端出现解析异常的bug
Venus 3.0.4 Released

功能增加:

  1. 支持服务参数 无默认构造函数  类序列化与反序列化,该类必须实现 java.io.Serializable  接口
  2. Endpoint annotation增加 timeWait ,解释:
    1. 客户端:等待该方法返回结果的超时时间
    2. 服务端:客服端请求进入队列,等待执行线程开始执行的时间
    3. 时间单位:毫秒,默认30000毫秒
    4. 主要作用:该参数主要用于协商该接口的调用最大等待时间,服务端的作用在于防止请求的浪涌(诸如秒杀,秒杀的特征基本在于刷页面,会导致不停的请求进入后端服务执行队列中,包括客户端恶意请求,不等待请求结果而再次发起请求)。这种情况服务端执行线程肯定非常繁忙,而且开始有队列堆积,当堆积到一定程度,如果服务端从队列中获得该请求,并且开始执行的时候,可能用户已经不耐烦,关闭页面或者已经超时,那么就没有必要执行这个请求,应该返回特定的数据包给客户端,告知请求被忽略了。
Venus 3.0.3 Released

BugFix:

1. 修正了3.0.2之前的客户端对 3.0.2版本的服务端调用 出现异常的问题

Venus 3.0.2 Released

Venus 3.0.2增加Venus调用跟踪日志:

2013-10-21 11:14:48,385 DEBUG venus.tracer - receive id=d6863646-6b87-4e53-8d70-41068fc875e3,service=HelloService.sayHello,params={name:jack}
2013-10-21 11:14:48,394 DEBUG venus.tracer - receive id=f891fddf-537c-4195-82ea-d1d9384a2794,service=HelloService.sayAsyncHello,params={name:jack}
method sayAsyncHello invoked
2013-10-21 11:14:48,418 DEBUG venus.tracer - receive id=1e986970-0235-403d-a33b-ec9208781039,service=HelloService.sayHelloCallback,params={name:jack,callback:com.meidusa.venus.notify.ReferenceInvocationListener@28f19d6e}
2013-10-21 11:16:27,853 DEBUG venus.tracer - receive id=35fcb9ae-deb1-4b5e-abdf-707d49c826ef,service=HelloService.getHello,params={name:Jack}

主要在几个地方增加日志:

  • 发起Venus 服务请求 (request id=....)
  • 接收到服务请求 (receive id=....)
  • 接收到回调请求 (callback id=...)

Venus 日志格式:

* debug打印的信息:请求标识{request,receive,callback} id={uuid},service={apiName},params={request Param Json}
* Info 打印的信息:请求标识{request,receive,callback} id={uuid},service={apiName}
* warn或则error将忽略该日志
原理:
  1. 客户端:Venus通过ThreadLocal判断当前是否有请求表示初始请求的UUID,如果不存在则产生byte[16]数组,存储在com.meidusa.venus.util.ThreadLocalMap, Key="REQUEST_TRACE_ID",每次发起请求,则将这byte[16]通过数据包传输
  2. 服务端:接受到Venus客户端的请求,则解析数据包,获取byte[16],存储在com.meidusa.venus.util.ThreadLocalMap,以方便该线程的Venus调用使用,如果在该线程进行二次Venus调用,那么可以将这个byte[16] 带入这次请求
  3. 重置UUID:单线程或者后台系统如何分离不同的Venus请求? 每次调用Venus,如果一次调用作为一个完整的Venus调用,需要通过 com.meidusa.venus.util.ThreadLocalMap类 调用reset() 方法来清理 ThreadLocalMap中的byte[]
  4. 日志输出:通过UUID类,将byte[16]生成36个长度的字符串打印出来。

相关Log4j配置

     <logger name="venus.tracer" additivity="true">
        <level value="debug"/>
        <appender-ref ref="CONSOLE"/>
    </logger>
Venus 3.0.1 Released

简介: venus 3.0.1做一次重大升级,首先NIO框架进行升级,增加了路由协议,服务端将支持Venus Bus.协议数据包,性能有所提升

本次升级兼容2.x版本

  1. 增加了Venus Bus系统,Venus Registry系统(简单)
  2. 增加nio的虚拟连接池 (PollingBackendConnectionPool)
  3. 依赖全新的网络io框架,toolkit-net-nio
  4. 剔除对log4j的直接依赖,转向对slf4j的接口依赖
  5. venus-backend支持 venus-bus的路由协议包
  6. Venus性能优化
  7. venus接口支持Set集合

Venus 2.3.0 Released

本期更新内容:

  1. 主要解决内部类库的依赖,剔除了不合理的依赖关系
  2. 为接入slf4j做准备
  3. 依赖的Toolkit类库都进行了版本升级
Venus 2.2.7 Released

Venus 2.2.7 Released:

主要新增功能:客户端根据 服务的请求参数,通过一致性hash的方式将请求发送到hash环的一台机器上。

主要目的:有些数据是有缓存,并且这些内存数据会定期执行某种业务。那么跟在内存中的数据相关的操作必须发送到这台服务器上,避免相同数据出现的不同的物理机器上。

这个功能主要是由客户端来决定的,虽然有点不妥,但目前来説,对于内部服务是非常有效的解决方法。

使用方法:

一个接口关于一致性hash的用法
	@Endpoint(name = "getHello",loadbalancingKey="name")
	public abstract Hello getHello(@Param(name = "name") String name);

复杂对象的loadbalancingKey表达式写法:

复杂对象的loadbalancingKey表达式
	@Endpoint(name = "testChild" ,loadbalancingKey="hello.name")
	public abstract Hello testChild(@Param(name = "hello") Hello hello);
注意: 要让一致性hash路由算法起作用,remote中的地址必须配置多个ip
Venus 2.2.6 Released

Venus 2.2.6 Released:

该版本改进有2方面:

  1. validator有了新的性能提升
  2. 修复了toolkit-net-io的一个bug
  • 相关的Bug描述:由于 connectionManager在主循环中检测并且发送ping包,ping发送的时候,如果该connection之前有消息堆积(可能是由于网络问题/CPU/GC时间过长等问题 最终导致消息堆积) ,并且当前消息堆积达到设定的最大值,
    默认最大值Venus设定了1(目前每个连接已经提示到10000),
  • 解决方法: connection *idle check仍旧保留在主循环中,但是发送ping包通过另外一个线程来发送,避免主线程wait.并且增加每个连接的发送队列长度.
Venus 2.2.3 Released

Venus 最新版本 2.2.3发布,本次积累前面很多版本,目前达到版本稳定状态,积累了前面很多的功能

一、新增功能介绍

1、venus能够通过Http协议暴露服务,新功能的详细介绍请参阅wiki

2、Performance Logger可以通过 endpoint进行定义,具体如下:

venus service 端 performanceLogger 设置
<endpoint name="getHello" interceptor-stack="helloService-stack" >
	<performanceLogger>
		<property name="info">2000</property>
		<property name="warn">5000</property>
		<property name="error">7000</property>
		<property name="printParams">true</property>
	</performanceLogger>
</endpoint>

相应的log4j配置:

log4j
    <logger name="venus.service.performance" additivity="false">
        <level value="debug"/>


	<!-- 这儿自己设置需要输出的地方 -->
        <appender-ref ref="PROJECT-CONSOLE"/>
    </logger>

3、新增加内置service,该service将自动加载成为一个服务,接口如下:

Venus.MonitorService
@Service(name="Venus.MonitorService",version=1,singleton=true)
public interface MonitorService extends SystemService{

	@Endpoint(name="getSerivces")
	public List<ServiceBean> getSerivces();

	@Endpoint(name="getServerStatus")
	public ServerStatus getServerStatus();

	@Endpoint(name="getVersion")
	public String getVersion();

}

4、venus支持序列化Exception的其他属性(符合javabean的规范,有包含有get、set方法的属性将会序列化到客户端)

5、venus validator的一些性能将有所提升

6、venus支持自定义数据结构的序列化器提供注册方法,具体如下:

  • 首先需要编写自动加载的文件,该文件应该在 META-INF/venus.io.extension.ini
  • 该文件提供3个section,分别是: [json.encoder] 、[json.decoder]、[bson],具体格式参阅下面内容:
    venus.io.extension.ini 文件内容:
    [json.encoder]
    org.xmpp.packet.Message=com.meidusa.venus.extension.xmpp.io.json.PacketSerializer
    
    [json.decoder]
    org.xmpp.packet.Message=com.meidusa.venus.extension.xmpp.io.json.PacketDeserializer
    
    [bson]
    org.xmpp.packet.Message=com.meidusa.venus.extension.xmpp.io.bson.PacketObjectSerializer
    
  • [json.encoder] 后面的PacketSerializer,需要实现接口:com.meidusa.fastjson.serializer.ObjectSerializer
  • [json.decoder] 后面的ObjectDeserializer,需要实现接口:com.meidusa.fastjson.parser.deserializer.ObjectDeserializer
  • [bson]  的需要实现接口:com.meidusa.fastbson.serializer.ObjectSerializer

7、venus eclipse插件,通过该插件可以将接口自动生成venus service接口(自动填写annotation相关内容),具体参阅venus的wiki

二、bug修复

1、修复fastjson序列化的时候,由于采用threadlocal cache住永不收缩的buffer,在大数据量传输的时候导致内存问题

三、其他改动:

1、venus-helloworld源代码迁移至: svn://svn.hexnova.com/venus/venus-helloworld

2、venus-hsb将成为独立项目,源代码也将从venus的项目中剥离

Venus 2.0.4 Released

本次升级主要针对接收socket传输的buffer进行了可动态调整buffer的大小

原因:

每次从socket channel中读取完成一个数据包的时候,将动态调整每次接收到packet的平均大小,根据当前的buffer与平均值,来进行决策是是否需要收缩当前连接接收的buffer。

主要目的是为了解决,当前连接在接收一个非常大数据包(接近venus启动的时候设定的buffer的最大值: -Dtookit.packet.max=2*1024*1024 ,默认2M)buffer将会自动扩容来容纳数据,在之前的版本,该buffer始终会保留在这个connection上,除非该connection被关闭才会释放这个buffer。这样会带来一个问题:久而久之所有连接上的buffer都可能达到 最大值2M,占内存非常恐怖,可以计算一下: 连接数 * 2M ... 很容易造成内存不足 导致 OOM的问题。

具体策略

因此需要采用动态调整Buffer的大小:

本次改动增加一个自动收缩的参数:-Dtookit.packet.shrink=10*1024 ,我们当这个为X(默认10k),新一轮在从socket 的缓冲区读取数据的时候,会检测当前buffer的大小,

  1. X :表示 为自动收缩
  2. A :表示数据包的平均大小
  3. M:表示数据包的最大限制值
  4. C:表示当前数据包大小
  5. B:表示当前Buffer大小

下面几点说明以上几个参数变化的条件:

  • C 如果大于 M,则将关闭当前socket连接
  • C 如果大于 B,则扩容 B 的大小,达到能够容纳 C 
  • B 如果大于 X,那么将会收缩到 这个设定的值 X,如果平均值 A 也超过 X ,那么还是根据具体的业务情况来在启动脚本中调节 X 这个参数的数值,可以适当调大
  • B 如果小于 X,那么将会判断当前Buffer 是否大于A的4倍,如果大于则收缩成2倍的A: 2 × A,否则不做收缩
Venus 2.0.3 Released

bug Fix列表:

1、修复连接池出现网络异常以后无法修复连接问题,提升了虚拟连接池心跳检测可靠机制。

改善的地方:

1、客户端每个Remote下,每个地址将开启成一个阻塞Pool、非阻塞Pool。如果该remote配置多个地址组成,则将会形成一个虚拟Pool

2、增加客户端的性能日志输出:

log4j.xml配置
    <logger name="venus.service.performance" additivity="false">
        <level value="debug"/>


	<!-- 这儿自己设置需要输出的地方 -->
        <appender-ref ref="PROJECT-CONSOLE"/>
    </logger>
日志输出形式
2012-03-23 14:18:42,984 DEBUG service.performance - [0,0]ms api=HelloService.sayAsyncHello
2012-03-23 14:18:42,984 DEBUG service.performance - [0,0]ms api=HelloService.sayAsyncHello
2012-03-23 14:18:42,984 DEBUG service.performance - [0,0]ms api=HelloService.sayAsyncHello
2012-03-23 14:18:42,984 DEBUG service.performance - [0,0]ms api=HelloService.sayAsyncHello

解释:[0,0]ms api=HelloService.sayAsyncHello 

格式:[x,y]ms api=apiName,其中x表示获取一个连接的时间,y表示客户端发起一个请求,并且收到服务端反馈总共消耗的时间,这2个单位都是毫秒,apiName表示本次请求的api方法

Venus 2.0.1 Released

Bug Fix列表

  1. 修复Bson遇到自定义的带泛型类无法decode
  2. 修复bechmark测试工具 中途停止(CTRL+c中断)无法report问题.
  3. 修复bechmark测试工具 请求timeout的问题。

改进以及提高方面

  1. 增加用户名、密码认证方式、虚拟认证方式
  2. 2.x 的客户端服务端协议做了改进,将不兼容1.X的版本,建议使用2.0,主要为了未来的HSB做了协议改进
  3. Bson支持自定义接口类型数据 decode到目标实现类(使用方式: FastBsonSerializer.registerReplace(myInterface.class, myImplements.class);)
  4. 增加annotation方式的参数校验,具体请参阅高级使用指南--参数校验
Venus 1.3.0 Released

一:优化或者改进方面

1、bson序列化性能提升、并且作为独立的包,在大数据量序列化反序列化明显超越 fastJson

2、bechmark 测试工具增加bson协议的测试,下载地址: venus-benchmark-1.3.0-distribution.zip

二、bugFix

1、bson序列化类型错误修复

2、优化客户端的failOver机制

Venus 1.2.0 Released


该版本主要是bug修复.

Bug修复列表

  1. 修正服务方法中如果包含数组参数无法正确转换问题
  2. 修正客户端socket需要过长时间修复已经断开的连接(java版本, 修正类库toolkit-net-io 由1.5升级到1.6版本)
  3. Service 接口只申明Service annotation而没有定义name导致 客户端与服务端程序解析 Service API 出现不一致情况
Venus 1.1.0 Released

修改内容:

  1. 主要增加exception的处理
  2. 增加VenusExceptionLevel,主要让客户端实现该接口,在服务端出现该异常的时候,让venus框架了解该异常是属于什么级别的异常,方便日志输出。如果不实现该接口,则都采用debug输出
  3. demo程序venus-helloworld的结构修改:
    1. 采用3层方式:api、client、service层
    2. api只包含service interface、exception、parameter对象

编译运行以及测试

从svn co  svn://svn.hexnova.com/venus/trunk/venus-helloworld

下面是讲述在控制台的执行流程:

  1. mvn install                             --由于client运行testcase的时候需要service端的SocketServer开启才可能让testcase正常工作(该阶段testcase有Failure),另外由于这些项目采用自动化配置插件进行各项参数的配置,需要在resource阶段填写参数
  2. cd venus-helloworld-service 然后 mvn exec:java        --启动后端venus Server
  3. cd venus-helloworld-client 然后运行 mvn test        --启动testcase

下面是讲述eclipse的执行流程:

  1. 以maven的项目import venus-helloworld工程
  2. mvn install                           --由于client运行testcase的时候需要service端的SocketServer开启才可能让testcase正常工作(该阶段testcase有Failure),另外由于这些项目采用自动化配置插件进行各项参数的配置,需要在resource阶段填写参数
  3. 以application方式启动venus-helloworld-service的com.meidusa.venus.hello.HelloworldApplication
  4. 以junit test方式运行: com.meidusa.venus.hello.client.TestHelloService