iohao / ioGame

无锁异步化、事件驱动架构设计的 java netty 网络编程框架; 轻量级,无需依赖任何第三方中间件或数据库就能支持集群、分布式; 适用于网络游戏服务器、物联网、内部系统及各种需要长连接的场景; 通过 ioGame 你可以很容易的搭建出一个集群无中心节点、集群自动化、分布式的网络服务器;FXGL、Unity、UE、Cocos Creator、Godot、Netty、Protobuf、webSocket、tcp、socket;java Netty 游戏服务器框架;

Home Page:http://game.iohao.com

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

虚拟线程并不能保证单个玩家请求的有序性

no1zhangli opened this issue · comments

默认的用户虚拟线程执行器并不能保证玩家请求的有序性,请问是否存在这样的问题,需要自己重写UserProcess来保证相同玩家的请求处理顺序。如果存在这样的问题,能否在代码框架里面解决掉,或者在文档里面提醒使用者,虚拟线程执行器不能保证单个用户请求的有序性,因为如果使用者在不清楚逻辑的情况下,因为请求处理顺序出现的并发问题是很难找到问题的,也摸不着头脑

虚拟线程执行器不能保证单个用户请求的有序性,因为如果使用者在不清楚逻辑的情况下,因为请求处理顺序出现的并发问题是很难找到问题的,也摸不着头脑

虚拟线程是 java 的知识,相关问题建议到相关社区学习与交流。

在不使用虚拟线程的时候,相同玩家的消息会放到同一个线程池里面处理,而这个线程池的设计是只有一个线程,相当于同一个玩家的消息会给同一个线程处理,那必然是有序的。但是在使用虚拟线程的时候,虚拟线程就不能保证有序了,虚拟线程在遇到io阻塞的时候会切换。虽然这是虚拟线程的问题,但是如果用户从17版本升级到21版本,在不了解其中原理的情况下就会踩坑。暂时想到的方法是用队列来保证消息顺序,类似akka的设计,队列中的消息,必须处理完一个才能拿下一个

没看懂你具体想要表达什么,如果是要普及虚拟线程的知识,建议去合适的地方普及,java 相关的知识不适合在这里讨论。

虽然这是虚拟线程的问题,但是如果用户从17版本升级到21版本,在不了解其中原理的情况下就会踩坑。

这里的从 17 版本升级到 21 版本,指的是 java17 到 java21 ,还是说 ioGame17 到 ioGame21。

如果是前者,那么从 java21 开始,虚拟线程的问题将会一直困扰着这些用户;因为是 java 支持了虚拟线程,所以这些问题与任何框架无关的。

如果指的是 ioGame17 到 ioGame21,可以细说是哪里有问题吗。或是说,是因为你在写业务的过程中使用了虚拟线程而引发了问题;如果是,这里建议你先不要使用虚拟线程。就像上面说的,使用虚拟线程出现的问题与任何框架无关。

如果上述两者都不是,你是想说 ioGame21 使用了虚拟线程来处理单个玩家请求是有问题的,存在有序性问题吗?如果是,通常是因为你没有阅读相关文档、没有阅读相关源码、没有实际运行就开始臆测了,建议先阅读 ioGame 线程相关的文档。

另外,如果是讨论 ioGame 相关的问题时,建议贴一些代码,不要用主观臆测来的方式来讨论。

抱歉,可能我描述的不太清楚。列如文档上的案例:

// 得到用户虚拟线程执行器
Executor virtualExecutor = flowContext.getVirtualExecutor();

virtualExecutor.execute(() -> {
... ... 业务逻辑 A
});

virtualExecutor.execute(() -> {
... ... 业务逻辑 B
});
使用虚拟线程执行器,执行AB两个业务,能保证B在A后执行吗,我对源码也理解的不深,所以不确定是否有问题。

我知道使用用户线程的时候,是能保证的,如:
// 得到用户线程执行器
Executor executor = flowContext.getExecutor();

executor.execute(() -> {
... ... 业务逻辑 A
});

executor.execute(() -> {
... ... 业务逻辑 B
});

// 得到用户虚拟线程执行器
Executor virtualExecutor = flowContext.getVirtualExecutor();

virtualExecutor.execute(() -> {
... ... 业务逻辑 A
});

virtualExecutor.execute(() -> {
... ... 业务逻辑 B
});
使用虚拟线程执行器,执行AB两个业务,能保证B在A后执行吗,我对源码也理解的不深,所以不确定是否有问题。

如果对虚拟线程不了解的,建议先不要使用虚拟线程。关于虚拟线程,建议先到 java 官网了解虚拟线程相关知识,那边的文档更权威、更全面。

另外,这里不讨论语言知识,因为不适合在这里讨论;这里更适合讨论与 ioGame 相关的内容,可以讨论如, flowContext 为什么要提供 flowContext.getVirtualExecutor() 方法。