Noark入门之线程模型

Stella981
• 阅读 819

0x00单线程

多进程单线程与单进程多线程的目的都是想尽可能的利用CPU,减少CPU的空闲时间,特别是多核环境,今天咱不做深度解读,跳过...

0x01线程池+锁

最早的一部分游戏服务器是采用线程池的方式来处理玩家的业务请求,以达最大限度的利用多核优势来提高处理业务能力。

但线程池同时也带来了并发问题,为了解决同一玩家多个业务请求不被并发,引入了锁的方式,每个Session一把锁,锁住业务处理逻辑,从而解决同步问题

0x02串行化设计

借鉴了Netty的串行化设计理念,业务线程池也采用了串行化设计,这就意外着整个流程如同单线程一下顺序执行,也不会进行线程上下文的切换,数据也不会面临被并发修改的风险

那如何实现玩家与线程绑定关系呢?

我们只要简单的取模运算,映射到固定的线程上执行即可,比如我们有N个业务线程

public Executor balanceExecutor(long playerId) {
    return executors[playerId % N];
}

以前上线的游戏都是基于串行化的方式,在大量数据统计下,玩家ID或场景ID以及模块划分都不能作为负载均衡的条件,在活动期,是很不均衡,虽然能满足日常运营活动体验.

0x03抽象的Actor模型

服务器游戏需要什么?指定逻辑有序执行...

可以把服务抽象为玩家队列,模块队列等等,一个队列就是一个Actor的Mailbox,从而进行有序的执行指定业务逻辑...

Noark内置了@Controller注解,threadGroup为玩家线程组所有逻辑则以玩家ID来分组执行,如果是模块线程组则以模块名来分组执行...

A玩家请求1,2,3协议,则会以先后顺序进行有序执行... B玩家的请求也会有序执行,只要线程池有空闲线程,就不会受到A玩家的延迟影响...

同理,各模块划分都是独立的,互不影响,就这解决了串行化设计中模块Hash定位不受控制问题.

有序执行的功能请参考

xyz.noark.core.thread.TaskQueue.complete()

小结:多线程处理多队列,有序而已...

点赞
收藏
评论区
推荐文章
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
Wesley13 Wesley13
3年前
java 面试知识点笔记(十三)多线程与并发
java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.
Wesley13 Wesley13
3年前
java多线程常见问题
Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Bl
Easter79 Easter79
3年前
springboot+线程池使用
关于线程和线程池的学习,我们可以从以下几个方面入手:第一,什么是线程,线程和进程的区别是什么第二,线程中的基本概念,线程的生命周期第三,单线程和多线程第四,线程池的原理解析第五,常见的几种线程池的特点以及各自的应用场景一、什么是线程线程,程序执
Stella981 Stella981
3年前
Python实现多进程
Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im
Wesley13 Wesley13
3年前
4、jstack查看线程栈信息
1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6
Stella981 Stella981
3年前
Jetty调优文档
1.      线程池线程池线程资源大小确定了服务器的服务能力默认大小不一定能满足生产环境线程分配方式决定了服务器的资源利用效率固定线程数处理多任务,代表:JDK的ThreadPoolExecutor       以最大的线程数为限处理多任务,代表:jetty自带的QueuedThreadPoolje
Wesley13 Wesley13
3年前
Java 基础知识(七)
1.创建线程池1)newCacheThreadPool 创建一个可缓存的线程池,如果线程池长度超过处理需要,可灵活回收空闲线程,若无可回收,则新建线程 2)newFixedThreadPool  创建一个定长线程池,可控制线程最大并发数,超出的线程会在队列中等待 3)newScheduledThreadPool  创建一个定长线程池,支持
Wesley13 Wesley13
3年前
Java线程与多线程
1线程与多线程1.1线程是什么?线程(Thread)是一个对象(Object)。用来干什么?Java线程(也称JVM线程)是Java进程内允许多个同时进行的任务。该进程内并发的任务成为线程(Thread),一个进程里至少一个线程。Java程序采用多线程方式来支持大量的并发请求处理,程序如果在
Wesley13 Wesley13
3年前
Java 并发编程:AQS 的互斥锁与共享锁
我们知道现代机器处理器几乎都是多核多线程的,引入多核多线程机制是为了尽可能提升机器整体处理性能。但是多核多线程也会带来很多并发问题,其中很重要的一个问题是数据竞争,数据竞争即多个线程同时访问共享数据而导致了数据冲突(不正确)。数据竞争如果没处理好则意味着整个业务逻辑可能出错,所以在高并发环境中我们要特别注意这点。!(https://pic2.zhim