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