Noark入门之线程模型

0x00单线程

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

0x01线程池+锁

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

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

0x02串行化设计

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

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

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

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

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

0x03抽象的Actor模型

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

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

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

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

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

有序执行的功能请参考

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

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

点赞
收藏

评论区

加载中...

相关推荐

手写Java HashMap源码

HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22

java 面试知识点笔记(十三)多线程与并发

java线程池,利用Exceutors创建不同的线程池满足不同场景需求:1.newSingleThreadExecutor() 创建一个单线程的线程池。这个线程池只有一个线程在工作,也就是相当于单线程串行执行所有任务。如果这个唯一的线程因为异常结束,那么会有一个新的线程来替代它。此线程池保证所有任务的执行顺序按照任务的提交顺序执行。2.

springboot+线程池使用

关于线程和线程池的学习,我们可以从以下几个方面入手:第一,什么是线程,线程和进程的区别是什么第二,线程中的基本概念,线程的生命周期第三,单线程和多线程第四,线程池的原理解析第五,常见的几种线程池的特点以及各自的应用场景一、什么是线程线程,程序执

java多线程常见问题

Java多线程是什么Java提供的并发(同时、独立)处理多个任务的机制。多个线程共存于同一JVM进程里面,所以共用相同的内存空间,较之多进程,多线程之间的通信更轻量级。依我的理解,Java多线程完全就是为了提高CPU的利用率。Java的线程有4种状态,新建(New)、运行(Runnable)、阻塞(Blocked)、结束(Dead),关键就在于阻塞(Bl

Python实现多进程

Python可以实现多线程,但是因为GlobalInterpreterLock(GIL),Python的多线程只能使用一个CPU内核,即一个时间只有一个线程在运行,多线程只是不同线程之间的切换,对多核CPU来说,就是巨大的浪费。如4核CPU,实际上只利用了一个核,CPU利用率只有25%。要充分利用多核CPU,可以实现Python的多进程。首先,im

4、jstack查看线程栈信息

1、介绍利用jps、top、jstack命令找到进程中耗时最大的线程,以及线程状态等等,同时最后还可以显示出死锁的线程查找:FoundoneJavaleveldeadlock即可1、jps获得进程号!(https://oscimg.oschina.net/oscnet/da00a309fa6

Noark入门之线程模型 - HelloWorld