Skip to content

netty 集群网络游戏服务器框架 ioGame 17.1.60 action 业务线程监控插件

Compare
Choose a tag to compare
@iohao iohao released this 10 Dec 06:03
· 231 commits to main since this release

主要更新

#227 增加调度、定时器相关便捷工具,使用 HashedWheelTimer 来模拟 ScheduledExecutorService 调度

public void test() {
    // 每分钟调用一次
    TaskKit.runIntervalMinute(() -> log.info("tick 1 Minute"), 1);
    // 每 2 分钟调用一次
    TaskKit.runIntervalMinute(() -> log.info("tick 2 Minute"), 2);

    // 每 2 秒调用一次
    TaskKit.runInterval(() -> log.info("tick 2 Seconds"), 2, TimeUnit.SECONDS);
    // 每 30 分钟调用一次
    TaskKit.runInterval(() -> log.info("tick 30 Minute"), 30, TimeUnit.MINUTES);

    //【示例 - 移除任务】每秒调用一次,当 hp 为 0 时就移除当前 TimerListener
    TaskKit.runInterval(new IntervalTaskListener() {
        int hp = 2;

        @Override
        public void onUpdate() {
            hp--;
            log.info("剩余 hp:2-{}", hp);
        }

        @Override
        public boolean isActive() {
            // 当返回 false 则表示不活跃,会从监听列表中移除当前 TimerListener
            return hp != 0;
        }
    }, 1, TimeUnit.SECONDS);

    //【示例 - 跳过执行】每秒调用一次,当 triggerUpdate 返回值为 true,即符合条件时才执行 onUpdate 方法
    TaskKit.runInterval(new IntervalTaskListener() {
        int hp;

        @Override
        public void onUpdate() {
            log.info("current hp:{}", hp);
        }

        @Override
        public boolean triggerUpdate() {
            hp++;
            // 当返回值为 true 时,会执行 onUpdate 方法
            return hp % 2 == 0;
        }
    }, 1, TimeUnit.SECONDS);

    //【示例 - 指定线程执行器】每秒调用一次
    // 如果有耗时的任务,比如涉及一些 io 操作的,建议指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
    ExecutorService executorService = TaskKit.getCacheExecutor();

    TaskKit.runInterval(new IntervalTaskListener() {
        @Override
        public void onUpdate() {
            log.info("执行耗时的 IO 任务,开始");

            try {
                TimeUnit.SECONDS.sleep(3);
            } catch (InterruptedException e) {
                throw new RuntimeException(e);
            }

            log.info("执行耗时的 IO 任务,结束");
        }

        @Override
        public Executor getExecutor() {
            // 指定执行器来执行当前回调(onUpdate 方法),以避免阻塞其他任务。
            return executorService;
        }
    }, 1, TimeUnit.SECONDS);

    TimeUnit.SECONDS.sleep(20);
}

#225 新增插件 - 业务线程监控

详细文档 https://www.yuque.com/iohao/game/zoqabk4gez3bckis

BarSkeletonBuilder builder = ...;
// 业务线程监控插件,将插件添加到业务框架中
var threadMonitorInOut = new ThreadMonitorInOut();
builder.addInOut(threadMonitorInOut);

打印预览

业务线程[RequestMessage-8-1] 共执行了 1 次业务,平均耗时 1 ms, 剩余 91 个任务未执行
业务线程[RequestMessage-8-2] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-3] 共执行了 1 次业务,平均耗时 1 ms, 剩余 36 个任务未执行
业务线程[RequestMessage-8-4] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-5] 共执行了 1 次业务,平均耗时 1 ms, 剩余 88 个任务未执行
业务线程[RequestMessage-8-6] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行
业务线程[RequestMessage-8-7] 共执行了 7 次业务,平均耗时 1 ms, 剩余 56 个任务未执行
业务线程[RequestMessage-8-8] 共执行了 1 次业务,平均耗时 1 ms, 剩余 0 个任务未执行

其他更新

废废弃 InternalKit,使用 TaskKit 代替

HeadMetadata 新增 cloneAll 方法

增加 ThreadExecutorRegion 线程执行器管理域接口;

  • 新增 UserThreadExecutorRegion 实现,执行器具体数量是不大于 Runtime.getRuntime().availableProcessors() 的 2 次幂。
  • 新增 SimpleThreadExecutorRegion 实现,执行器的数量与 Runtime.getRuntime().availableProcessors() 相同。

默认为 UserThreadExecutorRegion 和 SimpleThreadExecutorRegion 提供了单例实现,即使在同一进程中启动了多个逻辑服,也不会创建过多线程执行器,而是使用同一个。