factor java_dfactor

license-MIT-blue.svg

示例在github可见,链接

最新

监听集群内结点事件api 示例

集群内广播功能 示例

集群间通信(包括rpc)多种序列化格式支持,String,Json,byte[],ByteBuf,自定义序列化对象 示例

增加集群内结点间rpc调用 示例, 本地actor间rpc调用 示例

集群功能上线,去中心化自动组网,集群内结点互相发现互相通信 入门示例

开发中

js脚本开发支持

dfactor

dfactor 是一个基于actor模型的消息处理框架,充分利用多核处理器,平衡业务负载,可参考 erlang

dfactor 使用java编写,天生多平台支持,开发调试方便

dfactor 提供丰富的组件支持,涵盖通信,编解码,rpc,集群组网等等

dfactor 提供易用的api,上手简单,编写少量代码即可快速构建从通信层到存储层的服务端程序

dfactor 示例丰富,持续增加各种类型的服务器开发示例,简单业务做些修改就可使用

dfactor 能做什么?

dfactor 本质是一个actor模型的消息处理框架,加上服务器开发常用的网络通信,定时任务,rpc等

功能,原则上说可以用于任何想充分利用多核性能的业务模型,

常见的比如mmorpg, moba, rts, slg, 卡牌棋牌等类型游戏,或者作为服务端中间件开发的基础组件

dfactor 有哪些特性?

充分利用多核处理器性能优势

TCP, HTTP, HTTPS, UDP, WebSocket多协议支持,快速搭建通信层

通信层使用netty,高性能网络io的保证

集群功能支持,自动组网,结点自动发现,互相通信

支持集群内结点之前rpc通信,本地actor间rpc通信

io和业务分离模型,使业务逻辑计算不受io瓶颈制约,达到最大效能

内置服务器开发常用模块,如计时器,定时任务等

开发接口简单易用,示例丰富,少量代码快速搭建模型

内置redis, mysql, mongoDb 客户端驱动,配合专门io线程使用,实现异步操作数据库及缓存

可 daemon 方式启动,spi模式运行,加载外部 jar 文件实现逻辑快速部署和模块解耦 示例

快速开始

启动一个简单的http-echo服务器

net.doHttpServer(8080, new CbHttpServer() {

@Override

public int onHttpRequest(Object msg) {

DFHttpSvrReq req = (DFHttpSvrReq) msg;

//response

req.response("echo from server").send();

return MSG_AUTO_RELEASE;

}

...

});

几行代码完成HTTP服务器启动,本例代码

性能

TreeTask 百万级actor压力测试

树状actor压力测试,从根节点开始依次创建 6 层深的树,每一层的节点数量为 10

每次任务从根节点开始,向下请求,到达最底层节点时,向上返回结果消息,直到到达根节点

默认树深度为6,每层节点数为10,总共创建 1111111(N) 个actor

一次消息请求,所有子节点都会收到一次请求一次响应(最底层只收到一次请求),

每个节点收到请求和收到响应都会调用_doTask,模拟业务逻辑的消耗(数组的随机打乱+排序)

使用 jvisualvm 观察程序运行时线程和gc情况,如果出现fullGC,需增加jvm分配内存

一次任务共200多万次消息调用,无逻辑负载(注释_doTask)情况下,平均耗时600ms左右,

有逻辑负载(每个actor每次收到消息对30个元素的队列随机打乱和排序)情况下,平均耗时1800ms左右

测试结果:

控制台输出

af8a84c968db158efe7eefa41da5bef8.png

线程使用情况

6acf6341d58f069fe1e3acc483f36839.png

可以做下试验:

将_doTask()内实现注释掉,观察框架任务调度本身的消耗,

调整启动参数的逻辑线程数,

观察只有任务调度消耗和包含了逻辑处理消耗时,不同逻辑线程数下的性能

示例

Startup  快速启动一个dfactor示例

Timeout 计时器使用示例

Schedule 定时任务使用示例

ExitActor 退出actor示例

Shutdown 关闭dfactor示例

ActorConn actor间通信示例

TomAndJerry 多actor通信示例(猫捉老鼠游戏)

BlockActor block类型actor使用示例(适用数据库操作等io场景)

TcpTest TCP服务端客户端通信示例

HttpClient HTTP请求外部服务器示例

RedisTest 使用io线程异步操作Redis示例

MysqlTest 使用io线程异步操作Mysql示例

MongodbTest 使用io线程异步操作Mongodb示例

CallHere 利用异步回调机制,在一个actor中编写另一个actor业务代码的示例

CallHereBlock 利用异步回调机制+框架提供的BlockActor,简化io操作代码,在业务actor中编写io操作代码

StartAsDaemon daemon模式启动示例,加载外部jar执行逻辑的示例,方便部署和模块解耦

测试外部jar文件下载

RpcLocal 本地actor间rpc调用示例

RpcCluster 集群内结点间rpc调用示例

ClusterParam 集群间通信(包括rpc)支持多种消息格式的示例

FAQ

后续计划

增加常用服务端业务示例,如房间类型游戏等等

社区&支持

QQ群:726932841

dfactor 开发哲学

尽量用dfactor实现所有需求

用,不要学

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
解释这段代码:void algorithm_getpara(uint16_t* pu16AlgImgBuf, uint16_t u16AlgCol, uint16_t u16AlgRow, uint16_t* pu16Dmin, uint16_t* pu16Dmax, uint32_t* pu32Dfactor) { int16_t i16Algx, i16Algy, i16Algi; uint16_t u16YSta, u16XSta, u16YEnd, u16XEnd, u16YStep, u16XStep; uint32_t u32AreaOffsetY, u32AreaOffsetX; uint32_t u32Oxi_Arg[6][4]; int iWinWidth = 2550; memset((uint8_t*)&u32Oxi_Arg, 0, sizeof(u32Oxi_Arg)); for (i16Algi = 0; i16Algi < 6; i16Algi++) { u16YSta = g_stAlgArea[i16Algi].u16CdtRow_Sta; u16YEnd = u16YSta + g_stAlgArea[i16Algi].u16CdtRow_Len; u16YStep = g_stAlgArea[i16Algi].u16CdtRow_Step; u16XSta = g_stAlgArea[i16Algi].u16CdtCol_Sta; u16XEnd = u16XSta + g_stAlgArea[i16Algi].u16CdtCol_Len; u16XStep = g_stAlgArea[i16Algi].u16CdtCol_Step; // DBG("%d:u16XSta=%d u16XEnd=%d u16XStep=%d u16YSta=%d u16YEnd=%d, u16YStep=%d\r\n", i16Algi, u16XSta, u16XEnd, u16XStep, u16YSta, u16YEnd, u16YStep); for (i16Algy = u16YSta; i16Algy < u16YEnd; i16Algy += u16YStep) { u32AreaOffsetY = i16Algy * u16AlgCol; for (i16Algx = u16XSta; i16Algx < u16XEnd; i16Algx += u16XStep) { u32AreaOffsetX = u32AreaOffsetY + i16Algx; u32Oxi_Arg[i16Algi][0] += pu16AlgImgBuf[u32AreaOffsetX]; } } u32Oxi_Arg[i16Algi][0] = (u32Oxi_Arg[i16Algi][0] >> 10); //agv,total / (32 * 32) u32Oxi_Arg[i16Algi][1] = ((u32Oxi_Arg[i16Algi][0] << 1) - iWinWidth) >> 1; //min u32Oxi_Arg[i16Algi][2] = ((u32Oxi_Arg[i16Algi][0] << 1) + iWinWidth) >> 1; //max if (u32Oxi_Arg[i16Algi][1] != u32Oxi_Arg[i16Algi][2]) u32Oxi_Arg[i16Algi][3] = (((uint32_t)255) << FACTOR_SHIFT) / (u32Oxi_Arg[i16Algi][2] - u32Oxi_Arg[i16Algi][1]);//factor } u32AreaOffsetX = 0xFFFFFFFF; i16Algx = 0; for (i16Algi = 0; i16Algi < 6; i16Algi++) { if (u32Oxi_Arg[i16Algi][0] < u32AreaOffsetX) { u32AreaOffsetX = u32Oxi_Arg[i16Algi][0]; i16Algx = i16Algi; } } *pu16Dmin = (uint16_t)u32Oxi_Arg[i16Algx][1]; *pu16Dmax = (uint16_t)u32Oxi_Arg[i16Algx][2]; *pu32Dfactor = u32Oxi_Arg[i16Algx][3]; }并说明u32Oxi_Arg[i16Algi][1] = ((u32Oxi_Arg[i16Algi][0] << 1) - iWinWidth) >> 1; //min u32Oxi_Arg[i16Algi][2] = ((u32Oxi_Arg[i16Algi][0] << 1) + iWinWidth) >> 1; //max 这两句为什么要左移与右移
最新发布
06-13

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值